作者:Anony
刚刚接触比特币和密码货币的人可能听说过这玩意儿需要使用一种叫做 “钱包” 的东西 [1] 来保管,但当他们开始搜索这方面的资料时,就会遇到许多不同的钱包概念,比如 “手机钱包”、“桌面钱包”、“软件钱包”、“硬件钱包”,等等。本文准备解释其中最重要的两个概念 “软件钱包” 和 “硬件钱包”。但在这个过程中,我们免不了要穿插钱包概念和用法的常识,请读者保持耐心,它们全都是必要的。
需要指出的的,本文介绍的主要是比特币钱包的相关特性,它跟其它密码货币有共性,但很少会完全相同,为安全考虑,请把它仅当成是比特币钱包概念的介绍。
什么是 “软件钱包”,什么是 “硬件钱包”?
顾名思义,软件钱包就是比特币钱包的软件实现,而硬件钱包则是实现了一些钱包功能的专用硬件,以无法联网、数据传输方式有限为基本特征。
按照这个分类,上文提到的 “手机钱包”、“桌面钱包” 乃至 “浏览器钱包”,都属于软件钱包,它们的特点是往往假设自身会运行在联网且通用的设备(比如手机和电脑)上,并提供了保管和转移比特币的完整功能。为什么要在这里强调是 “完整功能” 呢?因为,硬件钱包是无法提供 “完整” 的功能的,它们必须搭配软件钱包来使用。为什么?往下读。
软件钱包举例(非使用建议)(欢迎补充):
- 手机钱包:Blue Wallet
- 桌面钱包:Electrum,Sparrow Bitcoin Wallet
硬件钱包举例(非使用建议)(欢迎补充):
Keystone,Trezor
那么什么是比特币钱包呢?它包含哪些功能呢?
如果我们将 “比特币钱包” 解释为 “帮助用户保管比特币和收发比特币的工具” 的话,它需要具备如下功能才算是完整的:
- 存储私钥。
- 生成数字签名。
- 构造比特币交易。
- 跟比特币网络(中的某个节点)通信的能力。
为什么呢?因为比特币是一种电子化的货币,它是使用公私钥体系来实现产权登记 [2]、并使用一个专门的网络(比特币节点网络)来同步产权登记的。
对比特币网络而言,一笔比特币归属于一个确定的公钥(严格来说是一个脚本),持有这个公钥的私钥,才能为花费这笔钱的交易生成数字签名,才能花费这笔钱。所以钱包必须具备存储私钥的功能,否则它就无法帮你保管比特币了。最终来说,你的钱包保管的不是你的资金,而是能够花费一些资金的私钥。
第 2 项和第 3 项能力则关系到交易的发送,也即资金的转移。比特币交易有特定的格式,如果没有依据这些格式表达转账需要的能力,就无法转移资金了。数字签名也是交易有效性的前提。
第 4 项能力关系到交易的收发。再说一遍,钱包并不保管你的资金,它保管的是你的私钥。你肯定会问,那我的钱到底存在哪儿?答案是,各公钥名下有多少比特币的信息,在每一个全节点(运行比特币软件的联网计算机)上都有完整的副本(这就是区块链的作用)。你的软件钱包只需要跟一个比特币节点通信,报上公钥,就可以知道这个公钥名下有多少钱,相应地也就知道了自己(对应的私钥)可以动用多少钱,显示在界面上就是你的钱包余额。
“钱包” 这个词产生的最大误导就是让你以为你的比特币 “存在里面”,也就是如果你不能再使用这个设备和这个软件,你的钱就丢了。实际上并不如此。钱包存储的只是你的私钥,只要你备份了私钥,而且私钥也没有暴露,你的钱就不会丢。
这样一来,你是不是就能看出来为什么硬件钱包不是完整的钱包了?
没错,因为硬件钱包是专门设计成不联网的专用硬件,这意味着它天生就不能直接跟比特币节点通信,所以在这个意义上,它不是 “完整的钱包”。(也正因此,目前比特币社区的意见领袖们正号召大家改用 “签名器” 来称呼硬件钱包。)
同理,因为硬件钱包不能直接跟比特币节点通信,也即预设了自己要搭配某一些软件来使用,上述构造交易的能力也就成了多余,可以交给搭配使用的软件来实现。于是,硬件钱包就只留下了这些功能:
- 存储私钥。
- 生成数字签名。
- 解析比特币交易。
为什么还要有上面第 3 项的功能?往下读。
那硬件钱包不是很鸡肋吗?为什么我还要用硬件钱包呢?
非也非也。
从功能性上来说,硬件钱包(下文改称 “签名器”)不能提供更多的功能,还要依赖于软件钱包才能形成完整的工具,听起来是很鸡肋。但从安全性上来说,就不是如此。
签名器在安全性上有先天的优势,由于它不联网,就减少了远程攻击的界面;相比于时刻联网、通用的设备(手机和电脑),它被远程攻击窃取私钥的可能性就少了许多。此外,由于它是专门的设备,我们可以为之设计额外的安全措施,比如遇到暴力就自毁的机制,减少攻击者在得到签名器后暴力拆解、获取存储媒介并破解存储媒介的可能。
严格来说,签名器和软件钱包的安全性不能直接比较,实际上,我们所列举的这些优点,是不联网的设备对比联网设备的优点,是专业设备对比通用设备的优点。而运行软件钱包的设备也可以持续脱网,将它当成非专门设计的签名器来使用。因此,有人发明了一套对应的概念:“冷钱包” 和 “热钱包”,前者指的是不联网的钱包设备,后者是持续联网的钱包设备。大额资金应该使用前者来保管,小额、日常时候的资金可以使用后者来保管。按照这套定义,签名器一定是冷钱包,但软件钱包不一定是热钱包 —— 就看运行它的设备是持续联网还是一直脱网了。
重点是,搭配签名器和软件钱包,我们可以解锁一种高级的模式 —— 观察钱包。这种模式是说,软件钱包仅保管公钥而不保管私钥,私钥完全由签名器来保管(存储);软件钱包只需要公钥就可以收账和更新余额,需要发送交易的时候则由软件钱包构造交易并传递给签名器来签名;它既降低了远程攻击的风险,又照顾到了日常使用的便利性。你必须尝试使用观察钱包,才知道使用签名器的好处。
同理,这也是为什么签名器要保留解析比特币交易的能力。因为使用签名器的假设之一正是软件钱包(的前端)不是完全信得过的。换言之,当软件钱包显示你需要签名的是 A 交易时,实际上它交给你签名的可能是 B 交易,所以我们需要在签名器中保留解析待签名消息的能力,它使我们可以交叉验证。
上述思考也给了我们一些选择软件钱包和签名器的提示:请尽可能选择支持观察钱包功能的软件钱包!请尽可能选择可以为你呈现待签名消息的签名器!
你刚刚说签名器不能联网,那软件钱包怎么给签名器传递消息呢?
这要看签名器的硬件条件。
有一些签名器带有摄像头,因此可以通过扫描二维码的形式读取信息,这种是最方便的。在发送交易时,你只需要用软件钱包生成待签名交易(及其二维码表示),然后使用签名器扫码读取信息,完成签名后再用软件钱包设备扫描签名器的屏幕,即可将签好名的交易传递给软件钱包,并由后者发送到比特币网络中。
有一些签名器仅支持使用 microSD 卡传递数据。也就是说,当你使用软件钱包生成待签名交易后,需要先写入一个 microSD 卡,然后将卡插入签名器,完成签名后再拔出 microSD 卡,插回运行软件钱包的设备中并手动导入软件钱包。想也不用想,这种签名器更适合搭配桌面(电脑)钱包使用。
还有一些签名器支持使用 USB 数据线或者蓝牙连接,在搭配使用特定的桌面钱包或者手机钱包时可以自动化数据传输的过程,无需用户再手动导入数据和导出数据。
所以,在选择签名器时,也要考虑自己的使用环境和软件钱包搭配。与此同时,也要考虑便利性背后的风险。毕竟,可以通过 USB 连接执行的攻击,会比可以通过摄像头执行的攻击更多。这就是安全性和便利性的取舍了。
还有什么提醒吗?
请尽可能使用只支持比特币而不支持其它密码货币的软件钱包。
别误会,这不是什么比特币神教思想,它只是一种实用建议。无论你持有哪一种密码货币,我都建议你使用只支持这种密码货币(及其链上 资产/应用)的软件钱包来保管这种密码货币。比特币如此,其它密码货币也是如此。因为不同的链各有不同的特点,需要开发团队专心钻研才能给用户提供足够好的产品,一个支持许多种密码货币的软件钱包,可能对每一种密码货币的支持都很有限、都很粗糙。
笔者就曾经接触过一款桌面钱包,大而全地支持了数十种密码货币,但其比特币模块却不告诉你使用了哪种地址格式,也无法随意生成和切换比特币地址 —— 也就是开发团队对比特币钱包的行业标准根本一无所知;后来该钱包也在某个著名的停机链的一次著名风波中曝出有安全风险。
举个例子吧,比特币社区重视隐私性,鉴于区块链将资金流转记录永久保存的特性,大家认为,重复使用同一个地址(公钥)会导致许多财务记录累积在一个地址中,使地址所有者更容易暴露自己的真实身份,因此,避免地址复用就成了优化隐私性的基本要求。但是,要想避免地址复用,就需要有大量的私钥和公钥可用 —— 而使用大量互不关联的私钥又对用户备份私钥形成了挑战(你要备份许多个私钥)。那么比特币钱包行业是如何解决这个问题的呢?大家提出了 BIP32 分层确定式钱包标准,其思想是,我们可以使用一个随机数作为元数据,加入额外的信息来生成大量的私钥(以及对应的公钥和地址),由此,用户一方面有了大量的地址可用,可以随时切换,另一方面,也只需要备份最初的那个随机数,因为那些额外的信息是有序的,只要备份了最初那个随机数就可以很容易恢复出下面的所有私钥。最初那个随机数被称为 “种子词”,而那些额外的信息叫做 “派生路径”。
BIP32 是比特币钱包的行业标准,几乎所有专门的比特币钱包都支持这个标准,支持这个标准的钱包都会在你收账和找零时自动生成和使用新的地址;但它并不是其他密码货币的钱包行业普遍遵循的标准。如果你使用的是不支持 BIP32 的钱包,你就默认放弃了比特币的技术特性和行业积累为你提供的隐私性保护,同时你也默认放弃了持有比特币(而非其它密码货币)可以获得的一些好处。这是何必呢?
结语
综上,软件钱包和签名器,并不是竞争关系,它们无法相互替代。相反,它们是分工合作的关系,各有长处,也各有优化方向。
尾注
[1]:已经有人正确地指出,使用 “钱包” 一词来形容这种工具,只是一种方便的比喻,并不是完全准确的,见:https://www.btcstudy.org/2022/07/19/the-words-we-use-in-bitcoin/ 。但在这里我依然使用这个词语,因为它依然是读者能搜索出最多资料,因此也最需要解释的东西。
[2]:想必有读者会好奇这是怎么回事。这里需要解释的是一种叫做 “数字签名” 的技术。使用这类技术,你可以使用一串随机数(称为 “私钥”)生成另一串随机数(称为 “公钥”),从此只需要向他人展示公钥,就可以用一段数据(称为 “数字签名”)向他人证明你持有这个公钥的私钥(因为这个签名只有知晓那个私钥才能计算出来),而且他人无法从公钥和签名中推导出你的私钥。你可以想象,由于签名不可伪造,公钥可以成为某种意义上的 “身份”,而私钥则是使用这个身份的 “凭证”;身份能做的事情有很多,持有资金就是一种。比特币的所有权背后的想法就是如此:比特币资金登记在公钥名下,知晓这个公钥的私钥是花费这些比特币的充分必要条件 —— 不知道这个私钥你就花不了,知道这个私钥你就能花 —— 具体的操作就是为比特币交易生成数字签名(证明你知晓某一个私钥)。这也是为什么私钥绝对不可以暴露,因为公钥就是使用私钥推导出来的,他人一旦知道了你的私钥,也就知道了你有多少资金,同时知道了怎么花费这些资金,就可以把你的钱全部转走了。