Merkle山脉(Merkle Mountain Range)详解

这篇文章介绍Merkle Mountain Range,翻译过来是Merkle山脉。百度上还没有Merkle Mountain Range ,或者Merkle山脉这两个关键词,这算是第一篇给它起名的中文文章吧。

这里希望以通俗易懂的语言跟读者讲解。

文章将从下面三个方面讲解:

  • Merkle 山脉跟merkle树的区别?
  • 什么是Merkle山脉?(下面使用MMR代替)
  • 有什么用?

最后还有实现的源码🔗链接。

1. Merkle 山脉跟merkle树的区别?

在这里插入图片描述
上图是一个二叉Merkle树,叶子节点是用户数据,树的根节点和每一个中间节点是其左右子节点的哈希值。Merkle树的一大特点是子树的任何一个节点值的变化都会导致父节点以及父节点上面的节点值改变。所以,如果根节点的值没有变化,就说明该树的所有节点的值没有变化。Merkle树广泛应用在区块链中,比如比特币,以太坊等。

MMR其实也算是Merkle树的一种,只是它具有普通的Merkle树所没有的一个大优点,这个优点在分析完什么是MMR之后再给出。下面图片是一片山脉,如果我们简化这篇山脉,会得到什么?
在这里插入图片描述
就会得到下面这个东西,形如三座山,又如三棵树。MMR的形状便是如此了。下面三棵树的所有叶子节点都是用户数据,三个根节点和所有的中间节点都是对应左右子树的哈希值。

       //  /  /  ////////

下面以图片的形式来说明MMR的构造过程。、

2. MMR的构造

下图bh0和bh1表示两个叶子节点,H表示两个叶子节点的哈希值。第一个圈表示MMR,第二个圈表示数据存储在一个数组中。
在这里插入图片描述
叶子节点bh2出现,此时没有第四个叶子节点跟它一起生成一个哈希值。
在这里插入图片描述
下图所示,是不是像两座山?
在这里插入图片描述
注意红圈的部分。H(2,3)是由bh2和bh3的哈希结果。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
通过上面一步一步的演示,我们构造了一个MMR,其中有三个山头。第二个山头是H(8,9),第三个山头是bh10. 如果加上索引的话,得到下图。其中第一个红圈的数字表示叶子节点的编号(15个叶子节点),第二个红圈中的节点表示的是MMR的所有节点。
在这里插入图片描述
上面便是MMR的构成和定义。

3. MMR有什么用呢?

先回答一个问题:如果要证明绿色圈内的数字15是MMR树的叶子节点,怎么证明?
在这里插入图片描述
我们只需要发给验证者下图所有圈内的数据,验证者就可以自个验证15确实是在MMR中。
这个证明有什么用呢?在比特币中,轻客户端无法下载所有的区块链交易数据到本地,在查询比特币区块链的一个交易的时候,需要依赖完整节点(full node)提供的相关的数据,然后轻客户端根据这些数据自个验证。我们希望轻客户端的存储负担和网络负担越小越好。如果下图中的叶子节点表示区块链中一个block header,那么轻客户端就不需要下载所有的block header数据了,只需要使用少量的网络负担来从full node中下载圆圈中的数据就可以验证一个交易是否完成了。
在这里插入图片描述

总结:MMR相对于二叉Merkle树的优点是,当有新数据到来的时候(新数据,指的是叶子节点),中间节点的值不需要改变,数据永远都是追加。这很符合区块链的特性。而merkle树不行。比如下面图示,如果叶子节点添加进来,导致中间节点y2和z1的值改变。
在这里插入图片描述

实现源码:
MMR的实现源码:https://github.com/liangyihuai/python-proofmarshal/blob/master/proofmarshal/mmr.py

其它:
应用了MMR的论文:https://eprint.iacr.org/2019/226.pdf#page=26&zoom=100,0,822

作者演讲视频,在哔哩哔哩:https://www.bilibili.com/video/av70882384/

本文PPT的下载地址:https://download.csdn.net/download/liangyihuai/11983918

Published by

风君子

独自遨游何稽首 揭天掀地慰生平