區塊鏈技術架構分析(3)-默克爾樹(merkle tree)
默克爾樹(Merkle
tree,MT)是一種哈希二叉樹,1979年由Ralph
Merkle發明。在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構,每個節點代表一條結構化數據。通常子樹被稱作“左子樹”(left
subtree)和“右子樹”(right subtree)。二叉樹常被用於實現數據快速查詢。二叉樹如下圖所示。

A、Merkle樹結構
由一個根節點(root)、一組中間節點和一組葉節點(leaf)組成。葉節點(leaf)包含存儲數據或其哈希值,中間節點是它的兩個孩子節點內容的哈希值,根節點也是由它的兩個子節點內容的哈希值組成。所以Merkle樹也稱哈希樹。
B、哈希樹的特點
葉節點存儲的是數據文件,而非葉節點存儲的是其子節點的哈希值(Hash,通過SHA1、SHA256等哈希算法計算而來),這些非葉子節點的Hash被稱作路徑哈希值(可以據其確定某個葉節點到根節點的路徑),
葉節點的Hash值是真實數據的Hash值。因為使用了樹形結構, 其查詢的時間復雜度為 O(logn),n是節點數量。

默克爾樹的另一個特點是,底層數據的任何變動,都會傳遞到其父節點,一直到樹根。
C、應用模式
默克爾樹的典型應用場景包括:
l 快速比較大量數據:當兩個默克爾樹根相同時,則意味着所代表的數據必然相同(哈希算法決定的)。
l 快速定位修改:例如上例中,如果 D1 中數據被修改,會影響到Hash0-0,Hash0 和 Root。因此,沿着 Root --> 0 --> 0-0,可以快速定位到發生改變的 D1;
l 零知識證明:例如如何證明某個數據(D0……D3)中包括給定內容 D0,很簡單,構造一個默克爾樹,公布 N0,N1,N4,Root,D0擁有者可以很容易檢測 D0 存在,但不知道其它內容。
相對於 Hash List,MT的明顯的一個好處是可以單獨拿出一個分支來(作為一個小樹)對部分數據進行校驗,這個很多使用場合就帶來了哈希列表所不能比擬的方便和高效。正是源於這些優點,MT常用於分布式系統或分布式存儲中
D、在分布式存儲系統中的應用原理
為了保持數據一致,分布系統間數據需要同步,如果對機器上所有數據都進行比對的話,數據傳輸量就會很大,從而造成“網絡擁擠”。為了解決這個問題,可以在每台機器上構造一棵Merkle
Tree,這樣,在兩台機器間進行數據比對時,從Merkle
Tree的根節點開始進行比對,如果根節點一樣,則表示兩個副本目前是一致的,不再需要任何處理;如果不一樣,則沿着hash值不同的節點路徑查詢,很快就能定位到數據不一致的葉節點,只用把不一致的數據同步即可,這樣大大節省了比對時間以及數據的傳輸量。
E、比特幣中的Merkle Tree
比特幣區塊鏈系統中的采用的是Merkle二叉樹,它的作用主要是快速歸納和校驗區塊數據的完整性,它會將區塊鏈中的數據分組進行哈希運算,向上不斷遞歸運算產生新的哈希節點,最終只剩下一個Merkle根存入區塊頭中,每個哈希節點總是包含兩個相鄰的數據塊或其哈希值。
在比特幣系統中使用Merkle樹有諸多優點:首先是極大地提高了區塊鏈的運行效率和可擴展性,使得區塊頭只需包含根哈希值而不必封裝所有底層數據,這使得哈希運算可以高效地運行在智能手機甚至物聯網設備上;其次是Merkle樹可支持“簡化支付驗證協議”(SPV),即在不運行完整區塊鏈網絡節點的情況下,也能夠對交易數據進行檢驗。所以,在區塊鏈中使用Merkle樹這種數據結構是非常具有意義的。

Merkle樹的計算可參考:
https://www.cnblogs.com/fengzhiwu/p/5524324.html
https://blog.csdn.net/qq_33935254/article/details/55505472