术语表 /地址与密钥
密钥指纹
- 密钥指纹是什么?
- 密钥指纹是公钥的 Hash160 的前32位,以八个十六进制字符表示,钱包用它来标明某条派生路径从哪个密钥开始。
规定于 BIP-32。
指纹是密钥的固定宽度标签,其宽度是格式的一部分,而不是显示上的选择。BIP-380要求描述符方括号内必须恰好有8个十六进制字符,其自带的测试向量会拒绝七个字符的指纹、九个字符的指纹,以及含有十六进制范围之外字母的指纹。当钱包拒绝导入您的描述符时,请先数一数该字段的字符数。
运作方式
BIP-32赋予扩展密钥两种长度不同的标识,指纹是其中较短的一种。标识符是序列化公钥的 Hash160,即在 SHA-256之上再做 RIPEMD-160,链码不计入,该标识符的前32位才被称为指纹。其余128位并未被丢弃:BIP-32指出,完整的160位标识符可在内部使用,而短格式只是用来快速识别父节点和子节点的方法,因此软件必须准备好处理碰撞。
指纹字段与其所在密钥之间保持一致,是一条有效性规则,而不是一种惯例。主密钥没有父密钥,在父指纹字段中写入0x00000000,而 BIP-32的第五个测试向量(涵盖必须被识别为无效的密钥)列出了深度为零但父指纹不为零的 xprv 和 xpub 各一个。若软件导入这两个字符串中的任何一个而不报错,就说明它没有遵循该规范,这一点值得在把恢复工作交给它之前了解。
在哪里会遇到它
密钥指纹主要出现在两种机器可读格式中,即输出脚本描述符和部分签名比特币交易,在这两种格式里,它都紧挨在派生路径之前。
BIP-380把密钥来源信息放在密钥之前的方括号内,并对宽度要求严格:恰好8个十六进制字符,其后是硬化步骤和非硬化步骤。其无效表达式列表列出了该字段的三种错误:七个字符的 deadbef、九个字符的 deadbeeef,以及以非十六进制数字的字母开头的 gaaaaaaa。这三种都会被直接拒绝,因此指纹输错只会导致导入报错,而不会让钱包悄悄监视错误的分支。
BIP-174把4字节的指纹与一条路径配对,路径写作32位小端整数,对于全局扩展公钥条目,这些整数的个数必须与 xpub 自身声明的深度一致。有了这个个数,签名方就能把所给路径与收到的密钥对照起来,而不必轻信标签。
在设备屏幕上,这同样的八个字符回答一个问题:这是哪一个种子。它们不会泄露任何可花费的内容,因为截断后的哈希无法还原成密钥或地址。但它们仍然是标识符,所以两个描述符带有相同的八个字符,就等于这两个分支之间有一条可见的关联。
密钥指纹 vs 比特币地址
密钥指纹和比特币地址始于同一个哈希,此后便不再具有可比性。BIP-32指出,扩展密钥的标识符与传统比特币地址所用的数据完全对应,随后建议不要用 base58 书写该标识符,因为它会被当作地址,而钱包软件并无义务接受向链密钥本身的付款。指纹保留标识符20字节中的4字节,并以普通十六进制书写,因此太短,即便出于偶然也不会被误认为付款目的地。描述符中的八个十六进制字符说明路径从哪个密钥开始;地址则说明资金可以流向何处。