乙太坊默克爾樹解釋
這是我對乙太坊如何儲存交易的基本理解
- 為每筆交易生成一個雜湊
- 然後選擇對並為每對生成一個雜湊
- 這樣最後剩下的雜湊就變成了根
- 區塊頭包含三棵 Merkle 樹
- 維持狀態
- 維護交易
- 維護收據
- 每個塊引用其前一個塊的雜湊
- 我附上了顯示這種結構的非常常見的圖表
問題:
Block 180994 的狀態根指向 Block 180993 的狀態根的第一個左孩子。它是什麼意思,為什麼需要它?
舉個例子
第一個區塊 180993 正在進行交易,其中賬戶 98 將 30 個乙太幣傳遞給賬戶 100
第二個區塊 180994 進行交易,其中賬戶 99 將 20 個乙太幣傳遞給賬戶 100
*這將如何反映在樹中?如圖所示,是否會有類似的 Merkle 樹交叉映射?*請解釋
添加了更多細節
狀態擁有區塊鏈中所有賬戶的資訊,並不儲存在每個區塊中。狀態是從創世塊開始處理每個塊生成的。每個區塊只會修改部分狀態。
黃皮書 (pdf)中定義瞭如何生成狀態。它的定義方式使其可以用任何程式語言實現,並且所有此類實現都將生成相同的表示。
- 這意味著左側在塊 180994 中沒有被修改。它只是一個表示,記住不儲存整個狀態,只儲存根雜湊。
- 有一篇關於Ethereum 中的 Merkle Trees 的文章,我可能不能做得更好。默克爾樹的基本思想是,對於單個操作,它只會修改最小數量的節點來重新計算根雜湊。
據說乙太坊有一個基於賬戶的區塊鏈。狀態不直接儲存在每個塊中。
為了建立更好的概念理解,我們可以說所有賬戶狀態都以“狀態數據”的形式駐留在乙太坊節點本地。出於性能原因,這很常見,並假設它將儲存在 Merkle Patricia 樹中,但協議規範不需要它。黃紙指出,
世界狀態(state),是地址(160 位 標識符)和賬戶狀態(序列化為 RLP 的資料結構, 見附錄 B)之間的映射。雖然沒有儲存在區塊鏈上,但假設 實現將在修改後的 Merkle Patricia 樹中維護此映射
所以,除了區塊鏈本身,我們發現自己在處理“第二狀態”。狀態數據可以被描述為隱含的,這意味著它可以從實際的區塊鏈數據中計算出來。事務包含確定新狀態數據的所有適當欄位。與比特幣不同,乙太坊區塊包含交易列表和整個狀態樹的 Merkle 根雜湊的副本。
摘自 Gavin Wood 博士的黃皮書:
乙太坊執行時環境:(又名
ERE
) 提供給在 EVM 中執行的自治對象的環境。包括 EVM,還包括 EVM 依賴 於某些I/O
指令(包括CALL
& )的世界狀態的結構CREATE
。總而言之,狀態的儲存由乙太坊協議的客戶端實現管理。我附上了一個我創建的(過度簡化的)圖像,旨在顯示兩方之間發送交易之前和之後的狀態轉換。
就理解 Merkle Patricia 樹而言,我會向您指出任何涵蓋Radix Trees的文章的方向