Space and Time Blog | 理解何謂 Merkle Tree 默克爾樹

在本文中,我將探討 Merkle Tree(默克爾樹)這種數據結構。

Merkle Tree Meme
Merkle Tree Meme

簡介

默克爾樹在比特幣區塊鏈中得到了最為普及的應用。它們是樹狀的數據結構,其中每個節點都是其子節點的加密哈希值。位於樹的頂部的 Merkle Root(Merkle 根)代表整個數據集。

默克爾樹是一個碰撞抗性哈希函數,表示為 𝖬𝖧𝖳,它接受 n 個輸入(x1、x2、...、xn),並輸出一個 Merkle Root 哈希值 h=𝖬𝖧𝖳(x1、x2、...、xn)。

默克爾樹用於存儲和驗證交易。交易首先個別哈希,然後分組成對,再將其哈希成新的節點。這個過程重複進行,直到只剩下一個節點,即 Merkle Root。

驗證者擁有根節點哈希 H,可以給它一個與 xi 相關的 Merkle 證明,證明 xi 是用於計算 h 的第 i 個輸入。

創建默克爾樹

我們可以通過一個例子來開始創建 Merkle Tree。例如,有一個輸入數組 A = (x1, x2, x3, x4, x5, x6, x7, x8),其中有 8 個元素。要從這個數組中創建 Merkle Tree,可以按照以下步驟進行:

  1. 把輸入數組兩兩配對

  2. 對每一對數據作一次密碼學哈希,得到一個新的哈希值,這個哈希值將作為子節點的哈希值

  3. 如果有奇數個數據,則把最後一個數據視為一個數據對,其哈希值與自己相同

  4. 重複步驟 1 和步驟 2,直到僅剩一個根節點,這個根節點的哈希值就是 Merkle Tree 的根哈希值

當然,密碼學哈希函數 H 必須是碰撞抗性的,即對於任意兩個不同的輸入 x 和 x',計算 H(x) 和 H(x') 所需要的時間應該相當長,並且不可能在這個生命中找到兩個不同的輸入 x 和 x',使得它們的哈希值相同(即 H(x)=H(x'))。

post image

默克爾樹驗證

從數學上來看,Merkle Hash Tree 可以表示如下:

Merkle root = MHT(x1, x2, … , x8)
= h(
h(
h( h(x1), h(x2) ), h( h(x3), h(x4) ) ),
h(
h( h(x5), h(x6) ), h( h(x7), h(x8) )
)
)

這再次向我們展示了 Merkle 樹的遞歸性。

現在,假設我們得到了一個輸入 x*,並且被問及它是否屬於用於創建 Merkle 樹的數組。

我們可以使用 Merkle 哈希樹的部分並填寫下面的空白以獲得 Merkle 根節點。現在,如果 Merkle 根節點與原始的 Merkle 根節點匹配,那麼我們可以絕對肯定地說 x* 屬於第五個位置的數組中。

post image

Merkle Trees 的優點

使用 Merkle Trees 在區塊鏈中有幾個優勢。首先,它允許有效的交易驗證。節點不需要驗證每個交易,只需驗證代表整個數據集的 Merkle root 即可。

其次,它允許交易以緊湊的方式存儲。Merkle tree 允許僅存儲 Merkle root,而不是將所有交易存儲在一個區塊中,這使得存儲更小。

最後,Merkle tree 允許快速同步節點。當新節點加入網絡時,它只需要請求 Merkle root,而不是整個數據集,這使得同步更快,更高效。

Merkle Trees 的缺點

雖然 Merkle Trees 為區塊鏈技術提供了多種好處,但還有一些潛在問題需要考慮。

一個問題是碰撞攻擊的可能性,即兩個不同的數據集產生相同的 Merkle root。這可能會讓惡意用戶在不被檢測到的情況下篡改數據。

另一個問題是可能的 51% 攻擊,即單個實體或群體控制網絡的大部分計算能力。在這種情況下,攻擊者可能會修改 Merkle tree 中的交易及其相應的哈希,而網絡將其視為有效。

需要注意的是,儘管存在這些問題,但它們不一定會使 Merkle Trees 失效。正確的實施和安全措施可以幫助減輕這些風險,確保區塊鏈的完整性。

結論

除了區塊鏈之外,Merkle 樹還可以用於檢測從惡意渠道下載的任何文件的惡意或意外修改。

雖然 Merkle 樹是在區塊鏈技術中存儲和驗證數據的廣泛使用和有效方法,但也有一些替代方法。

其中一種方法是使用稀疏 Merkle 樹,它們類似於常規 Merkle 樹,但僅存儲樹的非空葉子。這可以減少存儲要求並在某些情況下提高效率。

有 n 個葉子的 Merkle 樹具有 O(log2 n) 大小的證明。在大型樹中,傳送證明可能會佔用帶寬消耗。向量承諾(VC)是 Merkle 樹的一個潛在替代方法,具有恆定大小的證明。

Space and Time 是一個去中心化的數據倉庫,也受到了 Merkle 樹等各種方法的啟發。然而,Proof of SQL 具有自己的實現,用於解決分散化的問題。我們的證明團隊一直在努力創建一種可持續的方法,改進 Merkle 樹並使用 zk-SNARKs 的各種方法。我們很快會在這方面寫更多的內容。

最終,選擇區塊鏈系統的數據結構將取決於網絡的具體需求和要求。Merkle 樹仍然是許多區塊鏈應用的流行和有效選擇,但在某些情況下,其他選擇可能更適合。