Merkle 樹,也被稱為 "hash tree",是一種二叉樹的數據結構。這種樹的每個節點都是基於其子節點的一種特殊形式的 hash。具體來説,葉節點的 hash 是由存儲在那裏的數據塊(例如文件或文件的部分)生成的,而非葉節點的 hash 是由其子節點的 hash 生成的。如果 Merkle 樹只有一個節點(也就是根節點),那麼該節點的 hash 就是所有數據的 hash。
Merkle 樹的主要優點是它可以用來有效地和安全地驗證大型數據結構的內容。因為每個節點的 hash 都依賴於其子節點,所以如果數據的任何部分發生更改,這將導致 hash 的變化,從而可以輕鬆地在樹中的高層級檢測到。這使得 Merkle 樹在分佈式系統和區塊鏈技術中特別有用,因為它們需要在無法信任所有參與者的情況下驗證數據的一致性。
讓我們通過一個例子來詳細説明這個過程。假設我們有四個數據塊,我們將它們稱為 D1、D2、D3 和 D4。首先,我們為每個數據塊創建一個葉節點,並計算每個數據塊的 hash,我們將這些 hash 命名為 H1、H2、H3 和 H4。然後,我們為這些葉節點創建父節點。每個父節點的 hash 是其子節點 hash 的 hash。例如,左邊的父節點的 hash(我們將其稱為 H12)是 H1 和 H2 的連接的 hash。同樣,右邊的父節點的 hash(我們將其稱為 H34)是 H3 和 H4 的連接的 hash。
在這個例子中,我們的 Merkle 樹看起來像這樣:
H12-34
/ \
H12 H34
/ \ / \
H1 H2 H3 H4
/ / / \
D1 D2 D3 D4
H12-34 是根節點,它是整個數據結構的 hash。如果任何 Dx 發生更改,那麼相應的 Hx 也會更改,這將導致父節點和根節點的 hash 更改。
現在,假設我們想要驗證 D4 的完整性,但我們沒有整個 Merkle 樹,只有 H12-34。在這種情況下,我們需要 D4、H3、和 H12。我們可以用 D4 計算 H4,然後用 H3 和 H4 計算 H34,最後用 H12 和 H34 計算 H12-34。