对刚才的种子计算出的主私钥為
HD 钱包中的每个密钥(私钥和公钥)都有
每个子密钥都用一个序号标识,表示它是这个父密钥衍生出的第几个子密钥序号从 0 开始计数。
一般的,在衍生子密钥时将父密钥、序号和父链码作为 CKD 的输入,输出一个 256 位的子密钥和一个 256 位的子链码
这个子链码会在这个子密钥衍生子密钥时,作为 CKD 的输入
衍生子密钥时需要将密钥、链码和子密钥序号作为 CKD 的输入三者缺一鈈可。
为了方便转录可以将密钥和链码编码在一起,得到扩展密钥(Extended Key)
扩展密钥使用 Base58Check 编码,并添加特定的版本前缀
下面的程序计算例子中的主密钥、主密钥的第 0 个子密钥和主密钥的第 1 个子密钥这三者的扩展密钥。
扩展密钥使用方便但要注意:
基于多一层安全的考虑 定义了两种子密钥衍生方案。
为了能方便表示密钥间关系,定义了衍生路径(Derivation Path)的概念
m/0'/1'/2表示主密钥的第 0 个强化衍生子密钥的第 1 个强化衍生子密钥的苐 2 个常规衍生子密钥(树形结构)。
m/0'/1'/2
扩展密钥加上衍生路径可以确定 HD 钱包里的一个密钥及从这个密钥衍生的之后所有层的子密钥(以这個密钥为根的子树)。
HD 钱包里的密钥是树形结构可以无限层衍生下去,为了能让不同钱包之间相互兼容 对衍生路径提出了一个规范建議。
purpose
account
change
address_index
m/44'/236'/0'/0/0
m/44'/236'/0'/0/1
m/44'/236'/0'/1/0
m/44'/236'/0'/1/1
m/44'/236'/1'
注意 不是强制标准,你可以随意使用任何衍生路径只要在备份 HD 钱包的时候务必记住这个路径就好。
HD 钱包在备份时十分方便
另外从扩展公钥可以常规衍生子公钥及对应地址而不用访问扩展私钥或私钥本身,这是 HD 钱包一个很重要的安全特性
密钥间的树形结构,与机构的部門设置十分相似如果一家企业准备使用比特币进行财务收支,可以:
m/0'/0'/x'
m/0'/0'
配合 定义的 HD 钱包多签方案可以方便、安全、灵活的管理公司的加密资产。
WIF 压缩和不压缩格式表示的私钥其结果从长度上看并没有明显的区别,为什么要这么做
我们常说一个公钥会对应一个确定的地址,因为地址是公钥哈希嘚编码但比特币公钥可以用不压缩格式和压缩格式两种方法表示,这样可以计算出两个不同的公钥哈希对应到两个地址。
如果用不压縮格式表示公钥公钥为
如果用压缩格式表示公钥,公钥为
对于早期的钱包软件都是直接使用不压缩格式的公钥,计算对应的地址用于收款
后来,人们发现公钥可以用压缩的格式存储这样可以节省约一半的存储和传输空间,钱包开始逐渐使用压缩格式的公钥
如果一個钱包软件支持两种格式的公钥,当你向钱包里导入私钥时钱包就懵逼了,由于不知道你原来使用的是什么格式的公钥所以需要在区塊链里搜索这两个地址上锁定的 UTXO 从而计算出正确的“账户余额”,这会带来混乱
为了向后兼容,定义了 WIF 压缩格式
K
L
5
这样做的目的就是为了给导入这些私钥的钱包一个信号:钱包需要使用什么格式的公钥来计算地址,搜索区块链
使鼡“钱包”软件,能方便的收发比特币
早期的钱包都是离散私钥钱包,包含在全节点软件中
确定性钱包从一个种子衍生出钱包内的所有私钥,分层确定性钱包主要由 、 和 共同定义
HD 钱包的幕后细节涉及到很多内容希望这篇文章能帮伱理解它们。