什么是Merkle Tree?
Merkle Tree 的命名來自於美國密碼學家Ralph C. Merkle ,關於他的個人資料:傳送門https://en.wikipedia.org/wiki/Ralph_Merkle。與前面講的幾種算法不同,Merkle Tree是一種樹結構,而並非具體的某種算法。
在具體講之前,簡單說一下哈希算法:
哈希算法是密碼學中一種基礎的算法,通常的特點:
1.任意的輸入值經過哈希算法都能產生固定長度的輸出。
2.輸入值的微小變化都能導致輸出值的巨大變化。
優秀的哈希算法通常還包括不能根據輸入推算出輸出。這在SHA256中有過介紹。那么Merkle Tree通常也被稱做Hash Tree,實際上一個Merkle Tree就是由hash值構成的樹結構,可以是二叉樹,也可以多叉樹,無論是幾叉樹,它都具有樹結構的所有特點;
下面這張圖就是一個典型的Merkle Tree:
通過對A進行hash運算得到的值和B經過一樣哈希得到的值在進行一次哈希運算,層層網上,最后只有一個Top hash值。這個值就被稱為 merkle root,摩爾根。
Merkle Tree在區塊鏈中的應用
在比特幣中,Merkle Tree的每個節點的值都是通過兩次SHA256算法得到的:
HA = SHA256(SHA256(Transaction A)),HB = SHA256(SHA256(Transaction B)),
那么HA&B 就是對HA和HB串聯起來在進行兩次SHA256算法。關於SHA256算法可以學習本系列的第一篇。
都知道區塊鏈是一個個區塊連起來的結果,下面是比特幣中一個區塊的結構:
每個摩爾根是多個交易的集合,區塊鏈中每個摩爾根的值都是唯一的。除此之外,merkle樹還提供了一種在比特幣網絡中快速校驗某個交易是否存在的有效途徑。
spv節點中merkle的應用
比特幣網絡中並不是每個節點都包含了全網所有的數據,為了簡化支付驗證,比特幣中存在一種spv節點,該節點不需要備份所有的數據就能驗證一筆交易。我們的手機/pad/電腦上安裝的很多錢包軟件都屬於spv節點。spv節點沒有存儲全網的區塊鏈數據,但是存儲了所有的去塊頭,這就類似於書架上沒有存所有的書的內容,但是存儲了所有的書的章節目錄。SPV節點會收到少於1KB的有關區塊頭和Merkle路徑的數據,其數據量比一個完整的區塊(目前大約有1MB)少了一千多倍。減少了存儲,又保有了交易的驗證資格。
SPV負責判斷該交易是否已經得到區塊鏈的節點共識認證以及多少次確認。
比方說想驗證下面的H(K)交易是否支付完成:
首先,節點從網絡上獲取需要驗證的交易的認證路徑,在節點上生成對應的一個路徑,該路徑的值就是圖中藍色標示的節點。在路徑確認的情況下,節點只需要計算H(KL)、H(IJKL)、H(IJKLMNOP),H(ABCDEFGHIJKLMNOP)的兩次hash值,這樣得到的一個摩爾根的副本。前面講過spv節點保存了整個區塊鏈的所有去塊頭,所以只要拿這個副本和去塊頭中的摩爾根比較。如果存在就能證明該交易支付成功。
Merkle Tree在其他領域的應用
早在區塊鏈出現之前摩爾樹就在各個領域中得到了應用。列如文件下載,目前通常采用HASH值直接驗證。但是如果下載的文件比較大,那么用戶就需要知道是什么地方的文件下載出錯,直接重新下載出錯的部分而不需要重新下載全部文件,節省了大量的時間。還有在數字簽名上的應用,git版本控制,eth。本質來講,摩爾根樹是通過一個優秀的hash算法不可逆的特性來設計出的一個樹結構,在驗證某個節點是否存在時節省了大量的計算。由此可見,一些優秀的方法應用並不是需要特別專業的技能,而是需要敏銳的觀察和結合知識的能力。所以我們期待,密碼學這座寶山,正在熠熠閃光等着廣大從業者去開采。