以太坊資料結構MPT

2021-09-27 09:18:28 字數 2615 閱讀 5486

鏈客,專為開發者而生,有問必答!

trie字典樹

trie樹,又稱字首樹或字典樹,是一種有序樹,用於儲存關聯陣列,其中的鍵通常是字串。乙個節點的所有子孫都有相同的字首,也就是這個節點對應的字串,而根節點對應空字串。

上圖是一棵trie樹,表示了字串集合 ,從上圖中我們可以看出trie樹的特點:

根節點不包含字元,除根節點外的每乙個子節點都包含乙個字元。

從根節點到某乙個節點,路徑上經過的字元連線起來,為該節點對應的字串。

每個節點的所有子節點包含的字元互不相同。

但是從上面的結構也可以看出乙個問題:高度不可控,如下圖所示。所以就有了patricia樹(壓縮字首樹),後面會介紹到

merkle tree

merkle tree,也被稱為hash tree,中文名稱:默克爾樹,主要用於資料集較大時的檔案校驗。其主要特點為:

葉節點儲存著資料塊的hash(如:檔案塊、一段資料集)

非葉子節點(包括中間節點和根節點)儲存著對應子節點hash值串聯字串之後的hash值。

解釋:1、在最底層,和雜湊列表一樣,我們把資料分成小的資料塊,有相應地雜湊和它對應;

2、往上走,並不是直接去運算根雜湊,而是把相鄰的兩個雜湊合併成乙個字串,然後運算這個字串的雜湊,這樣每兩個雜湊就結婚生子,得到了乙個」子雜湊「。如果最底層的雜湊總數是單數,那到最後必然出現乙個單身雜湊,這種情況就直接對它進行雜湊運算,所以也能得到它的子雜湊再往上推,依然是一樣的方式,可以得到數目更少的新一級雜湊,

3、最終必然形成一棵倒掛的樹,到了樹根的這個位置,這一代就剩下乙個根雜湊了,我們把它叫做 merkle root。

patricia tree

patricia樹,或稱patricia trie,或crit bit tree,壓縮字首樹,是一種更節省空間的trie。對於基數樹的每個節點,如果該節點是唯一的兒子的話,就和父節點合併。

mpt(merkle patricia tree)

上面我們介紹了merkle tree和patricia tree,而mpt(merkle patricia tree),顧名思義就是這兩者的結合。mtp樹種的節點包含空節點、葉子節點、擴充套件節點和分支節點。

nibble:它是key的基本單元,是乙個四元組(四個bit位的組合例如二進位制表達的0010就是乙個四元組)

空節點**:簡單的表示空,在**中是乙個空串。

葉子節點(leaf):只有兩個元素,分別為key和value,表示為key,value的乙個鍵值對,其中key是key的一種特殊十六進製制編碼,value是value的rlp編碼。

擴充套件節點(extension):也是key,value的乙個鍵值對,但是這裡的value是其他節點的hash值,這個hash可以被用來查詢資料庫中的節點。也就是說通過hash鏈結到其他節點。

分支節點(branch):分支節點有17個元素,回到nibble,四元組是key的基本單元,四元組最多有16個值。所以前16個必將落入到在其遍歷中的鍵的十六個可能的半位元組值中的每乙個。第17個是儲存那些在當前結點結束了的節點(例如, 有三個key,分別是 (abc ,abd, ab) 第17個字段儲存了ab節點的值)

這裡還有一些知識點需要了解的,為了將mpt樹儲存到資料庫中,同時還可以把mpt樹從資料庫中恢復出來,對於extension和leaf的節點型別做了特殊的定義:如果是乙個擴充套件節點,那麼字首為0,這個0加在key前面。如果是乙個葉子節點,那麼字首就是1。同時對key的長度就奇偶型別也做了設定,如果是奇數長度則標示1,如果是偶數長度則標示0。

以太坊的每乙個區塊頭,並非只包含一棵mpt樹,而是包含了三棵mpt樹,分別對應了四種物件:

state trie 區塊頭中的狀態樹

key => sha3(以太坊賬戶位址address)

value => rlp(賬號內容資訊account)

transactions trie 區塊頭中的交易樹

key => rlp(交易的偏移量 transaction index)

每個塊都有各自的交易樹,且不可更改

receipts trie 區塊頭中的收據樹

key = rlp(交易的偏移量 transaction index)

每個塊都有各自的交易樹,且不可更改

storage trie 儲存樹

儲存只能合約狀態

每個賬號有自己的storage trie

mpt樹種還有乙個重要的概念:特殊的十六進製制字首(hex-prefix, hp)編碼來對key編碼,我們先來了解一下編碼定義規則:

raw 原始編碼,對輸入不做任何變更

hex 十六進製制編碼

輸入key結尾為0x10,則去掉這個終止符

key之前補乙個四元組這個byte第0位區分奇偶資訊,第1位區分節點型別

如果輸入key的長度是偶數,則再新增乙個四元組0x0在flag四元組後

將原來的key內容壓縮,將分離的兩個byte以高四位低四位進行合併

十六進製制字首編碼相當於乙個逆向的過程,比如輸入的是6 2 6 15 6 2 16,根據第乙個規則去掉終止符16。根據第二個規則key前補乙個四元組,從右往左第一位為1表示葉子節點,從右往左第0位如果後面key的長度為偶數設定為0,奇數長度設定為1,那麼四元組0010就是2。根據第三個規則,新增乙個全0的補在後面,那麼就是20.根據第三個規則內容壓縮合併,那麼結果就是0x20 0x62 0x6f 0x62

以太坊之二以太坊資料結構

2.1 本地資料結構 下圖是本地儲存的以太坊資料結構 block represents an entire block in the ethereum blockchain.type block struct 肖老師說對於本節課只有前三項是有效的 header 指向區塊鏈塊頭的指標 uncles 指...

3 10 以太坊 solidity資料結構詳解

1.solidity資料結構 陣列 列舉 對映 字典 結構體 a.列舉型別 enums i.列舉型別是在solidity中的一種使用者自定義型別。他可以顯示的轉換與整數進行轉換,但不能進行隱式轉換。顯示的轉換會在執行時檢查數值範圍,如果不匹配,將會引起異常。列舉型別應至少有一名成員。ii.與其它程式...

以太坊的資料儲存結構

區塊分為兩部分,即區塊頭和區塊體。區塊頭就是以太坊中的區塊鏈部分。它儲存了前乙個區塊 也可稱為父區塊 的雜湊值,通過區塊頭的連線形成了一條由密碼學背書的鏈。區塊體包含了此區塊中記錄的一系列交易,以及叔塊 ommer 區塊頭列表。區塊頭的結構如下圖所示 其中交易樹和收據樹是merkle樹,狀態樹是me...