來回憶下我們之前小課堂解構的區塊鏈六層模型,默克爾樹封裝在資料層,說明它是一個密碼學技術,用以保護區塊鏈的安全。
默克爾樹於1979年由美國電腦科學家拉爾夫·默克爾(Ralph Merkle)提出,本質上是一種樹狀資料結構,由資料塊、葉子節點、中間節點和根節點組成。所以,一組合,就叫“Merkle Tree”。
默克爾樹各部分的構成關係如下圖:
要得到這樣一棵默克爾樹,首先要對底部資料塊進行雜湊運算,用每個資料塊對應的雜湊值生成葉子節點。再對相鄰的2個葉子節點進行雜湊運算,得到的雜湊值生成中間節點,最後對相鄰的2箇中間節點進行雜湊運算,得到的雜湊值生成根節點。由於各類節點都是由雜湊值構成,因此默克爾樹又被稱為雜湊樹,即儲存雜湊值的樹狀資料結構。
看起來是不是很像一棵底下堆滿了禮物的聖誕樹?
雜湊運算和雜湊值
生成默克爾樹用到的雜湊運算是區塊鏈中常用的加密函式。任意大小、長度的資料經過雜湊運算後都會得到一個固定大小和長度的數值,即雜湊值。就像我們的指紋或簽名能幫助鑑別我們的身份,雜湊值也可以看成是資料的指紋或簽名,用於驗證資料的真實準確性,並具有以下特徵:
確定性
資料和雜湊值之間是確定的一一對應關係,即相同資料經過雜湊運算會得到相同的雜湊值。
不可逆性
雜湊運算的過程是不可逆的,即資料經過雜湊運算可以得到雜湊值,但不可以透過雜湊值推匯出原始運算資料,由此保證資料的隱私和安全性。比如Facebook等網站會將使用者密碼計算成雜湊值並儲存。使用者每次輸入密碼時,密碼都會被轉換成雜湊值與網站記錄的版本進行對比,從而驗證密碼是否正確。由於雜湊運算的不可逆性,網站無法從雜湊值中推匯出使用者密碼,從而保證使用者資訊保安。
統一性
即上文提到的任意大小、長度的資料經過雜湊運算後會生成大小、長度統一的雜湊值,一方面起到壓縮資料,減輕資料儲存壓力的作用,另一方面規整了雜亂無章的原資料,方便後期比對驗證。
為什麼要用默克爾樹?
由於默克爾樹本質上是由雜湊值構成的樹狀資料結構,因此也繼承了雜湊值用於保證資料安全隱私和校驗資料準確和完整性的功能,主要應用於點對點下載,例如BT下載、開源分散式控制系統Git、比特幣和以太坊區塊鏈等場景中。因為我們難以保證這些去中心化系統中的每個節點都會提供真實可信的資料,也難以避免資料在傳輸過程中出現丟失、損壞等情況,所以需要引入資料加密和校驗機制。
看到這裡,你可能已經意識到了默克爾樹其實就是將資料分割成多個小塊,進行多次雜湊運算,搭建出的一個樹狀資料結構。那為什麼要對資料進行拆分,計算出多個雜湊值用於校驗呢?這不是增加工作量了嗎?但其實這樣做是為了提高資料驗證的靈活性,資料量越大,默克爾樹的這一優勢會體現得越明顯。
試想一下,如果我們不對資料進行拆分,而是將整體計算成一個雜湊值,那當資料校驗出現問題時,我們很難分辨問題出現在哪裡,只能回過頭去對整個資料進行排查,如果資料量特別大,那麼這個錯誤排查過程無異於海底撈針。
但在默克爾樹裡,資料被拆分成多個小塊,形成了多個分支,可以根據具體情況對部分資料進行校驗,無需校驗整個資料,從而提高資料校驗的靈活性和效率。
最後總結一下默克爾樹的知識要點:
- 由雜湊值構成的樹狀資料結構
- 用於驗證驗證區塊鏈等去中心化系統中的資料的完整準確性
- 具有靈活高效驗證資料的優勢
關注萬向區塊鏈小課堂,每次增長一點區塊鏈小知識。每週四晚20點,加入萬向區塊鏈蜂巢學院線上公開課直播間,跟隨各路大佬進一步瞭解更多區塊鏈深度知識。