最新消息:本站技术交流 QQ 群:28124927

比特币钱包技术原理

区块链/比特币 exchen 3987浏览 0评论

比特币钱包技术原理

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

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

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

然后通过种子得到主私钥,主私钥是 xprv 开头,再通过主私钥得到主公钥,主公钥是 xpub 开头。

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

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

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

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

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

转载请注明:exchen's blog » 比特币钱包技术原理

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址