State-Trie

如果世界狀態只儲存程式碼的雜湊,那麼底層的實際程式碼儲存在哪裡?

  • December 17, 2018

如果這是一個愚蠢的問題,請提前道歉。我正在慢慢地通過乙太坊黃紙。

我說乙太坊世界狀態不包含任何 EVM 程式碼是否正確?它只包含程式碼的雜湊值,對吧?

我的構想如下:

1)世界狀態是一個聚合鍵值映射address --> 4 elements

  1. 4 個元素是:nonce, balance,storageRootcodeHash

3)這4個元素都沒有任何程式碼,最接近的是codeHash只包含程式碼的雜湊,而不是程式碼本身

那麼如果世界狀態數據庫不包含任何合約程式碼,那麼合約程式碼儲存在哪裡呢?否則,我的哪一項陳述是不正確的?

謝謝!

程式碼與其他所有內容一樣儲存在狀態數據庫中 - 作為鍵值對。使用 codeHash 而不是 code 的唯一原因是,當 nonce、balance 或 storageRoot 發生變化時,您必須將 4 重新雜湊在一起以獲得該帳戶的 root。如果您使用程式碼而不是 codeHash,則必須再次重新散列所有數據,這比僅使用永遠不會更改的 codeHash 要昂貴得多。

它還允許其他優化,例如避免為具有相同程式碼的合約多次儲存 codeHash -> 程式碼。

看起來程式碼的儲存方式與所有樹節點的儲存方式相同——在字節數組散列到字節數組本身的低級數據庫中。它不儲存在世界狀態(實現為更高級別的 Modified Merkle Patricia Tree)中,它專門是帳戶地址雜湊到帳戶狀態的映射。

引用自:https://ethereum.stackexchange.com/questions/52127