分层确定性钱包使用 CKD(child key derivation)方程去从母密钥衍生出子密钥。
子密钥衍生方程是基于单项哈希方程。这个方程结合了:
· 一个母私钥或者公共钥匙(ECDSA 未压缩键)
· 一个叫做链码(256 bits)的种子
· 一个索引号(32 bits)
图 4-11
链码是用来给这个过程引入看似的随机数据的,使得索引不能充分衍生其他的子密钥。因此,有了子密钥并不能让它发现自己的相似子密钥,除非你已经有了链码。最初的链码种子(在密码树的根部)是用随机数据构成的,随后链码从各自的母链码中衍生出来。
这三个项目相结合并散列可以生成子密钥,如下。
母公共钥匙——链码——以及索引号合并在一起并且用 HMAC-SHA512 方程散列之后可以产生 512 位的散列。所得的散列可被拆分为两部分。散列 右半部分的 256 位产出可以给子链当链码。左半部分 256 位散列以及索引码被加载在母私钥上来衍生子私钥。在图 4-11 中,我们看到这种这个说明——索引 集被设为 0 去生产母密钥的第 0 个子密钥(第一个通过索引)。
图 4-11 延长母私钥去创造子私钥改变索引可以让我们延长母密钥以及创造序列中的其他子密钥。比如子 0,子 1, 子 2 等等。每一个母密钥可以右 20 亿个子密钥。
向密码树下一层重复这个过程,每个子密钥可以依次成为母密钥继续创造它自己的子密钥,直到无限代。