记录黑客技术中优秀的内容,传播黑客文化,分享黑客技术精华

比特币钱包技术原理

2021-02-11 23:30

比特币钱包技术原理

在上一篇文章我们学习了比特币地址生成的过程,通过种子生成私钥,然后通过私钥生成公钥,再通过公钥生成地址,每个私钥对应了一个公钥,但我们看到比特币钱包是可以生成多个地址,这个原理是什么呢?创建比特币钱包一般是生成 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(从零开始计算)

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

最终我们得到的助记词如下:

primary fetch primary fetch primary fetch upon jazz roof tape upon jazz

下面我们使用 bx 命令来完整操作从随机数 -> 助记词 -> 种子 -> 主私钥 -> 子私钥 -> 子公钥 -> 地址整个完整的过程,先得到种子

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 开头。

bx hd-new 5970964aae65149edb7cbb271f186d0fbfac5fac0ee25d1cf4365c4991877c1caddaad648139e986f94de0d4f3d93fbbb01d7f01e4c5199dc7eb5045e76e9c78
xprv9s21ZrQH143K2bvsGAG6rPjFR9NThnPer3w3dxVDNA8zbZGgqtj7wWzuJcWunpYGHKVwfzfLNmdh33EtLnuN4ATPLuUYAqXAUGQLey734GS

bx hd-public xprv9s21ZrQH143K2bvsGAG6rPjFR9NThnPer3w3dxVDNA8zbZGgqtj7wWzuJcWunpYGHKVwfzfLNmdh33EtLnuN4ATPLuUYAqXAUGQLey734GS 
xpub69cHcGsMa9oBdEbgPBYUfMmfCHdmTSNAoHGunq25CagYPWqXkj6UfgmxtcGKhGh11GWV5Dsw9URPGpeANeuN7TyK1dsRYuWFx5WcT137Vqj

然后通过主公钥生成子公钥,再通过子公钥生成地址,得到的地址是 1NVjHS8W1prtTnm5MnW1p8HLKM6h5tKpNJ。

bx hd-to-ec xpub69cHcGsMa9oBdEbgPBYUfMmfCHdmTSNAoHGunq25CagYPWqXkj6UfgmxtcGKhGh11GWV5Dsw9URPGpeANeuN7TyK1dsRYuWFx5WcT137Vqj
02825c61d123a2b08e5ca84dd8f116bb15f0477918853b8fb8f0b462d01e18aead

bx ec-to-address 02825c61d123a2b08e5ca84dd8f116bb15f0477918853b8fb8f0b462d01e18aead
1NVjHS8W1prtTnm5MnW1p8HLKM6h5tKpNJ

下面我们演示生成多个子私钥、子公钥和地址,通过种子生成主私钥,并将主私钥保存到 privateMaster 文件。

bx hd-new 5970964aae65149edb7cbb271f186d0fbfac5fac0ee25d1cf4365c4991877c1caddaad648139e986f94de0d4f3d93fbbb01d7f01e4c5199dc7eb5045e76e9c78 > privateMaster

cat privateMaster 
xprv9s21ZrQH143K2bvsGAG6rPjFR9NThnPer3w3dxVDNA8zbZGgqtj7wWzuJcWunpYGHKVwfzfLNmdh33EtLnuN4ATPLuUYAqXAUGQLey734GS

通过主私钥生成一个子私钥,保存文件到 account,通过这个子私钥可以生成多个私钥序列,比如我们生成两个孙私钥。

bx hd-private --hard < privateMaster >  account 

cat account 
xprv9vcwCmLc5Smrd89t18tjiHqwv2KUZCrLuEJJ5XSsR9QVXCxq4DvQiycMAKH5J6GhJv2r9i6M96awbZn9D5AyJi4jg3eKwTdikBRDAHGDpPM

bx hd-private --index 0  < account
xprv9x6oF8edQYhJ8Xh4JE6Q7bzQAjnfo5WuMA5poUDwM96f99vZVSJ463aU9xtgYEsmFQFDWpqU3gkNPt98TKiMD1xAm6FEJrgcCtNz7NEVo42

bx hd-private --index 1 < account
xprv9x6oF8edQYhJB3YcB6t1D6yWjg7jfkGjK17mUbihWdnhvDVG2iJejvXVsBMy3mhQtQkBRrQgNUmB1Uq2NwJcSKDQGXsKWMmDyjnEv7XaMbN

通过指定的孙私钥可以生成孙公钥,比如我们将刚才两个孙私钥生成对应的两个孙私钥。

bx hd-public --index 0 < account 
xpub6B69eeBXEvFbM1mXQFdQUjw8imdACYEkiP1RbrdYuUde1xFi2ycJdqtx1EuVzCSGNFX8QXVpEFyJrEjE38HyF4qJFGCy3TCZdX8XH39D8UW

bx hd-public --index 1 < account
xpub6B69eeBXEvFbPXd5H8R1aEvFHhxE5CzagE3NGz8K4yKgo1pQaFcuHiqyiTHygqkSN75xXirwKWBMidmN39dVMdaCqceUZbBMQxES6Ls8BYZ

再将分别将两个孙私钥长成比特币地址,最终生成的两个地址是 1MkgG5wMUiVcLMRTQDg9ty3kvkB9XzxhHu 和 1PCRCQ8JGiUg4qbq8EyCkVywfvM7fYyaFJ。

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 » 比特币钱包技术原理


知识来源: https://www.exchen.net/bitcoin-wallet-technology.html

阅读:412828 | 评论:0 | 标签:区块链/比特币 区块链 比特币

想收藏或者和大家分享这篇好文章→复制链接地址

“比特币钱包技术原理”共有0条留言

发表评论

姓名:

邮箱:

网址:

验证码:

黑帝公告 📢

永久免费持续更新精选优质黑客技术文章Hackdig,帮你成为掌握黑客技术的英雄

↓赞助商 🙇🧎

标签云 ☁