以太坊,作為全球領先的智能合約平臺,其核心功能之一是存儲和管理鏈上數據,理解以太坊如何組織和存儲數據,對于開發者、節點運營者乃至任何希望深入了解其底層機制的人都至關重要,以太坊的存儲數據格式并非簡單的鍵值對堆砌,而是一套精心設計、高效且安全的體系,其核心是Merkle Patricia Trie (MPT,默克爾帕特里夏樹),本文將詳細探討以太坊的存儲數據格式,包括其核心組件MPT、賬戶模型以及具體的數據存儲結構。
核心基石:Merkle Patricia Trie (MPT)
MPT是以太坊狀態存儲、交易和收據存儲的底層數據結構,它是一種結合了Merkle Tree(默克爾樹)和Patricia Trie(帕特里夏樹,也稱為基數樹 Radix Tree)優化的數據結構。

-
Patricia Trie (基數樹):
- Patricia Trie是一種壓縮前綴樹,它通過共享公共前綴來高效存儲鍵值對,特別適合存儲像以太坊地址這樣的十六進制字符串。
- 與普通前綴樹相比,Patricia Trie能顯著減少樹的深度和節點數量,從而提高查詢效率并節省存儲空間,它將鍵值對存儲在樹的葉子節點中,內部節點則用于指導查找路徑。
-
Merkle Tree (默克爾樹):
- Merkle Tree是一種哈希樹,其特點是每個非葉子節點的值都是其所有子節點值的哈希組合。
- 這種結構帶來了一個關鍵特性:完整性驗證,通過計算根節點的哈希值(Merkle Root),可以高效地驗證任意數據塊是否被篡改,如果樹中任何一個葉子節點的數據發生變化,都會引起其所有父節點哈希值的連鎖改變,最終導致根哈希值的改變。
-
Merkle Patricia Trie (MPT)的結合優勢:
- MPT將Patricia Trie的高效查詢和存儲特性與Merkle Tree的完整性驗證能力相結合。
- 在以太坊中,每個區塊頭都包含一個狀態根(State Root)、一個交易根(Transactions Root)和一個收據根(Receipts Root),這些根就是對應MPT的根哈希值。
- 狀態根:代表整個以太坊網絡在某個區塊高度的所有賬戶狀態的MPT根哈希。
- 交易根:代表該區塊中所有交易的MPT根哈希。
- 收據根:代表該區塊中所有交易執行后產生的收據的MPT根哈希。
- 這種設計使得輕客戶端(如手機錢包)能夠高效地驗證交易是否被包含在某個區塊中,以及狀態是否發生了變化,而無需下載整個區塊鏈數據。
賬戶模型與狀態存儲
以太坊采用的是賬戶模型(Account-based Model),與比特幣的UTXO模型不同,每個賬戶都有一個唯一的地址,狀態數據就是所有賬戶信息的集合。

-
賬戶類型:
- 外部賬戶 (Externally Owned Account, EOA):由用戶私鑰控制的賬戶,用于發起交易、持有以太坊等,沒有關聯代碼。
- 合約賬戶 (Contract Account):由代碼控制,當收到特定交易時,其代碼會被執行,有關聯的代碼和存儲。
-
賬戶狀態數據結構: 每個賬戶(無論是EOA還是合約賬戶)在狀態樹中都由以下字段表示:
- nonce:
- 對于EOA:該賬戶發起的交易數量。
- 對于合約賬戶:該賬戶創建的合約數量。
- balance:賬戶持有的以太幣余額,以wei(1 ETH = 10^18 wei)為單位。
- storageRoot:僅合約賬戶有,指向該合約賬戶的存儲樹(Storage Trie)的根哈希,存儲樹用于存儲合約的持久化變量數據,它也是一個MPT,EOA的storageRoot為空。
- codeHash:僅合約賬戶有,指向該合約賬戶代碼的哈希值,EOA的codeHash是空字符串的哈希,合約代碼本身存儲在一個單獨的代碼哈希到代碼的映射中,而不是直接存在賬戶里。
- nonce:
具體數據存儲格式詳解
了解了MPT和賬戶模型后,我們可以更具體地看以太坊中不同類型數據的存儲格式:
-
狀態存儲 (State Storage):

- 整個以太坊的狀態被組織在一個全局的狀態樹(State Trie)中。
- 狀態樹的鍵是賬戶地址(經過RLP編碼后哈希)。
- 狀態樹的值是上述賬戶數據(nonce, balance, storageRoot, codeHash)的RLP編碼。
- 對于合約賬戶,其
storageRoot指向另一個MPT,即存儲樹(Storage Trie)。- 存儲樹的鍵是合約中變量的存儲槽(slot)索引(通常是一個32字節的整數,由變量位置和類型決定)。
- 存儲樹的值是對應存儲槽中存儲的數據(也是RLP編碼)。
- 這種分層設計使得每個合約的存儲是獨立的,方便管理和查詢。
-
交易存儲 (Transaction Storage):
- 每個區塊中的所有交易被組織在一個交易樹(Transactions Trie)中。
- 交易樹的鍵通常是交易在區塊中的索引(或經過特定編碼的哈希)。
- 交易樹的值是交易數據的RLP編碼,交易數據包括接收方地址、金額、nonce、有效期、數據負載、簽名等。
-
收據存儲 (Receipt Storage):
- 每個交易執行后產生的收據被組織在一個收據樹(Receipts Trie)中。
- 收據樹的鍵與交易樹的鍵對應,通常是交易在區塊中的索引。
- 收據樹的值是收據數據的RLP編碼,收據包含交易狀態(成功/失敗)、使用的gas、日志 bloom過濾器、以及交易產生的日志(Log)列表等,日志對于事件監聽非常重要。
RLP編碼:序列化的基石
無論是狀態樹、交易樹還是存儲樹,其鍵和值在存入MPT之前,都需要經過RLP (Recursive Length Prefix)編碼,RLP是以太坊中用于編碼任意嵌套的二進制數據(如字符串、列表、字節數組)的主要序列化方法,它的設計簡潔高效,能夠保持數據的原始結構,并且解碼時無需提前知道數據大小,MPT中的所有節點(包括葉子節點和擴展節點、分支節點)的鍵和值,本質上都是RLP編碼后的數據。
以太坊的存儲數據格式是一套以Merkle Patricia Trie (MPT)為核心,結合賬戶模型和RLP編碼的復雜而精妙的系統,它通過狀態樹、交易樹、收據樹以及合約存儲樹的多層MPT結構,實現了:
- 高效的數據查詢與更新:得益于Patricia Trie的壓縮特性。
- 強大的數據完整性保障:得益于Merkle Tree的哈希驗證機制,確保了鏈上數據的不可篡改性。
- 狀態同步與輕客戶端支持:通過根哈希值,輕客戶端可以高效驗證鏈上數據。
- 靈活的合約存儲:每個合約擁有獨立的存儲樹,便于管理和隔離。
理解這些底層存儲格式,不僅有助于開發者更高效地進行智能合約開發(如優化存儲成本、理解gas消耗),也能讓我們更深刻地認識到以太坊作為一個去中心化平臺的強大潛力和技術嚴謹性,隨著以太坊的不斷發展(如向以太坊2.0的演進),其存儲機制也可能持續優化,但MPT所代表的核心理念仍將是其重要基石。
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。



