MerkleTree

来源:互联网 发布:博客网站源码下载 编辑:程序博客网 时间:2024/04/21 00:10

一、什么是MerkleTree

  MerkleTree,是一种树(数据结构中所说的树),网上大都称为MerkleHashTree,这是因为它所构造的MerkleTree的所有节点都是Hash值。MerkleTree具有以下特点:

1.它是一种树,可以是二叉树,也可以多叉树,无论是几叉树,它都具有树结构的所有特点;

2.Merkle树的叶子节点上的value,是由你指定的,这主要看你的设计了,如MerkleHashTree会将数据的Hash值作为叶子节点的值;

3非叶子节点的value是根据它下面所有的叶子节点值,然后按照一定的算法计算而得出的。

  在特币网络中, Merkle树被用来归纳一个区块中的所有交易, 同时生成整个交易集合的数字指纹, 且提供了一种校验区块是否存在某交易的有效效途径。 生成一棵完整的Merkle树需要递归地对哈希节点对进行哈希, 并将新生成的哈希节点插入到Merkle树中, 直到只剩一个哈希节点, 该节点就是Merkle树的根。 在比特币的Merkle树中两次使用到了SHA256算法, 因此其加密哈希算法也被称为double-SHA256。

  当N个数据元素经过加密后插入Merkle树时,你至多计算2*log2(N)次就能检查出任意某数据元素是否在该树中, 这使得该数据结构非常有效。

Merkle树是自底向上构建的。 在如下的例子中, 我们从A、 B、 C、 D四个构成Merkle树树叶的交易开始,如下图。起始时所有的交易都还未存储在Merkle树中,而是先将数据哈希化, 然后将哈希值存储至相应的叶子节点。 这些叶子节点分别是HA、 HB、 HC和HD:

                                                                                                 H~A~ = SHA256(SHA256(交易A))

  通过串联相邻叶子节点的哈希值然后哈希之, 这对叶子节点随后被归纳为父节点。 例如, 为了创建父节点HAB, 子节点A和子节点B的两个32字节的哈希值将被串联成64字节的字符串。 随后将字符串进行两次哈希来产生父节点的哈希值:

                                                                                                   H~AB~=SHA256(SHA256(H~A~ + H~B~))

  继续类似的操作直到只剩下顶部的一个节点, 即Merkle根。 产生的32字节哈希值存储在区块头, 同时归纳了四个交易的所有数据。

 

二、 Merkle Tree的应用

2.1对比与验证

  目前, 在计算机领域,Merkle Tree大多用来进行比对以及验证处理。比在处理比对或验证的应用场景中时,特别是在分布式环境下进行比对或验证时,Merkle Tree会大大减少数据的传输量以及计算的复杂度。例如,假如是 15,16.......30是一个个数据块的hash值,我把这些数据从A传输到B,数据传输到B后,我想验证下传输到B上的数据的有效性型(验证数据是否在传输过程中发生变化),只需要验证A 和 B上所构造的Merkle。

   Tree的root节点值是否一致即可,如果一致,表示数据是有效的,传输过程中没有发生改变。假如在传输过程中,15对应的数据被人篡改,通过Merkle Tree很容易定位找到(因为此时,节点0,1,3,7,15对应的hash值都发生了变化),定位的时间复杂度为O(log(n))。

2.2认证

为了证明区块中存在某个特定的交易,一个节点只需要计算log2(N)个32字节的哈希值, 形成一条从特定交易到树根的认证路径或者Merkle路径即可。 随着交易数量的急剧增加, 这样的计算量就显得异常重要, 因为相对于交易数量的增加, 以基底为2的交易数量的对数的增长会缓慢许多。 这使得比特币节点能够高效地产生一条10或者12个哈希值( 320-384字节) 的路径, 来证明了在一个巨量字节大小的区块中上千交易中的某笔交易的存在。

在下图中,一个节点能够通过生成一条仅有4个32字节哈希值长度( 总128字节) 的Merkle路径, 来证明区块中存在一笔交易K。该路径有4个哈希值(在图7-5中由蓝色标注) HL、 HIJ、 HMNOP和HABCDEFGH。 由这4个哈希值产生的认证路径,再通过计算另外四对哈希值HKL、 HIJKL、 HIJKLMNOP和Merkle树根( 在图中由虚线标注) , 任何节点都能证明HK( 在图中由绿色标注) 包含在Merkle根中。


如何认证:

1.准备阶段:得到Merkle认证路径,即蓝色标注;

2.计算阶段:

a.由HK(待验证的节点)和认证路径中的HL计算可以得到HKL;

b.由HKL和认证路径中的HIJ可以得到HIJKL;

以此类推可以得到根,只要比较根的大小,就可以知道HK是否在这个区块中了。