术语表 /地址与密钥
HD 钱包
又称 HD 协议、分层确定性钱包、BIP32。
- HD 钱包是什么?
- HD 钱包由单个随机种子生成其所需的全部密钥,这些密钥按照 BIP-32于2012年规定的父子树结构排列。
规定于 BIP-32。
一个种子生成一个主密钥,主密钥生成各个分支,分支再生成您使用的每一个地址。BIP-32于2012年2月11日分配编号,如今发行的各类硬件钱包、手机钱包和桌面钱包,实际上几乎都遵循该标准。因此,一张卡片上的十二个单词,就能恢复一个您已使用十年的钱包。
运作方式
HD 钱包通过反复运行带密钥的哈希,把一个数字变成一个层级结构。种子与固定的密钥字符串 "Bitcoin seed" 一起输入 HMAC-SHA512,得到64字节:左边的32字节成为主私钥,右边的32字节成为主链码。这一对数据是其下一切内容的根。
之后的每一步都取一个密钥、它的链码和一个索引号,以同样的方式进行哈希,得到一个带有自身链码的子密钥。每个节点有4,294,967,296个可能的子节点,分为两半:索引低于2,147,483,648的为普通索引,仅凭公钥一侧即可推算;索引等于或高于该界线的为强化索引,需要私钥。重复这一步骤就构成一棵树,而这棵树中的一个位置写作派生路径。
确定性是这一设计的价值所在。同一个种子交给任何正确的实现,永远会按同样的顺序生成完全相同的密钥。密钥从不被存储,只会被重新计算,因此备份是一句话,而不是一个每次收款都会变大的文件。
助记词是单独的一层,混淆这两层是大多数恢复问题的根源。BIP-39规定了如何把取自2,048个单词的词表的一组短语变成种子:通过 PBKDF2 配合 HMAC-SHA512 对其进行拉伸,迭代2,048次,并以字符串 "mnemonic" 加上可选的密码短语作为盐。BIP-32对单词一无所知,BIP-39对树一无所知。两者靠约定衔接,所以两个钱包可能认同您的助记词,却对您的地址各执一词。
Bitcoin Core 自版本0.16.0起只创建分层确定性钱包。在此之前,钱包持有一池互不相关的随机密钥,一旦密钥池用到备份之后,备份就失效了。
购买比特币时为何重要
您在设置钱包时写下的助记词,是您与您将来购买的每一枚比特币之间唯一的屏障,而树状结构正是这一说法成立的原因。
备份一次,备份就始终完整。从交易所向一百个新地址提币一百次,这些地址都是同一个根的后代,因此您之后的任何操作都不会扩大需要保护的内容。这是自第一个客户端发布以来,比特币托管方面最大的实际改进;同样,这也是助记词只要被拍过一次照片就永久泄露的原因:照片涵盖了您尚未购买的比特币。
可移植性是第二个好处,但有一个前提。写在 Trezor 或 Ledger 上的助记词,可以恢复到 Sparrow、Electrum 或 BlueWallet 中,因为它们都实现了同一个标准。问题出在路径上。BIP-44生成以1开头的地址,BIP-49生成以3开头的地址,BIP-84生成以 bc1q 开头的地址,BIP-86生成以 bc1p 开头的地址,全都来自相同的单词。若恢复到默认使用另一种用途的软件中,余额会显示为零,而比特币其实原封不动地留在另一个分支上。把派生路径记在备份旁边,并且除此之外不记任何其他内容,可以避免这种慌乱。
第三件值得了解的事是间隔上限(gap limit)。恢复后的钱包会按 BIP-44向前扫描20个未使用的地址,然后停止查找。在一个从未备份的钱包上点击四十次收款按钮,再使用最后一个地址,就很容易导致恢复后余额显示为空。
逐级解读 m/84'/0'/0'/0/0
派生路径的作用类似邮寄地址,每一级都缩小范围。请从左到右阅读标准的原生 SegWit 路径。
- m 是由您的种子派生出的主密钥。
- 84' 选择 BIP-84用途,它生成以 bc1q 开头的原生 SegWit 地址。撇号表示该级为强化派生。
- 0' 是币种类型,0表示比特币主网。测试网则是1'。
- 0' 是账户,因此为企业另设的账户会是1'。
- 0是链:0用于对外提供的地址,1用于找零。
- 0是地址索引,每收到一笔付款就递增。
前三级是强化派生,后两级不是,这是有意为之。正是这种划分,使账户级扩展公钥可以导出到仅观察钱包,该钱包可以生成收款地址和找零地址,却永远无法触及同级的其他账户,也无法向上回溯到主密钥。
HD 钱包 vs 助记词
HD 钱包是一种派生方案;助记词是写下其起始数字的一种方式。BIP-32规定了这棵树,接受128至512位的任意种子,并推荐256位。BIP-39规定了单词。Electrum 自带一种互不兼容的助记词格式,却依然完全属于分层确定性钱包,这说明这两层确实相互独立。当某款软件声称支持 BIP-39恢复时,这一区别就很重要:这只是对读取您的单词所作的承诺,并不涉及之后它会在哪个分支上查找。
HD 钱包 vs 派生路径
HD 钱包是整棵树;派生路径是穿过这棵树的一条路线。人们把钱包称为“BIP-84钱包”,仿佛这是一个产品类别,但任何 BIP-32钱包都可以走任意路径,而且多数当前的软件都能用同一个种子显示不同用途下的多个账户。请把路径当作与备份一并记录的坐标,而不要把它看作您碰巧安装的某个应用的属性。