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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章