术语表 /地址与密钥
父密钥
又称 Parent key、父公钥、父私钥、Parent public key。
- 父密钥是什么?
- 父密钥是 HD 钱包密钥树中位于另一个密钥正上一级的密钥,每个扩展密钥都带有四个字节,这四个字节就是其自身父密钥的指纹。
规定于 BIP-32。
在 BIP-32中,父子关系是一种关联,而不是一种等级。主密钥是唯一没有父密钥的密钥,它以四个零字节的父指纹和0的深度来记录这一点。其他所有密钥都在自身序列化数据的起始字节中指明其父密钥,软件正是据此判断一个游离的密钥应归属何处。
运作方式
父密钥通过指纹而不是密钥本身来标识。取父密钥的压缩公钥,先用 SHA-256再用 RIPEMD-160对其做哈希,保留结果的前四个字节。这四个字节位于子密钥的78字节扩展密钥中的固定位置,紧跟在深度字节之后、子索引之前。
四个字节共有4,294,967,296种可能的取值,因此指纹只是一个标签,而不是一种证明。BIP-32明确指出指纹可能发生碰撞,实现方不得依赖指纹来保障安全。指纹的作用是让钱包能够快速把密钥归入正确的密钥树,任何真正的核验都需要推导出该密钥并比对结果。
父密钥还提供推导所需的两个要素:其链码和其密钥材料。因此扩展密钥是成对传递的。只把父公钥交给他人而不附链码,就根本无法据此计算出任何子密钥。
在哪里会遇到它
主密钥的指纹是最常遇到的标识符,因为输出脚本描述符和签名设备都会引用它。
输出脚本描述符把它写在扩展密钥前面的方括号中,例如 wpkh([1a2b3c4d/84h/0h/0h]xpub.../0/*)。方括号内的部分说明该密钥来自哪个钱包以及经由哪条路径,因此读取描述符的签名方可以判断自己被要求使用的是否确实是其持有的密钥。BIP-174规定的部分签名比特币交易为每个输入和输出携带相同的对应关系,硬件钱包因此能在离线状态下判断某个输出是它自己的找零,而不是陌生人的地址。
到了多重签名场景,这就不再是琐碎的细节。在 Sparrow 中,2-of-3的配置会为每个共同签名方显示一个主指纹,日后重建该钱包除了助记词之外,还需要全部三个扩展公钥。把每台设备的指纹写在其备份卡上,是多年后区分三张外观相同的助记词卡的最省事办法,而跳过这一步的人曾花费整个周末推导密钥,才弄清哪张卡属于哪台设备。
最后一点实用提示。恢复后的钱包显示陌生的指纹,通常不是备份损坏,而是密码短语输入有误。BIP-39密码短语会生成不同的主密钥,因此指纹也不同,所以在查看余额之前,比对这个简短的值是确认密码短语输入正确的快速而安全的办法。