1. 程式人生 > >區塊鏈--默克爾樹(Merkle Tree)

區塊鏈--默克爾樹(Merkle Tree)

Merkle Tree

默克爾樹是一種二叉樹,由一個根節點、一組中間節點和一些葉子節點組成。形狀如下:

consensus-png

D0、D1、D2和D3是葉子節點包含的資料,也就是葉子節點的value。繼續往上看,N0、N1、N2和N3就是葉子節點,它是將資料(也就是D0、D1、D2和D3)進行hash運算後得到的hash值;繼續往上看,N4和N5是中間節點,它們各是N0和N1經過hash運算得到的雜湊值以及N2和N3經過hash運算得到的雜湊值,注意,它們是把相鄰的兩個葉子結點合併成一個字串,然後運算這個字串的雜湊;接著往上,Root節點是N4和N5經過hash運算後得到的雜湊值,這就是這顆默克爾樹的根雜湊。

分析到這裡我們大概可以知道在默克爾樹中最下面的大量的葉節點包含基礎資料;每個中間節點是它的兩個葉子節點的雜湊,根節點也是由它的兩個子節點的雜湊,代表了默克爾樹的頂部。

還有從默克爾樹的結構可以看出,任意一個葉子節點的交易被修改,葉子節點hash值就會變更,最終根節點的hash值就會改變。所以確定的根節點的hash值可以準確的作為一組交易的唯一摘要。

現在可以總結一下默克爾樹的特點: 
1.首先是它的樹的結構,默克爾樹常見的結構是二叉樹,但它也可以是多叉樹,它具有樹結構的全部特點。

2.默克爾樹的基礎資料不是固定的,想存什麼資料由你說了算,因為它只要資料經過雜湊運算得到的hash值。

3.默克爾樹是從下往上逐層計算的,就是說每個中間節點是根據相鄰的兩個葉子節點組合計算得出的,而根節點是根據兩個中間節點組合計算得出的,所以葉子節點是基礎。

如何通過默克爾樹驗證交易

?看下面一幅圖:

consensus-png

假設我們要驗證區塊中存在Hash值為9Dog:64(綠色框)的交易,我們僅需要知道1FXq:18、ec20、8f74(黃色框)即可計算出781a、5c71與Root節點(藕粉色框)的雜湊,如果最終計算得到的Root節點雜湊與區塊頭中記錄的雜湊(6c0a)一致,即代表該交易在區塊中存在。這是因為我上文提到的兩個點,一個是默克爾樹是從下往上逐層計算的,所以只要知道相鄰的另一個節點的hash值就可以一直往上計算直到根節點,另一個是根節點的hash值可以準確的作為一組交易的唯一摘要,依據這兩點就可以來驗證一筆交易是否存在。

比特幣中的默克爾樹

比特幣中的默克爾樹如下:

consensus-png

區塊頭中包含父區塊的hash,版本,時間戳,難道,隨機數以及當前區塊的Merkel根。區塊體中則是當前區塊交易的樹。

有一點需要提的就是在位元網路中的Merkle樹是二叉樹,所以它需要偶數個葉子節點。如果僅有奇數個交易需要歸納,那最後的交易就會被複制一份以構成偶數個葉子節點,這種偶數個葉子節點的樹也被稱為平衡樹。

默克爾樹的典型應用場景

默克爾樹比較典型的應用場景就是P2P下載。在點對點網路中資料傳輸的時候,會同時從多個機器上下載資料,而且很多機器可以認為是不穩定或者不可信的。為了校驗資料的完整性,較好的辦法是把大的檔案分割成小的資料塊(例如,把分割成2K為單位的資料塊)。這樣的好處是,如果小塊資料在傳輸過程中損壞了,那麼只要重新下載這一快資料就行了,不用重新下載整個檔案。

除了P2P下載外,默克爾樹還可以被用來快速比較大量的資料,因為當兩個默克爾樹根相同時,則意味著所代表的資料必然相同。還有就是可以用來實現零知識證明(零知識證明指的是證明者能夠在不向驗證者提供任何有用的資訊的情況下,使驗證者相信某個論斷是正確的。