术语表 /地址与密钥
BIP-84派生
- BIP-84派生是什么?
- BIP-84派生是一种将 BIP-32路径的 purpose 层级设为84' 的方案,因此同一助记词可通过 BIP-141中的 P2WPKH 封装生成原生 SegWit 的 bc1q 地址。
规定于 BIP-84。
BIP-84沿用 BIP-44的五层结构,只改变 purpose 的取值。它于2017年12月28日分配,并为每个账户配以版本字节为0x04b24746 的 zpub 扩展密钥。对您而言,它决定了恢复出的助记词能否找到您的 bc1q 余额,还是显示为空钱包。
运作方式
BIP-84做了两件事,第一件是在路径中固定一个数字。密钥挂在 BIP-44引入的框架之下,写作 m / purpose' / coin_type' / account' / change / address_index,本规范只将 purpose 这一层据为己有,固定为84'。币种类型、账户、找零和地址索引保持 BIP-44和 BIP-49已赋予的含义,作者 Pavol Rusnak 明确沿用了 BIP-49的设计理由,而没有重新阐述。
第二件是输出格式。BIP-84借用了 BIP-141的封装:scriptPubKey 为0x0014 后接公钥的20字节哈希,scriptSig 留空,见证数据依次包含签名和公钥。该输出中没有任何记录说明它由哪个 purpose 值生成。
该分支上的扩展密钥有各自的版本字节。公钥使用0x04b24746,显示为 zpub,私钥使用0x04b2430c,显示为 zprv,测试网则使用0x045f1cf6 和0x045f18bc,分别显示为 vpub 和 vprv。这些值并非比特币独有。收录这些值的登记表 SLIP-0132将 Groestlcoin 和 Syscoin 也列在同一个0x04b24746 之下,因为序列化格式中没有币种类型字段,所以 zpub 只能告诉您脚本类型,无法说明它属于哪条链。
该规范称自己 "not backwards compatible by design"(设计上不向后兼容),并称不兼容的钱包 "will not discover accounts at all"(根本发现不了这些账户)。这是有意为之。单独的 purpose 值可使 SegWit 出现之前编写的软件不会进入它处理不好的账户,余额显示为零,好过钱包悄无声息地只恢复一部分。
在哪里会遇到它
BIP-84出现在您的钱包本来就会显示的三个地方:账户路径 m/84'/0'/0',以 zpub 开头的扩展密钥,以及以 bc1q 开头的收款地址。SLIP-0132将比特币的这一行 zpub 与路径 m/84'/0' 配对,这正是应用向您提供 zpub 时所主张的对应关系。Sparrow 在本站评测中的评分为4.7,支持常见脚本类型的单签名和多重签名钱包,因此您打开的账户是自己选择的,而不是沿袭而来的默认设置。
该文档中值得借鉴的是它的测试向量部分,它把“这个钱包是否和其他钱包一样实现了 BIP-84”变成一分钟就能完成的检查。该 BIP 公布了助记词 "abandon" 重复十一次、最后接 "about" 的结果:
- m/84'/0'/0'/0/0得到 bc1qcr8te4kr609gcawutmrza0j4xv80jy8z306fyu
- m/84'/0'/0'/0/1得到 bc1qnjg0jd8228aq7egyzacy8cys3knf9xvrerkf9g
- m/84'/0'/0'/1/0得到 bc1q8c6fshw2dlwun7ekn9qwf37cu2rn755upcp6el
请在没有存放任何币的设备上,将这组助记词载入不熟悉的软件,选择原生 SegWit,然后将第一个收款地址和第一个找零地址与上述字符串比对。两者都一致,说明该实现在找零分支上也与标准相符,而这恰恰是人们容易忘记检查的一半。切勿向这些地址转入任何资产:该 BIP 印出了对应的私钥,SLIP-0132也印出了同一组助记词,任何读过其中一份文档的人都可以花掉转入的资金。
BIP-84派生 vs P2WPKH
BIP-84派生说明密钥从何而来,P2WPKH 说明币如何被锁定。只有后者属于共识规则。钱包完全可以沿着不含84' 的路径派生密钥,用同样的0x0014 模式锁定输出,得到的 bc1q 地址在链上与您的地址无法区分。因此“BIP-84地址”只是一种简称,任何区块浏览器都无法据此下结论,而 purpose 值需要您记在备份笔记里,因为日后无法从区块链上读回。