比特币钱包技术原理
在上一篇文章我们学习了比特币地址生成的过程,通过种子生成私钥,然后通过私钥生成公钥,再通过公钥生成地址,每个私钥对应了一个公钥,但我们看到比特币钱包是可以生成多个地址,这个原理是什么呢?创建比特币钱包一般是生成 12 个单词,有了这 12 个单词就能恢复钱包,这个原理又是什么呢?
比特币钱包里并没有比特币,实际上比特币是存在区块链中,钱包只是负责管理公私钥和发起转账。钱包有两种类型,第一种是非确定性钱包(nondeterministic wallet),是每个私钥对应一个公钥,每一对公私钥之间没有任何关系,生成 N 对公私钥,钱包负责把它们集合存在一起,这种钱包称为钥匙串钱包(keychain)。第二种类型是确定性钱包(deterministic wallet),所有的私钥是由一个主私钥生成的,主私钥可以生成 N 个子私钥,子私钥还可以生成孙私钥,只要保存好主私钥,则可以再次生成所有子私钥,生成子私钥的方式通常使用树状结构,称为分层确定性钱包(hierarchical deterministic),简称 HD 钱包,目前 HD 钱包已经是行业主流,下图是 HD 钱包私钥之间的关系。
HD 钱包种子是一串十六进制数据,人类很难阅读和抄录,于是 HD 钱包采用了一组标准化英文单词用于生成种子,易于阅读和抄录,方便在不同钱包之间转移,这些单词被称为助记词,所有单词在 BIP39 单词表,一共是 2048 个。生成种子的过程如下图。最开始需要一个随机数,计算这个随机数的 sha256 值,取开头前 4 位做为校验码追加到随机数的末尾,需要注意的是校验码需要转换成二进制,然后取 4 位,接下来将 132 位数据转换成二进制,分成 12 段,每段 11 位,然后到 BIP39 单词表依次按顺序找到单词,得到助记词之后可以选择添加密码,也可以不加密码,最后使用 PBKF2 HMACSHA512 生成种子。
比如我们定义随机数是 aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbb,计算出 sha256 是 BB4AE3FAA8FB038F2C99D6DB20A2E861D9F35F2FDA5DB1A3245FE0E7FE9EF858,开头的 BB 做为校验码,转换成二进制的如下所示:
得到二进制之后,分成 12 段,每段 11 位,比如第一段是 10101010101 转换成十进制是 1365,找到 BIP39 单词表第 1365 个是 primary(从零开始计算)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
10101010101 1365 primary 01010101010 682 fetch 10101010101 1365 primary 01010101010 682 fetch 10101010101 1365 primary 01010101010 682 fetch 11101110111 1911 upon 01110111011 955 jazz 10111011101 1501 roof 11011101110 1774 tape 11101110111 1911 upon 01110111011 955 jazz |
最终我们得到的助记词如下:
1 2 |
primary fetch primary fetch primary fetch upon jazz roof tape upon jazz |
下面我们使用 bx 命令来完整操作从随机数 -> 助记词 -> 种子 -> 主私钥 -> 子私钥 -> 子公钥 -> 地址整个完整的过程,先得到种子
1 2 3 4 5 |
bx mnemonic-new aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbb primary fetch primary fetch primary fetch upon jazz roof tape upon jazz bx mnemonic-to-seed primary fetch primary fetch primary fetch upon jazz roof tape upon jazz 5970964aae65149edb7cbb271f186d0fbfac5fac0ee25d1cf4365c4991877c1caddaad648139e986f94de0d4f3d93fbbb01d7f01e4c5199dc7eb5045e76e9c78 |
然后通过种子得到主私钥,主私钥是 xprv 开头,再通过主私钥得到主公钥,主公钥是 xpub 开头。
1 2 3 4 5 6 7 |
bx hd-new 5970964aae65149edb7cbb271f186d0fbfac5fac0ee25d1cf4365c4991877c1caddaad648139e986f94de0d4f3d93fbbb01d7f01e4c5199dc7eb5045e76e9c78 xprv9s21ZrQH143K2bvsGAG6rPjFR9NThnPer3w3dxVDNA8zbZGgqtj7wWzuJcWunpYGHKVwfzfLNmdh33EtLnuN4ATPLuUYAqXAUGQLey734GS bx hd-public xprv9s21ZrQH143K2bvsGAG6rPjFR9NThnPer3w3dxVDNA8zbZGgqtj7wWzuJcWunpYGHKVwfzfLNmdh33EtLnuN4ATPLuUYAqXAUGQLey734GS xpub69cHcGsMa9oBdEbgPBYUfMmfCHdmTSNAoHGunq25CagYPWqXkj6UfgmxtcGKhGh11GWV5Dsw9URPGpeANeuN7TyK1dsRYuWFx5WcT137Vqj |
然后通过主公钥生成子公钥,再通过子公钥生成地址,得到的地址是 1NVjHS8W1prtTnm5MnW1p8HLKM6h5tKpNJ。
1 2 3 4 5 6 |
bx hd-to-ec xpub69cHcGsMa9oBdEbgPBYUfMmfCHdmTSNAoHGunq25CagYPWqXkj6UfgmxtcGKhGh11GWV5Dsw9URPGpeANeuN7TyK1dsRYuWFx5WcT137Vqj 02825c61d123a2b08e5ca84dd8f116bb15f0477918853b8fb8f0b462d01e18aead bx ec-to-address 02825c61d123a2b08e5ca84dd8f116bb15f0477918853b8fb8f0b462d01e18aead 1NVjHS8W1prtTnm5MnW1p8HLKM6h5tKpNJ |
下面我们演示生成多个子私钥、子公钥和地址,通过种子生成主私钥,并将主私钥保存到 privateMaster 文件。
1 2 3 4 5 |
bx hd-new 5970964aae65149edb7cbb271f186d0fbfac5fac0ee25d1cf4365c4991877c1caddaad648139e986f94de0d4f3d93fbbb01d7f01e4c5199dc7eb5045e76e9c78 > privateMaster cat privateMaster xprv9s21ZrQH143K2bvsGAG6rPjFR9NThnPer3w3dxVDNA8zbZGgqtj7wWzuJcWunpYGHKVwfzfLNmdh33EtLnuN4ATPLuUYAqXAUGQLey734GS |
通过主私钥生成一个子私钥,保存文件到 account,通过这个子私钥可以生成多个私钥序列,比如我们生成两个孙私钥。
1 2 3 4 5 6 7 8 9 10 11 12 |
bx hd-private --hard < privateMaster > account cat account xprv9vcwCmLc5Smrd89t18tjiHqwv2KUZCrLuEJJ5XSsR9QVXCxq4DvQiycMAKH5J6GhJv2r9i6M96awbZn9D5AyJi4jg3eKwTdikBRDAHGDpPM bx hd-private --index 0 < account xprv9x6oF8edQYhJ8Xh4JE6Q7bzQAjnfo5WuMA5poUDwM96f99vZVSJ463aU9xtgYEsmFQFDWpqU3gkNPt98TKiMD1xAm6FEJrgcCtNz7NEVo42 bx hd-private --index 1 < account xprv9x6oF8edQYhJB3YcB6t1D6yWjg7jfkGjK17mUbihWdnhvDVG2iJejvXVsBMy3mhQtQkBRrQgNUmB1Uq2NwJcSKDQGXsKWMmDyjnEv7XaMbN |
通过指定的孙私钥可以生成孙公钥,比如我们将刚才两个孙私钥生成对应的两个孙公钥。
1 2 3 4 5 6 |
bx hd-public --index 0 < account xpub6B69eeBXEvFbM1mXQFdQUjw8imdACYEkiP1RbrdYuUde1xFi2ycJdqtx1EuVzCSGNFX8QXVpEFyJrEjE38HyF4qJFGCy3TCZdX8XH39D8UW bx hd-public --index 1 < account xpub6B69eeBXEvFbPXd5H8R1aEvFHhxE5CzagE3NGz8K4yKgo1pQaFcuHiqyiTHygqkSN75xXirwKWBMidmN39dVMdaCqceUZbBMQxES6Ls8BYZ |
再分别将两个孙公钥生成比特币地址,最终生成的两个地址是 1MkgG5wMUiVcLMRTQDg9ty3kvkB9XzxhHu 和 1PCRCQ8JGiUg4qbq8EyCkVywfvM7fYyaFJ。
1 2 3 4 5 6 7 8 9 10 11 12 |
bx hd-to-ec xpub6B69eeBXEvFbM1mXQFdQUjw8imdACYEkiP1RbrdYuUde1xFi2ycJdqtx1EuVzCSGNFX8QXVpEFyJrEjE38HyF4qJFGCy3TCZdX8XH39D8UW 03735b60ced116f2c4010eb013e2b937dccfb150ea69e5adf9f4da2162d86f3645 bx ec-to-address 03735b60ced116f2c4010eb013e2b937dccfb150ea69e5adf9f4da2162d86f3645 1MkgG5wMUiVcLMRTQDg9ty3kvkB9XzxhHu bx hd-to-ec xpub6B69eeBXEvFbPXd5H8R1aEvFHhxE5CzagE3NGz8K4yKgo1pQaFcuHiqyiTHygqkSN75xXirwKWBMidmN39dVMdaCqceUZbBMQxES6Ls8BYZ 03456019db733bb6edde2f4b4f1abdf709a69b3ba302cc44c676e60c34ed6ada6e bx ec-to-address 03456019db733bb6edde2f4b4f1abdf709a69b3ba302cc44c676e60c34ed6ada6e 1PCRCQ8JGiUg4qbq8EyCkVywfvM7fYyaFJ |
转载请注明:exchen's blog » 比特币钱包技术原理