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

比特币区块链哈希树(MerkleRoot)的计算方法

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

比特币区块链哈希树(MerkleRoot)的计算方法

在比特币代码里 block.h 头文件里声明区块头的结构,有下面几个字段,其中有一个叫哈希树(MerkleRoot) 的字段,它的作用是可以校验当前区块里所有的交易记录。

MerkleRoot 是将当前区块里的所有交易记录的 Hash 使用二叉树的方式,层层相加并计算出新的 Hash,直到最后一个节点 Hash 就是MerkleRoot,这样只要有一笔交易出现被篡改,很容易定位到这笔交易。比如一个区块里有 4 条交易记录,每条交易记录的 Hash 我们分别定义成 H1、H2、H3、H4 变量,计算 MerkleRoot 的方法是下面这样的步骤。

(1) H1 和 H2 做一次大小端反转,然后相加计算出一个Hash,生成一个节点叫 H12。

(2) H3 和 H4 做一次大小端反转,然后相加计算出一个Hash,生成一个节点叫 H34。

(3) H12 和 H34 相加计算出一个Hash,最后的节点得到的 Hash 还需要做一次大小端反转,得到的结果就是 MerkleRoot。

步骤如下图所示:

每一次计算 Hash 是通过两次 sha256,最终得到计算 MaerkleRoot 的计算公式是:

上面我们看到是交易数量是双数,如果交易数量是单数该怎么处理?比如只有 3 个交易,H1 和 H2 的处理没有变化,只是处理的过程会把 H3+H3 计算出一个 Hash 做为上层节点,如下图所示:

还有一种情况,如果交易数量只有一个呢?只有一个交易数量,不需要进行任何计算,直接将第一笔的交易 Hash 做为 MerkleRoot,比如区块高度是 0,也就是第一个区块,看到它的 MerkleRoot 和第一笔交易的 Hash 是完全一样的。如果区块里有两笔交易,H1+H2 计算 Hash 得到的 H12 节点是最后的根节点,也就是 MaerkleRoot。下面我们尝试在本地验证 MerkleRoot 计算的过程,比如找到区块高度 181,这个区块里有两笔交易,第一笔交易的 Hash 是8347cee4a1cb5ad1bb0d92e86e6612dbf6cfc7649c9964f210d4069b426e720a,大小端转换反转过后的十六进制数据是:

第二笔交易的 Hash 是 a16f3ce4dd5deb92d98ef5cf8afeaf0775ebca408f708b2146c4fb42b41e14be 大小端转换反转过后的十六进制数据是:

将两个交易记录的 Hash 大小端反转后再相加在一起,组合的结果如下:

然后计算 sha256,第一次计算的结果是 4bb234b71d205dba7936c5e6241e1666479e56f0e370e7725de2c99e6cf5de81,如下图所示:

第二次计算的 sha256 的结果是 366c2a0915f05db4b450c050ce7165acd55f823fee51430a8c993e0bdbb192ed,最后得到的 Hash 需要做一次大小端转换,得到的 merkleRoot 是 ed92b1db0b3e998c0a4351ee3f825fd5ac6571ce50c050b4b45df015092a6c36。

还可以编写 010editor 脚本来实现,具体代码如下:

输出的结果和我们手动用 010editor 验证的是一样的。

转载请注明:exchen's blog » 比特币区块链哈希树(MerkleRoot)的计算方法

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

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

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