什麼是默克爾樹?
80年代初,著名的公鑰密碼學領域的電腦科學家拉爾夫·默克爾(Ralph Merkle)提出了默克爾樹概念。
默克爾樹結構能有效驗證數據集的完整性,在需要參與者共享並獨立驗證信息的點對點網絡中更能發揮效用。
哈希函數是默克爾樹結構的核心。因此,我們建議大家先了解什麼是哈希運算,然後再繼續閱讀本文。
默克爾樹的工作原理是什麼?
假設您想要下載一個大型文件。使用開源軟件下載,通常需要檢查下載文件的哈希值是否與開發人員公開的相匹配。如果匹配則說明兩份文件一致。
如果哈希值不匹配,那就遇到麻煩了。要麼您下載了偽裝成軟件的惡意文件,要麼您就是下載不正確,最終結果都是文件不可用。如果下載不正確,您的心情肯定煩躁,畢竟等待文件下載已經耗費很長時間。現在重頭來過,還得期望不再出現同樣的問題。
您是否考慮過,有沒有更簡單的方法解決這個問題?這正是默克爾樹的用武之地。默克爾樹能將文件分解為多個數據塊。例如,50GB的文件可以分解為100份,每份大小為0.5GB。隨後,就能逐份下載。這就是種子文件的原理。
此時的文件源就是一個哈希值,稱之為默克爾根。這個單一哈希值代表了組成文件的所有數據塊。而且,默克爾根能讓數據驗證變得更加簡單。
比特幣中為何使用默克爾根?
默克爾樹的用例不算少,但本文着重討論它在區塊鏈中發揮的重要作用。比特幣和眾多加密貨幣都離不開默克爾樹。默克爾樹是每個區塊的組成部分,通常位於區塊頭。通過區塊中每筆交易的交易哈希值(TXID),我們就能獲得樹葉。
在這種情況下,默克爾根有多種用途。我們來看看默克爾根在加密貨幣挖礦和交易驗證中的應用。
挖礦
比特幣區塊由兩部分組成。第一部分為區塊頭,大小固定,包含區塊元數據。第二部分為區塊體,大小可變,但通常比區塊頭要大得多,包含交易列表。
礦工需重複哈希運算數據,直至產出符合特定條件的結果,才能挖出有效區塊。為了獲得正確結果,他們需要進行數萬億次嘗試。每次嘗試時,礦工改變區塊頭的隨機數,即Nonce值,以此生成不同的結果。然而,區塊的其他部分保持不變,其中的數千筆交易,每次仍需哈希運算。
默克爾根則大大簡化了這個流程。開始挖礦時,所有的交易列隊打包並構建為默克爾樹,生成的32位根哈希值放入區塊頭。隨後,無需再對整個區塊進行哈希運算,只要針對區塊頭運算即可。
這種方式能防止數據篡改,因此切實有效,能夠讓區塊的所有交易以緊湊的形式進行高效匯總。有效區塊頭的交易列表無法修改,否則將改變默克爾根。區塊發送至其他節點後,將從交易列表中計算根哈希值。如果與區塊頭中的數值不匹配,則可拒絕該區塊。
驗證
我們還可以使用默克爾根另一個有意思的屬性,這關係到輕量級客戶端(沒有保存完整區塊鏈副本的節點)的應用。如果您是在資源有限的設備中運行節點,肯定不希望下載區塊中的所有交易並對其進行哈希運算。相反,您只需索要默克爾證明,即由全節點提供的證明交易被計入到特定區塊的證據。這個證明更為人熟知的名稱是“簡單支付驗證”或SPV,由中本聰在比特幣白皮書中進行了詳細說明。
總結
默克爾樹已經證明了自己在電腦科學應用領域的重要作用,正如我們所見,它在區塊鏈中也頗具價值。默克爾樹讓分佈式系統中的信息驗證變得更加方便,避免了網絡中冗餘數據的擁堵。
如果沒有默克爾樹和默克爾根,比特幣和其他加密貨幣區塊不會像如今這般緊湊。雖然輕量級客戶端在隱私和安全性方面缺乏優勢,但有了默克爾證明,用戶就能以最低的費用來驗證交易是否計入了區塊。