区块链--默克尔树(Merkle Tree)

Merkle Tree

默克尔树是一种二叉树,由一个根节点、一组中间节点和一些叶子节点组成。形状如下:

D0、D1、D2和D3是叶子节点包含的数据,也就是叶子节点的value。继续往上看,N0、N1、N2和N3就是叶子节点,它是将数据(也就是D0、D1、D2和D3)进行hash运算后得到的hash值;继续往上看,N4和N5是中间节点,它们各是N0和N1经过hash运算得到的哈希值以及N2和N3经过hash运算得到的哈希值,注意,它们是把相邻的两个叶子结点合并成一个字符串,然后运算这个字符串的哈希;接着往上,Root节点是N4和N5经过hash运算后得到的哈希值,这就是这颗默克尔树的根哈希。

分析到这里我们大概可以知道在默克尔树中最下面的大量的叶节点包含基础数据;每个中间节点是它的两个叶子节点的哈希,根节点也是由它的两个子节点的哈希,代表了默克尔树的顶部。

还有从默克尔树的结构可以看出,任意一个叶子节点的交易被修改,叶子节点hash值就会变更,最终根节点的hash值就会改变。所以确定的根节点的hash值可以准确的作为一组交易的唯一摘要。

现在可以总结一下默克尔树的特点: 
1.首先是它的树的结构,默克尔树常见的结构是二叉树,但它也可以是多叉树,它具有树结构的全部特点。

2.默克尔树的基础数据不是固定的,想存什么数据由你说了算,因为它只要数据经过哈希运算得到的hash值。

3.默克尔树是从下往上逐层计算的,就是说每个中间节点是根据相邻的两个叶子节点组合计算得出的,而根节点是根据两个中间节点组合计算得出的,所以叶子节点是基础。


如何通过默克尔树验证交易?看下面一幅图:

假设我们要验证区块中存在Hash值为9Dog:64(绿色框)的交易,我们仅需要知道1FXq:18、ec20、8f74(黄色框)即可计算出781a、5c71与Root节点(藕粉色框)的哈希,如果最终计算得到的Root节点哈希与区块头中记录的哈希(6c0a)一致,即代表该交易在区块中存在。这是因为我上文提到的两个点,一个是默克尔树是从下往上逐层计算的,所以只要知道相邻的另一个节点的hash值就可以一直往上计算直到根节点,另一个是根节点的hash值可以准确的作为一组交易的唯一摘要,依据这两点就可以来验证一笔交易是否存在。


比特币中的默克尔树

比特币中的默克尔树如下:

区块头中包含父区块的hash,版本,时间戳,难道,随机数以及当前区块的Merkel根。区块体中则是当前区块交易的树。

有一点需要提的就是在比特网络中的Merkle树是二叉树,所以它需要偶数个叶子节点。如果仅有奇数个交易需要归纳,那最后的交易就会被复制一份以构成偶数个叶子节点,这种偶数个叶子节点的树也被称为平衡树。


默克尔树的典型应用场景

默克尔树比较典型的应用场景就是P2P下载。在点对点网络中数据传输的时候,会同时从多个机器上下载数据,而且很多机器可以认为是不稳定或者不可信的。为了校验数据的完整性,较好的办法是把大的文件分割成小的数据块(例如,把分割成2K为单位的数据块)。这样的好处是,如果小块数据在传输过程中损坏了,那么只要重新下载这一快数据就行了,不用重新下载整个文件。

除了P2P下载外,默克尔树还可以被用来快速比较大量的数据,因为当两个默克尔树根相同时,则意味着所代表的数据必然相同。还有就是可以用来实现零知识证明(零知识证明指的是证明者能够在不向验证者提供任何有用的信息的情况下,使验证者相信某个论断是正确的。

文章来源:https://blog.csdn.net/weixin_37504041/article/details/80474636

你可能感兴趣的:(区块链——智能合约)