BIP-80 给普通投票池排了四层派生路径,《把大部分存款冻在冷钱包里:BIP-80 给投票池多签钱包排的先进先出路径》 讲过它的批次号那一层。BIP-81 是它的姊妹提案,同样由 Justus Ranvier 和 Jimmy Song 在 2014 年 8 月起草、状态 Closed,区别在于它服务的是彩色币投票池——要同时管住很多种”上了色的币”。彩色币是在比特币上给某些聪赋予额外含义的做法,给一聪比特币染个色:彩色币如何把现实资产搬上比特币账本 讲过它把现实资产搬上比特币账本的思路。要在一条派生路径里把成百上千种颜色定义都安置好,BIP-81 被逼出了一个少见的结构:把一种颜色的身份拆进五层派生。
八层路径的整体结构
BIP-81 定义的 BIP-32 路径写成 m / 目的号' / 批次号' / 五级颜色定义 / 地址序号,一共八层。目的号是固定常数:按 BIP-43 约定取字符串 “81” 的 ASCII 值再置最高位表示硬化,等于 0x80000051,作用是在同一把种子下和 《把大部分存款冻在冷钱包里:BIP-80 给投票池多签钱包排的先进先出路径》 里 “80” 那棵子树彻底分开。目的号和批次号用硬化派生,五级颜色定义和末尾的地址序号用公开派生——这一点后面要专门讲。
为什么颜色定义要占五层
症结在 BIP-32 的一个硬限制:每一层派生只能用 4 字节、也就是 32 位的索引。要给每一种颜色一个能唯一区分、又不互相撞号的索引,32 位不够用——颜色定义太多,随便一塞就有碰撞风险。BIP-81 的解法是不再”用索引去编号颜色”,而是”把颜色本身折进索引”。具体做法:彩色币的颜色定义先经比特币的 hash160 压成 20 字节;把这 20 字节按小端顺序切成五组;每组当成一层的派生索引,于是五种颜色定义的身份被摊进连续五个派生层。这样两种不同颜色,只要哈希不同,就会在五层路径上体现为不同的分量,碰撞概率取决于整段 160 位摘要,而不再是某一层 32 位的小窗口。
破例用公开派生的原因
常规建议里,越靠近身份根部的派生越倾向用硬化,好让拿到扩展公钥的人无法反推子私钥。BIP-81 在颜色定义这五层却明确用公开派生,即便某段的索引数值超过了 2 的 31 次方这个通常被当成硬化边界的界线,也照样公开派生。原因在于这五层承载的不是”账户秘密”,而是”颜色身份”的公开指纹:它由颜色定义哈希而来,本来就是可从链上推出的公开信息,用公开派生能让钱包只凭扩展公钥就为任意一种颜色算出对应的收款公钥,无需带着私钥。末尾的地址序号同样公开派生,和 BIP-80 一样,这一层的公钥按成员间带外约定的规则拼成多签存入脚本。
两份投票池提案的共同命运
BIP-80 与 BIP-81 都停在 Closed:它们太垂直,投票池加彩色币是 2014 年前后那波资产上链实验的产物,等彩色币主流化没成、投票池也没标准化,这两套精巧的派生层就失去了采用者,参考实现同样只点到 btcwallet 一个。但 BIP-81 的思路本身值得单独记住——当你需要把一类”数量远超单层索引容量”的身份编码进 HD 钱包树,五层拆分 160 位哈希这个手法,是一种被真实提案用过、能绕开 32 位天花板的通用技巧,派生路径还能长出新的一层:BIP-83 用 0 号子节点预留的嵌套规则 讲的 BIP-83 靠预留 0 号子节点在路径里多挂出一层,两者面对的是同一类约束:一层索引装不下要表达的信息,只是拆法不同。
走一遍:某种颜色怎么落到路径上
假设某条彩色币的颜色定义经 hash160 得到 20 字节摘要,按小端切成五段四字节整数,比如依次落进第 3 到第 7 层的索引位,那么这一种颜色在这一批次下的收款公钥链,就是从 m / 目的号' / 批次号' / 第一段 / 第二段 / 第三段 / 第四段 / 第五段 / 0、1、2… 一路公开派生出来的。任何人拿到根扩展公钥,对着链上那个颜色定义的哈希重复同样的切分,就能独立推出同一串公钥——这正是它用公开派生的底气:颜色身份不是秘密,验证人人可为。反过来说,切分规则、字节序、哈希函数任何一处与提案不一致,推出的就是另一棵树;这类”规则文本很短、实现极易跑偏”的提案,也正是它没能积累出多家兼容实现的原因之一。
风险提示:本文描述派生路径机制与提案历史,不构成投资建议;彩色币与投票池都是特定历史场景的产物,用于真实资产前须核验当前工具是否仍支持相应路径约定。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。