目錄
什麼是默克爾樹?
默克爾樹的工作原理是什麼?
比特幣中爲何使用默克爾根?
挖礦
驗證
總結
什麼是默克爾樹?
80年代初,著名的公鑰密碼學領域的計算機科學家拉爾夫·默克爾(Ralph Merkle)提出了默克爾樹概念。
默克爾樹結構能有效驗證數據集的完整性,在需要參與者共享並獨立驗證信息的點對點網絡中更能發揮效用。
哈希函數是默克爾樹結構的核心。因此,我們建議大家先了解什麼是哈希運算,然後再繼續閱讀本文。
默克爾樹的工作原理是什麼?
假設您想要下載一個大型文件。使用開源軟件下載,通常需要檢查下載文件的哈希值是否與開發人員公開的相匹配。如果匹配則說明兩份文件一致。
如果哈希值不匹配,那就遇到麻煩了。要麼您下載了僞裝成軟件的惡意文件,要麼您就是下載不正確,最終結果都是文件不可用。如果下載不正確,您的心情肯定煩躁,畢竟等待文件下載已經耗費很長時間。現在重頭來過,還得期望不再出現同樣的問題。
您是否考慮過,有沒有更簡單的方法解決這個問題?這正是默克爾樹的用武之地。默克爾樹能將文件分解爲多個數據塊。例如,50GB的文件可以分解爲100份,每份大小爲0.5GB。隨後,就能逐份下載。這就是種子文件的原理。
此時的文件源就是一個哈希值,稱之爲默克爾根。這個單一哈希值代表了組成文件的所有數據塊。而且,默克爾根能讓數據驗證變得更加簡單。
爲了便於理解,我們舉例說明。下面將一個8GB的文件分爲八份,每個片段分別以A到H命名。隨後,每個片段代入哈希函數,得出八個不同的哈希值。

通過哈希函數,計算出八個片段的哈希值。
希望以上示例解釋還算易懂。我們有了所有片段的哈希值,如果其中一個出錯,是不是對比源文件就能找出問題呢?或許可以,但是這樣效率仍然極低。如果文件有成千上萬個片段,難道要對所有片段進行哈希運算,再細緻對比結果嗎?
不需要。我們只需組合一對哈希值,再進行合併哈希運算即可。也就是說,我們用hA + hB、hC + hD、hE + hF以及hG + hH進行哈希運算。結果會得出四個哈希值。隨後我們進行下一輪合併哈希運算,直到獲得兩個哈希值。這兩個哈希值再合併運算,最終得出主哈希值,也就是默克爾根(亦稱爲根哈希值)。

這個結構看起來像一棵倒置的樹。底部一排葉子,相互結合產生節點,最後生成根。
現在我們就得到了代表下載文件的默克爾根。將根哈希值與源文件的值進行比較,如果匹配,皆大歡喜!一旦哈希值不同,則證明數據遭到了篡改。換言之,一個或多個片段生成了不同的哈希值。因此,再小的數據修改都會徹底改變默克爾根。
幸好,要檢查出錯的片段也很方便。假設出錯的是hE。首先,我們先向他人要來生成默克爾根的兩個哈希值(hABCD和hEFGH)。我們的hABCD值應與他人的匹配,就能證明子樹沒有錯誤。如果hEFGH不匹配,我們就能從這裏糾錯。之後再詢問他人的hEF和hGH哈希值,並與自己的比較,如果hGH沒問題,則說明hEF是罪魁禍首。最後,我們比較hE和hF的哈希值,一旦發現錯誤源是hE,那就可以重新下載該數據塊。
綜上所述,默克爾樹的功能就是把數據劃分爲多份,然後反覆哈希運算,最終形成默克爾根,這樣就能有效驗證究竟是哪裏出現了錯誤數據。下一節中,我們將介紹其他的有趣應用。
想要開啓加密貨幣之旅嗎?立即前往幣安購買比特幣吧!
比特幣中爲何使用默克爾根?
默克爾樹的用例不算少,但本文着重討論它在區塊鏈中發揮的重要作用。比特幣和衆多加密貨幣都離不開默克爾樹。默克爾樹是每個區塊的組成部分,通常位於區塊頭。通過區塊中每筆交易的交易哈希值(TXID),我們就能獲得樹葉。
在這種情況下,默克爾根有多種用途。我們來看看默克爾根在加密貨幣挖礦和交易驗證中的應用。
挖礦
比特幣區塊由兩部分組成。第一部分爲區塊頭,大小固定,包含區塊元數據。第二部分爲區塊體,大小可變,但通常比區塊頭要大得多,包含交易列表。
礦工需重複哈希運算數據,直至產出符合特定條件的結果,才能挖出有效區塊。爲了獲得正確結果,他們需要進行數萬億次嘗試。每次嘗試時,礦工改變區塊頭的隨機數,即Nonce值,以此生成不同的結果。然而,區塊的其他部分保持不變,其中的數千筆交易,每次仍需哈希運算。
默克爾根則大大簡化了這個流程。開始挖礦時,所有的交易列隊打包並構建爲默克爾樹,生成的32位根哈希值放入區塊頭。隨後,無需再對整個區塊進行哈希運算,只要針對區塊頭運算即可。
這種方式能防止數據篡改,因此切實有效,能夠讓區塊的所有交易以緊湊的形式進行高效彙總。有效區塊頭的交易列表無法修改,否則將改變默克爾根。區塊發送至其他節點後,將從交易列表中計算根哈希值。如果與區塊頭中的數值不匹配,則可拒絕該區塊。
驗證
我們還能使用默克爾根另一個有意思的屬性,這關係到輕量級客戶端(沒有保存完整區塊鏈副本的節點)的應用。如果您是在資源有限的設備中運行節點,肯定不希望下載區塊中的所有交易並對其進行哈希運算。相反,您只需索要默克爾證明,即由全節點提供的證明交易被計入到特定區塊的證據。這個證明更爲人熟知的名稱是“簡單支付驗證”或SPV,由中本聰在比特幣白皮書中進行了詳細說明。

要想檢查hD,只需驗證紅色的哈希值即可。
假設,我們希望獲取關於TXID爲hD的交易信息。如果hC已知,則可以計算出hCD。然後,通過hAB,就能計算出hABCD。最後,參照hEFGH,就能檢查計算出來的默克爾根是否與區塊頭中的根哈希值一致。如果成功匹配,就證明交易被計入了區塊,因爲要想使用不同的數據生成相同的哈希值幾乎不可能實現。
在上面的示例中,我們只進行三次哈希運算。沒有默克爾證明的話,則需要七次。現在的區塊包含數千筆交易,而默克爾證明爲我們節省了大量的時間和算力。
總結
默克爾樹已經證明了自己在計算機科學應用領域的重要作用,正如我們所見,它在區塊鏈中也頗具價值。默克爾樹讓分佈式系統中的信息驗證變得更加方便,避免了網絡中冗餘數據的擁堵。
如果沒有默克爾樹和默克爾根,比特幣和其他加密貨幣區塊不會像如今這般緊湊。雖然輕量級客戶端在隱私和安全性方面缺乏優勢,但有了默克爾證明,用戶就能以最低的費用來驗證交易是否計入了區塊。

