图解默克尔树
2020-02-04 本文已影响0人
胡键
iden3.io 的 blog 最近发表了一篇关于默克尔树的图解文章,相当不错,特摘取了文章的图解部分。
默克尔树规范

包含数据的区块组成了树的叶子。

首先,为每个数据区块创建父节点,其值为它们后代数据区块的哈希。

然后,两两分组父节点,将它们值的哈希保存于上一级的树节点中。

重复此过程直至一个节点,其为树的根。
防篡改

假设叶子节点数据被恶意篡改

将导致上一级节点的哈希值与之不匹配

因此不得不继续篡改该节点

同理,不得不依次篡改上一级节点

最终,来到了根节点,无法篡改,因为此节点在链上一直处于被跟踪的状态。
证明数据的有效性

现要证明 data0 是默克尔树的一员

首先需要找到从数据区块到根节点的一条路径

然后找到该路径上 data0 兄弟区块

忽略树的其余部分,因为这些区块已经有足够信息参与计算

递归重新计算根的值,若与链上的根的值相等,则 data0 属于默克尔树一部分

先计算 data0 哈希,放于标记为 0 的区块中

将 data0 的哈希结合标记为 1 的区块值计算,结果放入 4

最终结合 4 和 5 算出根的值

比较两者结果即可做出判断
关于默克尔树的其他内容,请阅读原文。
