在本节中,我们总结了各种技术,它们为用户构建起友好,安全和灵活的比特币钱包。
关于比特币的常见误解是,比特币钱包里含有比特币。 事实上,钱包里只含有密钥。 “币”被记录在比特币网络的区块链中。 用户使用钱包中的密钥签名交易,从而控制网络上的钱币。 某种意义上,比特币钱包是密钥链。
提示 比特币钱包只含有密钥,而不是币。 每个用户都有一个包含多个密钥的钱包。 钱包只包含私钥/公钥对的密钥链(请参阅第四章)。 用户用密钥签名交易,从而证明他们拥有这笔交易的输出(他们的钱币)。 钱币以交易输出的形式存储在区块链中(通常记为vout或txout)。
根据钱包包含的多个密钥之间是否有关系,主要分为两种类型:
第一种类型是非确定性钱包(nondeterministic wallet),其中每个密钥都是从随机数独立生成的。密钥彼此无关。这种钱包也被称为“Just a Bunch Of Keys(一堆密钥)”,简称JBOK钱包。
第二种类型是确定性钱包(deterministic wallet),其中所有的密钥都是从一个主密钥派生出来,这个主密钥即为种子(seed)。该类型钱包中所有密钥都相互关联,如果有原始种子,则可以再次生成全部密钥。确定性钱包中使用了许多不同的密钥推导方法。最常用的推导方法是使用树状结构,称为分层确定性(hierarchical deterministic)钱包或HD钱包。
确定性钱包由种子进行初始化的。为了便于使用,种子被编码为英文单词,也称为助记词(mnemonic code words)。
接下来的几节将深入介绍这些技术。
5.1.1非确定性(随机)钱包
在第一个比特币客户端中( 现在叫Bitcoin Core)中,钱包只是随机生成的私钥的集合。举个例子,Bitcoin Core客户端第一次启动时预先生成100个随机私钥,之后根据需要再生成足够多的密钥,并且每个密钥只使用一次。这种钱包现在正在被确定性钱包替换,因为它们难以管理、 备份以及导入。随机密钥的缺点就是如果你生成很多密钥,就必须保存它们所有的副本。这就意味着这个钱包必须频繁地备份。每一个密钥都必须备份,否则一旦钱包不可访问时,钱包所控制的资金就会无法挽回地丢失。这就与避免地址重复使用的原则相冲突:每个比特币地址只能用于一次交易。地址重复使用会把多个交易和地址关联在一起,会减少隐私。零型非确定性钱包不是好的选择,特别是要避免重复使用地址,因为要管理更多的密钥,还要更频繁地备份。虽然Bitcoin Core客户端包含0型钱包,但Bitcoin Core开发者并不鼓励大家使用。图5-1展示的是一个非确定性钱包,其含有的随机密钥是个松散的集合。
提示 除了简单的测试之外,任何场合都不鼓励使用非确定性钱包。 对于备份和使用来说太麻烦了。 相反,推荐使用基于行业标准的HD钱包,只需要备份种子助记词。
图5-1 0型非确定性(随机)钱包:随机钥匙的集合
5.1.2 确定性(基于种子)钱包
确定性,或者“基于种子”钱包包含的私钥都是使用相同种子,通过单向哈希函数衍生而来的。种子是随机生成的数字。还和别的数据,比如索引号码或者“链码”(参见“ 分层确定性钱包(BIP-32/BIP-44)”一节)结合起来派生私钥。在确定性钱包中,只需要种子就足够恢复所有的派生的私钥,所以只要在初始创建时,一个简单备份就足够。种子也足以用于钱包导入或者导出,允许在不同钱包实现之间轻松迁移所有用户密钥。图5-2展示了确定性钱包的逻辑图。
图5-2 1型确定性(基于种子钱包):从种子派生的密钥的确定性序列
5.1.3 分层确定性钱包(HD Wallets (BIP-32/BIP-44))
确定性钱包被开发成更容易从单个“种子”中生成许多密钥。确定性钱包的最高级形式是通过BIP-32标准定义的HD钱包。HD钱包包含的密钥以树状结构衍生,使得父密钥可以衍生一系列子密钥,每个子密钥又可以衍生出一系列孙密钥,以此类推,无限衍生。图5-3展示了这种树状结构。
图5-3 2型D钱包:从种子产生的密钥树
相比较随机(不确定性)密钥,HD钱包有两个主要的优势。第一,树状结构可以被用来表达附加的组织含义,比如子密钥的特定分支用来接收交易收入款项,另一个分支用来负责接收对外付款的找零。密钥的分支也可以用于公司设置,将不同的分支分配给部门、子公司、特定功能或会计类别。
HD钱包的第二个好处是,用户可以创建一系列公钥,而不需要访问对应的私钥。这样,HD钱包就能用在不安全的服务器上,或者仅作为接收用途,它为每个交易发布不同的公钥。公钥不需要被预先加载或者提前衍生,服务器也不需要有用来支付的私钥。
5.1.4 种子和助记词(BIP-39)
HD钱包具有管理多个密钥和多个地址的强大机制。如果将它们与一种标准化的方法相结合,从一系列英文单词创建种子,这些单词更易于转录、导出和跨钱包导入,那么它们将更加有用。 这些英文单词被称为助记词,标准由BIP-39定义。 今天,大多数比特币钱包(以及其他加密货币的钱包)使用此标准,使用可互操作的助记词导入和导出种子进行备份和恢复。
让我们从实际的角度来看以下哪些种子更容易转录,记录在纸上、无错拼读、导出导入到别的钱包:
16进制表示的确定性钱包的种子:
0C1E24E5917779D297E14D45F14E1A1A
12个单词的助记词表示的确定性钱包的种子:
army van defense carry jealous true
garbage claim echo media make crunch
5.1.5 钱包最佳实践
由于比特币钱包技术已经成熟,出现了一些常见的行业标准,使得比特币钱包具备广泛互操作,易于使用,安全和灵活的特性。这些常用的标准是:
- 助记码,基于BIP-39
- HD钱包,基于BIP-32
- 多用途HD钱包结构,基于BIP-43
- 多币种和多帐户钱包,基于BIP-44
这些标准可能会随着发展而改变或过时,但是现在它们形成了一套互锁技术,这些技术事实上已成为比特币的钱包标准。
这些标准已被软件和硬件比特币钱包广泛采用,使所有这些钱包实现互操作。用户导出在其中一个钱包上生成的助记词,再导入另一个钱包,就可以恢复所有交易,密钥和地址。
支持这些标准的软件钱包,有(按字母顺序排列)Breadwallet,Copay,Multibit HD和Mycelium。支持这些标准的硬件钱包,有(按字母顺序排列)Keepkey,Ledger和Trezor。
以下部分将详细介绍这些技术。
提示 如果您正准备实施一个比特币钱包,那么应该构建为一个HD钱包,遵循BIP-32,BIP-39,BIP-43和BIP-44标准,将种子编码为助记词用以备份,像下面章节会描述的。
5.1.6 使用比特币钱包
在之前的用户故事中,我们介绍了Gabriel,里约热内卢是一个有进取心的少年,他正在经营一家简单的网络商店,销售比特币品牌的T恤,咖啡杯和贴纸。
Gabriel使用图5-4的Trezor比特币硬件钱包来安全地管理他的比特币。 Trezor是一个简单的USB设备,具有两个按钮,用于存储密钥(以HD钱包的形式)和签署交易。 Trezor钱包遵循本章讨论的所有行业标准,因此Gabriel不依赖于任何专有技术或单一供应商解决方案。
图5-4 Trezor设备:比特币硬件HD钱包
当Gabriel首次使用Trezor时,设备从内置的硬件随机数生成器生成助记词和种子。 在钱包初始化阶段,屏幕上会按顺序逐个显示单词(见图5-5)。
图5-5 Trezor显示的其中一个助记词
写下这个助记词,Gabriel就创建了一个备份(参见表5-1),可以在Trezor设备丢失或损坏的情况下用于恢复。 记下来的助记词可以在新的Trezor钱包,或者任一种兼容的软件和硬件钱包进行恢复。 请注意,单词顺序非常重要,因此,助记词记录在纸上时,每个单词之间都要有空格。Gabriel必须仔细地把每个单词都记录在编号的空格里,以保持正确的顺序。
表5-1 Gabriel的助记器备份
1. army | 7. garbage |
2. van | 8. claim |
3. defense | 9. echo |
4. carry | 10. media |
5. jealous | 11. make |
6. true | 12. crunch |
提示 为了简单起见,表5-1显示了12个单词。 事实上,大多数硬件钱包生成更安全的24个词的助记符。 助记词使用的方式都是相同的,与长度无关。
作为网店的第一次实践,Gabriel使用他的Trezor设备生成一个比特币地址。 所有客户的订单都使用此单一地址。 我们将看到,这种方法有一些缺点,不过可以使用HD钱包进行改进。