State-Trie
如果世界狀態只儲存程式碼的雜湊,那麼底層的實際程式碼儲存在哪裡?
如果這是一個愚蠢的問題,請提前道歉。我正在慢慢地通過乙太坊黃紙。
我說乙太坊世界狀態不包含任何 EVM 程式碼是否正確?它只包含程式碼的雜湊值,對吧?
我的構想如下:
1)世界狀態是一個聚合鍵值映射
address --> 4 elements
- 4 個元素是:
nonce
,balance
,storageRoot
和codeHash
3)這4個元素都沒有任何程式碼,最接近的是
codeHash
只包含程式碼的雜湊,而不是程式碼本身那麼如果世界狀態數據庫不包含任何合約程式碼,那麼合約程式碼儲存在哪裡呢?否則,我的哪一項陳述是不正確的?
謝謝!
程式碼與其他所有內容一樣儲存在狀態數據庫中 - 作為鍵值對。使用 codeHash 而不是 code 的唯一原因是,當 nonce、balance 或 storageRoot 發生變化時,您必須將 4 重新雜湊在一起以獲得該帳戶的 root。如果您使用程式碼而不是 codeHash,則必須再次重新散列所有數據,這比僅使用永遠不會更改的 codeHash 要昂貴得多。
它還允許其他優化,例如避免為具有相同程式碼的合約多次儲存 codeHash -> 程式碼。
看起來程式碼的儲存方式與所有樹節點的儲存方式相同——在字節數組散列到字節數組本身的低級數據庫中。它不儲存在世界狀態(實現為更高級別的 Modified Merkle Patricia Tree)中,它專門是帳戶地址雜湊到帳戶狀態的映射。