之前了解了比特币的私钥、公钥和地址。简单地说,私钥是256位的随机数,公钥是私钥通过椭圆曲线算法计算出来,而地址是公钥经过哈希算法得出。
而比特币钱包,广义上是指为用户管理私钥和地址、跟踪余额和创建交易的应用程序。狭义上,是指管理密钥的容器。不同与现实中的钱包,比特币钱包里面存放的只是密钥,好比放的只是保险柜钥匙。
比特币有两种类型的钱包:
第一种类型是非确定性钱包(nondeterministic wallet),其中每个密钥都是从随机数独立生成的。密钥彼此无关。
第二种类型是确定性钱包(deterministic wallet),其中所有的密钥都是从一个主密钥派生出来,这个主密钥即为种子(seed)。该类型钱包中所有密钥都相互关联,如果有原始种子,则可以再次生成全部密钥。确定性钱包中使用了许多不同的密钥推导方法。最常用的推导方法是使用树状结构,称为分级确定性钱包或HD钱包。
非确定性钱包是指钱包里各个私钥之间互不关联。
确定性钱包是指钱包里所有的私钥是从一个主密钥计算派生出来,这个主密钥即为种子Seed。最常用的派生推导方法是树状结构,称为分级确定性钱包或HD钱包。而为了方便使用,种子Seed又会被编码成英文单词,即助记词。
而现在的比特币钱包是确定性钱包,HD钱包是基于BIP-32。在wallet.cpp,GenerateNewKey会生成新的比特币地址,其中会判断是否HD钱包模式。
1.将种子Seed通过HMAC-SHA512生成主私钥master private key和一个链码chain code,主私钥再计算出主公钥master public key。
2.用master private key + chain code可以得到指定的子私钥sub private key;
3.用 master public key + chain code可以得到指定的子公钥sub-public key;
作者:区块链研习社比特币源码研读班,caiklaus