應用密碼學

默克爾帕特里夏字典樹

默克爾帕特里夏字典樹(MPT)是以太坊用來把整個世界狀態——每個帳戶的餘額、nonce、程式碼雜湊與儲存——承諾到單一個 32 位元組根雜湊的資料結構,這個根存在於每個區塊標頭中。任何地方的狀態改動一個位元組,根就會改變,因此標頭認證了一切。

它融合了三個概念。字典樹(基數樹)以鍵的十六進位半位元組為索引,因此查找只需順著鍵的路徑往樹下走。「Patricia」路徑壓縮把冗長的單一子節點鏈收合成一個延伸節點,避免又深又稀疏又浪費的樹。而默克爾化則以每個節點 RLP 編碼的 keccak256 來引用節點,使根雜湊遞移地認證整張映射表。三種節點型態為:分支節點(17 元素陣列:16 個子節點槽加一個值)、延伸節點(共享的鍵前綴),以及葉節點(最終剩餘的鍵加上值)。

由於鍵在插入前先以 keccak256 雜湊,樹得以維持大致平衡,並抵抗試圖強迫產生深路徑的對手。任何節點都能用從葉到根的默克爾分支證明某把鍵的值,這正是 eth_getProof RPC 與輕用戶端所倚賴的。以太坊維護四個這樣的結構:一個狀態樹、每個合約一個儲存樹,外加每個區塊的交易樹與收據樹。此設計預計將被 Verkle 樹(使用 KZG 向量承諾)取代,以把證明縮到足夠小,支援無狀態用戶端。

讀寫狀態意謂著要走過並重新雜湊一條 MPT 節點路徑——這串 keccak 雜湊與 RLP 解碼正是 SLOAD 與 SSTORE 昂貴、以及帳戶證明龐大的主因。Verkle 樹正是為了解決這種證明膨脹而設計。

又稱
MPTMerkle Patricia tree