Contract-Deployment
codeHash 變數值
乙太坊黃皮書中說:
codeHash:這個賬戶的 EVM 程式碼的雜湊值——如果這個地址收到一個消息呼叫,這是被執行的程式碼;它是不可變的,因此與所有其他欄位不同,它在構造後無法更改。所有這些程式碼片段都包含在狀態數據庫中,在它們相應的雜湊下,以供以後檢索。這個雜湊正式表示為 σ
$$ a $$c,因此程式碼可以表示為 b,假設 KEC(b) = σ$$ a $$C。
但是,稍後,在描述合約部署場景的合約創建部分(因此不是外部地址):
賬戶的nonce最初定義為零,餘額為傳遞的值,儲存為空,程式碼雜湊為空字元串的Keccak 256位雜湊;
聲明 codeHash 在合約部署後設置為空字元串的雜湊。
問題是:合約部署後codeHash變數中設置了什麼?在我看來,這兩個引用是矛盾的,一個聲明 codeHash 變數包含合約程式碼的雜湊,另一個聲明一個空字元串的雜湊。
我相信空字元串的雜湊只有在建構子返回正文程式碼之前才是程式碼雜湊。
我總是覺得黃皮書很難閱讀,但如果你繼續閱讀合約創建部分,就會發現有一個方程 98,它似乎顯示了程式碼散列與建構子返回的程式碼一起儲存。該等式後面的文字:
確定 σ’ 的例外情況表明,執行初始化程式碼的結果字節序列 o 指定了新創建帳戶的最終正文程式碼。