术语表 /钱包与托管
HD 钱包种子
又称根种子。
- HD 钱包种子是什么?
- HD 钱包种子是一个原始二进制数,长度为128至512位,BIP-32将其输入一次哈希运算,生成钱包的主密钥和链码。
规定于 BIP-32。
钱包之所以谈论单词,是因为人们可以手抄单词,但 BIP-32从不接触单词。它读取一个字节串,并通过一次 HMAC-SHA512 运算生成主密钥,所用密钥是固定文本 "Bitcoin seed"。单词只是该字节串的一种常见编码方式,并非唯一的编码方式。
运作方式
BIP-32规定种子长度介于128位和512位之间,推荐256位,对这些比特从何而来则不作任何说明。种子作为消息输入 HMAC-SHA512,ASCII 字符串 "Bitcoin seed" 作为密钥。该函数返回64个字节。左侧的32个字节成为主私钥;右侧的32个字节成为主链码,即防止泄露的子密钥暴露其同级密钥的额外秘密。钱包中的其他一切,包括每个账户、每个地址、每个找零输出,都是通过重复类似的哈希运算并带上索引号,从这一对数据派生而来。
规范中包含一种在实践中从未出现的边缘情况。如果左侧的这32个字节结果为零,或者其值等于或大于 secp256k1 曲线的阶,则该种子无效,钱包必须重新尝试。其概率约为2的127次方分之一,因此没有任何实现报告过遇到这种情况。
这些比特从何而来属于另一层,答案有若干种。BIP-39通过 PBKDF2 处理助记词,始终恰好输出512位。Electrum 用不同的盐值通过 PBKDF2 处理自己的助记词,得到的种子无法由任何 BIP-39工具根据相同的单词复现。钱包也可以直接从硬件随机数发生器获取256位,完全不显示助记词,Bitcoin Core 就是这样做的。
转换的方向很重要。单词可以变成种子,种子却无法变回单词。钱包一旦只保留原始数值,任何软件都无法为其打印出助记词,因此导出“种子”不能替代保管生成它的助记词。
在哪里会遇到它
向 Bitcoin Core 查询某个钱包时,它报告的是 hdseedid,即种子的指纹,而不是任何助记词,因为 Core 从未实现 BIP-39。sethdseed RPC 在0.17.0版本中加入,可以将指定的种子写入传统钱包,描述符钱包则在 Bitcoin Core 23.0中成为新建钱包的默认类型。
开发者文档是它公开出现的另一个地方。BIP-32和 BIP-39都发布了测试向量,将种子显示为128个十六进制字符,并与生成它的助记词并列,这是说明两者是不同对象的最清楚的例证。
这一区别在实践中的影响,出现在不同工具之间迁移的时候。一些钱包和规范,包括 Coldcard 的种子备份和各种开发者工具,导入或导出的是原始数值而不是单词。把原始种子交给期望助记词的工具,或者反过来,会导致报错,更糟的是会得到一个有效但为空的钱包。向某个字段粘贴任何内容之前,请先确认该字段要求的是哪一层。
HD 钱包种子 vs 助记词
种子是一个数;助记词是把这个数写下来的一种方式。把两者区分开,可以解释几件原本看似神奇的事。这就是为什么添加可选的密码短语会改变种子,而您的单词保持不变。这也是为什么 Electrum 的助记词和 BIP-39的助记词可以同为十二个英文单词,却打开不同的钱包。同样,宣称支持“种子导入”的钱包,所指可能是助记词、十六进制字符串或扩展私钥,这三种输入只是共用一个叫法,其他方面毫无共同之处。