什麼是默克爾樹?

Merkle 樹的概念是由 Ralph Merkle 在 80 年代初提出的,他是一位因公鑰密碼學研究而聞名的電腦科學家。

Merkle 樹是一種用於有效驗證集合中資料完整性的結構。它們在點對點網路的背景下特別有趣,參與者需要共享和獨立驗證資訊。

雜湊函數是 Merkle 樹結構的核心,因此我們建議您查看什麼是雜湊?在繼續之前。


梅克爾樹如何運作?

假設您要下載一個大檔案。對於開源軟體,您通常需要檢查您下載的檔案的雜湊值是否與開發人員公開的雜湊值相符。如果是這樣,您就知道您電腦上的文件與他們的文件完全相同。

如果哈希值不匹配,就有問題了。您要么下載了偽裝成該軟體的惡意文件,要么該文件未正確下載,因此無法運行。如果是後者,如果您必須等待一段時間才能下載文件,您可能不會太高興。現在,您需要重新啟動該進程並希望它不會再次損壞。

你想,如果有更簡單的方法來解決這個問題就好了。幸運的是,這就是梅克爾樹的用武之地。如果是 50GB 的文件,您可以將其分成一百個部分,每個部分的大小為 0.5GB。然後,它會被一塊一塊地下載。這本質上就是您下載 torrent 檔案時所做的事情。

在這種情況下,您的消息來源將為您提供一個稱為 Merkle 根的雜湊值。這個哈希值代表了組成檔案的每個資料塊。但 Merkle 根使得驗證資料變得更加容易。

為了簡單起見,我們舉一個例子,我們使用一個分成八塊的 8GB 檔案。將不同的片段稱為 A 到 H。

We pass each of our eight fragments through a hash function to get their hashes.

我們將八個片段中的每一個都通過哈希函數來獲取它們的哈希值。


好的,我們得到了一些更有意義的東西。我們有所有片段的雜湊值,因此如果其中一個片段有問題,我們可以透過將其與來源片段進行比較來知道,對嗎?有可能,但這也非常低效。如果您的檔案有數千個片段,您真的要對所有片段進行雜湊處理並仔細比較結果嗎?

不。所以我們對 hA + hB、hC + hD、hE + hF 和 hG + hH 進行哈希處理。我們最終得到四個哈希值。然後我們對這些進行另一輪哈希,最終得到兩個。最後,我們對剩下的兩個進行散列以獲得我們的主散列 – Merkle 根(或根散列)。

The structure looks like an upside-down tree. On the bottom row, we have the leaves, which are combined to produce the nodes and, finally, the root.

該結構看起來像一棵倒置的樹。在底行,我們有葉子,它們組合起來產生節點,最後產生根。


現在我們有了代表我們下載的檔案的 Merkle 根。我們可以將此根雜湊與來源提供的根雜湊進行比較。如果匹配的話就完美了!但如果哈希值不同,我們就可以確定資料已被修改。換句話說,一個或多個片段產生了不同的雜湊。因此,對數據的任何輕微修改都會給我們一個完全不同的 Merkle 根。

幸運的是,我們有一個方便的方法來檢查哪個片段有問題。在我們的例子中,假設是 hE。首先,您可以向對等方詢問產生 Merkle 根的兩個雜湊值(hABCD 和 hEFGH)。你的值 hABCD 應該與他們的值匹配,因為該子樹中沒有錯誤。但 hEFGH 不會,所以你知道要在那裡檢查。然後您請求 hEF 和 hGH,並將它們與您的進行比較。 hGH 看起來很好,所以你知道 hEF 是我們的罪魁禍首。最後,比較 hE 和 hF 的雜湊值。現在您知道 hE 不正確,因此您可以重新下載該區塊。

總而言之,Merkle 樹是透過將資料分成許多區塊來創建的,然後將這些區塊重複哈希以形成 Merkle 根。然後,您可以有效地驗證某條資料是否出現問題。正如我們將在下一節中看到的,還有其他有趣的應用程式。


想要開始使用加密貨幣?在幣安購買比特幣!


為什麼比特幣使用 Merkle 根?

Merkle 樹有一些用例,但在這裡我們將重點關注它們在區塊鏈中的重要性。梅克爾樹在比特幣和許多其他加密貨幣中至關重要。它們是每個區塊不可或缺的組成部分,可以在區塊頭中找到它們。為了獲取樹的葉子,我們使用區塊中包含的每筆交易的交易哈希(TXID)。

在這種情況下,梅克爾根有幾個用途。讓我們來看看它們在加密貨幣挖礦和交易驗證方面的應用。


礦業

比特幣區塊由兩個部分組成。第一部分是塊頭,一個包含塊元資料的固定大小的段。第二部分是交易列表,其大小可變,但往往比標頭大得多。

礦工需要重複雜湊資料以產生符合某些條件的輸出來挖掘有效區塊。他們可以進行數萬億次嘗試才能找到答案。每次嘗試,他們都會更改區塊頭中的隨機數(隨機數)以產生不同的輸出。但該街區的大部分內容保持不變。可能有數千筆交易,但您仍然需要每次都對它們進行哈希處理。

Merkle 根大大簡化了這個過程。當您開始挖掘時,您將要包含的所有交易排列並建立默克爾樹。您將產生的根雜湊(32 位元組)放入區塊頭中。然後,當你挖礦時,你只需要哈希區塊頭,而不是整個區塊。

這是有效的,因為它是防篡改的。您以緊湊的格式有效地總結了該區塊的所有交易。你無法找到有效的區塊頭並隨後更改交易列表,因為這會更改 Merkle 根。當區塊被傳送到其他節點時,它們從交易列表中計算根。如果它與標頭中的不匹配,他們就會拒絕該區塊。


確認

我們可以利用梅克爾根的另一個有趣的特性。這涉及輕客戶端(不持有區塊鏈完整副本的節點)。如果您在資源有限的裝置上執行節點,您不想下載並散列一個區塊的所有交易。相反,您可以做的只是請求 Merkle 證明 - 由完整節點提供的證據,證明您的交易位於特定區塊中。這通常被稱為簡化支付驗證(SPV),中本聰在比特幣白皮書中對此進行了詳細介紹。

To check hD, we only need the hashes shown in red.

要檢查 hD,我們只需要紅色顯示的雜湊值。


考慮這樣的場景:我們想要了解 TXID 為 hD 的交易資訊。如果給我們提供了hC,我們就可以計算出hCD。然後,我們需要hAB來計算hABCD。最後,使用 hEFGH,我們可以檢查產生的 Merkle 根是否與區塊頭中的 Merkle 根相符。如果是的話,就證明該交易已包含在區塊中——幾乎不可能用不同的數據創建相同的哈希值。

在上面的例子中,我們只需要哈希三次。如果沒有梅克爾證明,我們就需要做七次。由於目前的區塊包含數千筆交易,因此使用 Merkle 證明可以節省我們大量的時間和運算資源。


結束語

梅克爾樹已經證明自己在一系列電腦科學應用中非常有用——正如我們所見,它們在區塊鏈中具有難以置信的價值。在分散式系統中,梅克爾樹可以輕鬆驗證訊息,而不會用不必要的數據淹沒網路。

如果沒有 Merkle 樹(和 Merkle 根),比特幣和其他加密貨幣的區塊將不會像今天這樣緊湊。雖然輕客戶端在隱私和安全方面缺乏,但 Merkle 證明使用戶能夠以最小的開銷檢查他們的交易是否已包含在區塊中。