Merkle 樹

默克爾樹(又叫哈希樹)是一種二叉樹,由一個根節點、一組中間節點和一組葉節點組成。

最下面的葉節點包含存儲數據或其哈希值,每個中間節點是它的兩個孩子節點內容的哈希 值,根節點也是由它的兩個子節點內容的哈希值組成。

進一步的,默克爾樹可以推廣到多叉樹的情形。

默克爾樹的特點是,底層數據的任何變動,都會傳遞到其父親節點,一直到樹根。

默克爾樹的典型應用場景包括:

    快速比較大量數據:當兩個默克爾樹根相同時,則意味着所代表的數據必然相同。

    快速定位修改:例如上例中,如果 D1 中數據被修改,會影響到 N1,N4 和 Root。因 此,沿着 Root --> N4 --> N1,可以快速定位到發生改變的 D1;

    零知識證明:例如如何證明某個數據(D0……D3)中包括給定內容 D0,很簡單,構造 一個默克爾樹,公佈 N0,N1,N4,Root,D0 擁有者可以很容易檢測 D0 存在,但不知 道其它內容。

    葉子節點的數據是原始數據或者原始數據的數字摘要(hash值)。非葉子節點的數據是根據其所有子節點數據計算出的數字摘要(hash值)。

    快速比較大量數據,從根節點開始比較,可快速找到變更的數據。


BitCoin的Merkle Proof

Merkle Proof最早的應用是Bitcoin,它是由中本聰在2009年描述並創建的。Bitcoin的Blockchain利用Merkle proofs來存儲每個區塊的交易。 
  

而這樣做的好處,也就是中本聰描述到的“簡化支付驗證”(Simplified Payment Verification,SPV)的概念:一個“輕客戶端”(light client)可以僅下載鏈的區塊頭即每個區塊中的80byte的數據塊,僅包含五個元素,而不是下載每一筆交易以及每一個區塊:

  • 上一區塊頭的哈希值
  • 時間戳
  • 挖礦難度值
  • 工作量證明隨機數(nonce)
  • 包含該區塊交易的Merkle Tree的根哈希 
    如果客戶端想要確認一個交易的狀態,它只需簡單的發起一個Merkle proof請求,這個請求顯示出這個特定的交易在Merkle trees的一個之中,而且這個Merkle Tree的樹根在主鏈的一個區塊頭中。

但是Bitcoin的輕客戶端有它的侷限。一個侷限是,儘管它可以證明包含的交易,但是它不能進行涉及當前狀態的證明(如數字資產的持有,名稱註冊,金融合約的狀態等)。

Bitcoin如何查詢你當前有多少幣?一個比特幣輕客戶端,可以使用一種協議,它涉及查詢多個節點,並相信其中至少會有一個節點會通知你,關於你的地址中任何特定的交易支出,而這可以讓你實現更多的應用。但對於其他更爲複雜的應用而言,這些遠遠是不夠的。一筆交易影響的確切性質(precise nature),可以取決於此前的幾筆交易,而這些交易本身則依賴於更爲前面的交易,所以最終你可以驗證整個鏈上的每一筆交易。爲了解決這個問題,Ethereum的Merkle Tree的概念,會更進一步。


Ethereum的Merkle Proof

每個以太坊區塊頭不是包括一個Merkle樹,而是爲三種對象設計的三棵樹:

  • 交易Transaction
  • 收據Receipts(本質上是顯示每個交易影響的多塊數據)
  • 狀態State 

    這使得一個非常先進的輕客戶端協議成爲了可能,它允許輕客戶端輕鬆地進行並覈實以下類型的查詢答案:
  • 這筆交易被包含在特定的區塊中了麼?
  • 告訴我這個地址在過去30天中,發出X類型事件的所有實例(例如,一個衆籌合約完成了它的目標)
  • 目前我的賬戶餘額是多少?
  • 這個賬戶是否存在?
  • 假如在這個合約中運行這筆交易,它的輸出會是什麼? 
    第一種是由交易樹(transaction tree)來處理的;第三和第四種則是由狀態樹(state tree)負責處理,第二種則由收據樹(receipt tree)處理。計算前四個查詢任務是相當簡單的。服務器簡單地找到對象,獲取Merkle分支,並通過分支來回復輕客戶端。
發佈了21 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章