默克爾樹 Merkle trees(一)

flynike發表於2021-09-09

先給大家看一段員外覺得最精闢的一段關於區塊鏈的描述:

“區塊鏈是實現無中心分散式總賬的一種技術。除了採用塊、鏈結構的典型區塊鏈以外,還有其他的方式實現分散式總賬這個需求。總賬技術的基本單元是‘交易’,整個賬本是由一條條的交易構成。‘塊’類似於賬本中的頁,每頁都記錄了若干條交易,把一頁一頁的賬頁按照時間順序裝訂起來,就形成了一個完整的賬本——‘區塊鏈’。‘塊’是交易的容器,‘塊’透過密碼學演算法相連線,形成了按照時間序列的‘鏈’。這種組織賬本的好處是由密碼學演算法保證了無法篡改鏈上的單獨交易,除非整體性的篡改。”

從上面這段描述中,我們可以發現這個“塊”才是整個區塊鏈中最核心的東西,因為它承載著整個區塊鏈的交易資料。然後用密碼學演算法把這些塊依次連線,形成了一條完整的區塊鏈。

這種資料結構的利弊

因為每一個區塊都必須前後緊密相連,所以最大的好處就是容易保持資料的完整性,想要檢索某條資料,依次往下找就好了,只能真實存在就一定能找得到。但是這樣的結構方式也暴露出來另一個問題,那就是隨著使用者的交易頻率越來越高,資料會不停增加,區塊也會不停的增多,最後導致整條鏈越來越長。

當然這種方式在最開始的比特幣系統中,是沒有什麼大的問題的,畢竟比特幣每10分鐘才產出一個塊,每個塊也就 1 M大小,即使100年後,普通的計算機也依然具備執行這些全節點的能力。但如果是資料量比比特幣大很多個數量級的公鏈來說,這樣的節點設計,將會是致命的問題。不用多久,資料量就會變得非常巨大,最後就有可能導致沒有計算機可能執行這些全節點資料。

如何解決資料量過大的問題

大家應該都遇到過這種情況,就是在購買火車票後,查詢已完成訂單的時候,如果時間過去比較久了,是需要輸入一個日期範圍才能查到的。知道為什麼要多出這一個輸入日期的步驟來嗎?

因為在12306的資料庫中,每日的資料增長量是非常之大的,如果所有的資料都存放在一個資料庫中,那這個資料庫的壓力就會越來越大,所以就需要把這些歷史資料存到其他的儲存裝置中,然後主資料庫只需要儲存使用者賬戶的最近動態即可。

但在比特幣系統中,使用的是 UTXO 方式來儲存使用者交易的,這種方式儲存下來的都是交易的過程。如果一個賬戶一直沒有交易,新產出的區塊中則不會出現這個賬戶的任何資訊。

如果按照12306這種類似的傳統資料庫記錄資料的方式的話,只要一個賬戶一直沒有進行交易,為了維護整個區塊鏈系統的密碼學完整性和安全性,這個區塊就必須保留,同時這個區塊之後的所有區塊也必須保留。

所以中本聰在設計比特幣系統的時候,就考慮到了這一點,使用默克爾樹來解決了這個問題。顧名思義就是一種樹狀的結構,只不過是倒過來的樹,樹根在最上面,枝葉則朝下。

一個區塊中有一顆默克爾樹,這個區塊中的每一筆交易都是這棵樹的每一片樹葉,然後這每一片樹葉都會有一個雜湊值。現在樹葉有了,連線樹葉的必然就是樹枝了,在員外這課默克爾樹中,規定每個樹枝只能分兩個叉,每一個樹枝都是它下面的兩個樹葉或者兩個小樹枝的雜湊值,然後層層遞迴,到最後只剩下一個樹根,這個樹根就是最後的兩個主樹幹的雜湊值。

默克爾樹結構的好處

在這顆數中,每個交易都可以單獨刪除,只需要儲存好這筆交易的雜湊值即可。這樣一來,就可以極大的減小了每個區塊的記憶體,可以存放更多的最新交易。所以在UTXO模型中,使用默克爾樹結構,就無需擔心資料的增長過大的問題了。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2618/viewspace-2810457/,如需轉載,請註明出處,否則將追究法律責任。

相關文章