目錄
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,就能檢查計算出來的梅克爾根是否與區塊頭中的根雜湊值一致。如果成功匹配,就證明交易被計入了區塊,因為要想使用不同的資料產生相同的哈希值幾乎不可能實現。
在上面的範例中,我們只進行三次雜湊運算。沒有梅克爾證明的話,則需要七次。現在的區塊包含數千筆交易,而梅克爾證明為我們節省了大量的時間和算力。
梅克爾樹已經證明了自己在電腦科學應用領域的重要作用,正如我們所見,它在區塊鏈中也頗具價值。梅克爾樹讓分散式系統中的資訊驗證變得更加方便,避免了網路中冗餘資料的擁塞。
如果沒有梅克爾樹和默克爾根,比特幣和其他加密貨幣區塊不會像如今一樣緊湊。雖然輕量級客戶端在隱私和安全性方面缺乏優勢,但有了梅克爾證明,用戶就能以最低的費用來驗證交易是否計入了區塊。