BIP44 之 xpub 和 hardened key 推导注意事项
这篇文章对整合加密货币钱包的业务系统过程中给用户分配钱包地址开发非常有帮助。
讨论 BIP44 之前先放个地图炮,现有的公链中百分之九十九都没有存在的意义,尤其是国产公链。
BIP44 是基于 BIP32(确定分层钱包) 和 BIP43(把 BIP32 第一层定义为某种推导 schemes 方案)。也就是说 BIP32 的第一层推导的索引在 BIP43 看来是有特定意义(目的)的,而 BIP44 就是第一层索引为 44' 的具体表现。再通俗一点解释就是:在第一层推导中,位于 0' 之后的推导及它们推导出来的子子孙孙都可以称为遵循 BIP44 协议的钱包,而第一层 0' 同层之后每增加一位分别代表特定约束的增强推导钱包 (hardened key),其中第一层 44' 表示 BIP43 约束定义的多账户分层确定性钱包:
m / 44' / coin_type' / account' / change / address_index
解释一下第一,二,三,四,五层在遵循 BIP44 协议时所表示的意义。
- (44') 表示 BIP43 中的 purpose,44' 表示这是遵循 BIP44 协议推导的钱包
- (coin_type') 第二层表示不同公链 (标示列表在这里)。这个特性结合 BIP39 ,可以做到一套助记词推导多链钱包。
- (account') 第三层还是从增强推导开始,用以在业务上给钱包分类。譬如对于个人来说可以分为接收捐款钱包或者从交易所提币钱包,这样的场景感觉实际上没啥用;还有一种场景是企业根据这个给不同团队分配地址,例如在第三层使用 0' 推导出来的钱包给交易所团队用,使用 1' 推导的钱包给矿池团队用。。。「老板的生意做这么大了?哈哈哈」
- (change) 第四层定义对内钱包还是对外钱包,分别用 1 和 0 表示。举一个使用场景:用 0 推导的地址用来收款,用 1 推导的地址用来付款找零。尤其注意的是,第四层 (0 和 1)不是增强推导,所以这层通过 xpub 推导,所以在第四层开始,推导仅需通过 xpub 不暴露私钥的情况下推导。使用 xpub 推导钱包在业务系统中可以不依赖私钥直接分配收款地址。《精通比特币》里有个范例说明:using an extended public key on a web store
- (index) 这个没啥可说的,从零开始,也就是可以通过 xpub 推导。
在 BIP44 协议中,前三层推导是增强推导(Hardened derivation),意味前三层推导不能仅使用 xpub 而不暴露私钥的情况下在业务系统中给用户分配钱包地址。可以通过 master private key 推导前三层之后导出 xpub 保存在数据库中用以推导和分配地址(“只读地址”)而不暴露私钥。