比特币钱包hd是什么(比特币HD)

层级确定性密钥生成(Hierarchical Deterministic)

Hierarchical Deterministic 简称HD

HD密钥生成和传输协议(HD协议)大大简化钱包的备份,消除了不同基于同一个钱包的程序之间重复通信的需要,允许各自独立的创建子账户,给每一个父账户监视和控制子账户的能力,即便子账户被泄露。把每个账户分成全访问和限制访问部分,这样非信任用户或程序只能允许接受或监视支付,但不能花掉他们。

HD协议利用ECDSA公钥创建函数,point(),这个函数输入私钥(一个大的整数),输出图上的点(公钥):

point(private_key) == public_key

因为point()的工作方式,通过一个存在的公钥(父)和从一个数值(i)得到公钥的组合,创建一个子公钥是可能的。这个子公钥也是通过point()计算出来的,输入是对原始的私钥(父私钥)加i,然后对一个所有比特币软件的全局的常量p取余数:

point( (parent_private_key + i) % p ) == parent_public_key + point(i)

这意味着两个或多个独立的程序在顺序一致的情况下,并且不需要更多的通信,从一个单独的密钥对可以创建一系列的子密钥对。更进一步来说,分发新的密钥的程序不需要接触私钥就可以了,使得公钥分发程序可以运行在一个可能不安全的平台上,比如公共web服务。

子公钥也可以创建他们自己的子公钥(孙公钥),重复子密钥的创建过程:

point( (child_private_key + i) % p ) == child_public_key + point(i)

不管是创建子公钥还是进一步继承公钥,一个可预测的整数值序列不比所有的交易用一个地址好多少,一个人知道了一个子公钥就可以找到从同一个父公钥创建出来的其他所有的子公钥。我们用随机种子来代替产生一个确定的数值序列,这样如果没有种子的话子公钥之间的联系就不可见了。

HD协议使用一个单独的根种子来创建儿子、孙子的层级,并且通过没有联系的确定产生的整数数值产生其他继承的密钥。每个子密钥也从父母那得到了一个确定产生的种子,称为链码,泄露一个链码不会泄露整个层级的序列,这允许主链码可以继续使用,即使比如一个基于web的公钥分发程序被黑。

如上面描述,HD密钥产生需要四个输入:

父私钥和父公钥,都是未压缩的256bit ECDSA密钥。

父链码,看起来是随机数的256bit的数

索引号,程序定义的32bit整数。

如上面插图,在正常形式里,父链码,父公钥和索引号输入到哈希函数(HMAC-SHA512),输出一个512bit确定的但是看起来随机的数据。右半部256bit用作新的链码,左半部256bit用作和父私钥或父公钥组合的整数,相应的产生子私钥和子公钥:

child_private_key == (parent_private_key + lefthand_hash_output) % G

child_public_key == point( (parent_private_key + lefthand_hash_output) % G )

child_public_key == point(child_private_key) == parent_public_key + point(lefthand_hash_output)

指定不同的索引号将会从相同的父密钥生成互不相关的子密钥。用子密钥重复这个步骤将会创建互不相关的孙密钥。

因为创建子密钥需要一个密钥和一个链码,密钥和链码一起被称为扩展密钥。一个扩展的私钥和相应的扩展公钥有相同的链码。主私钥(最顶层)和主链码是从随机数得来的,如下图。

一个根种子是从128bit,256bit或512bit的随机数计算来的。这个根种子最小128bit是用户需要备份的唯一的数据,为了得到每一个密钥,需要由一个特别的钱包程序用特别设置创建的。

警告:截止到目前,HD钱包并不期待是全兼容的,所以用户必须对一个特别的种子使用一样的HD钱包程序,并且是相同HD有关的设置。

根种子被计算哈希得到512bit看起来随机的数据,从这个数据计算出主私钥和主链码。主公钥从主私钥通过point()得到,和主链码一起称为扩展公钥。主扩展密钥和其他扩展密钥功能是一样的;仅仅因为他们在层级的最顶部看起来特别而已。