默克尔树在区块链中的应用

1 MT(Merkle tree)

默克尔树是一种哈希二叉树,1979年由Ralph Merkle发明。与标准二叉树一样,由一组叶节点,一组中间节点和一个根节点构成。叶节点包含存储数据或其哈希值,中间节点是其两个子节点内容的哈希值,最上层的根节点同样也是由它的两个子节点内容的哈希值组成。

默克尔树在区块链中的应用_第1张图片

默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。

默克尔树的典型应用场景包括:

  • 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
  • 快速定位修改:例如上例中,如果交易A中数据被修改,会影响到HA,HAB和HABCD。因此,沿着 Root –> HAB –> HA,可以快速定位到发生改变的交易A,时间复杂度O(lg(n))。
  • 零知识证明:如何证明某个数据(交易A……交易D)中包括给定内容交易A,构造一个默克尔树,公布交易A,HAB,HCD,HABCD,交易A拥有者可以很容易检测交易A是否存在,但不知道其它内容。

2 MPT(Merkle Patricia Tree)

MPT(Merkle Patricia Tree)就是默克尔树和压缩前缀树混合后的产物。压缩前缀树是一种更节省空间的树。对于基数树的每个节点,如果该节点是唯一的子节点的话,就和父节点合并。

以太坊中的状态树就使用了MPT树保存账户状态,将账户地址作为MPT树的索引,下图中列出了四个以太坊账户,分别存储了不同的余额。
默克尔树在区块链中的应用_第2张图片

从前面结构图可以看出,Merkle Patricia Tree有4种类型的节点:

  • **叶子节点(leaf)**表示为[key,value]的一个键值对。和前面的英文字母key不一样,这里的key都是16编码出来的字符串,每个字符只有0-f 16种,value是RLP编码的数据
  • **扩展节点(extension)**也是[key,value]的一个键值对,但是这里的value是其他节点的hash值,通过hash链接到其他节点
  • 分支节点(branch) 因为MPT树中的key被编码成一种特殊的16进制的表示,再加上最后的value,所以分支节点是一个长度为17的list,前16个元素对应着key中的16个可能的十六进制字符,如果有一个[key,value]对在这个分支节点终止,最后一个元素代表一个值,即分支节点既可以搜索路径的终止也可以是路径的中间节点。分支节点的父亲必然是extension node

3 默克尔证明

默克尔证明是一种经典技术,用于证明交易存在于区块链的某个区块中,是实现轻客户端的关键技术。我们以Wecross跨链项目中使用的数据互信机制来介绍默克尔证明。
假设两个用户甲和乙要在两条不同区块链上完成资产交换,那么必须要有一种机制来保证两个用户都真实拥有所宣称的资产,否则任何一方的用户都可以使用伪造的链上资产去兑换对方有效的链上资产。数据互信机制就是要解决这种跨链场景下的数据可信问题,它基于默克尔证明机制来实现,使得一方在不需要获取另一方区块链全量数据的情况下,仍然能够快速证明另一方区块链上特定数据的真实存在性。

默克尔树在区块链中的应用_第3张图片

假设上图是区块 X 的默克尔树结构,如果要验证交易D是否在区块X中,无需获取整个区块X,只需要提供交易D,H_AB,H_C,以及默克尔根则可。具体过程如下:

  • 根据交易 D 计算哈希,得到 H_D。
  • 根据 H_C 和 H_D 计算哈希,得到 H_CD。
  • 根据 H_AB 和 H_CD 计算哈希,得到 H_ABCD。
  • 对比 H_ABCD 和默克尔根,如果相同,则证明区块 X 存在交易 D,,否则说明不存在。

你可能感兴趣的:(区块链,区块链)