EvmQ:
Q: selfdestruct
後extcodesize
不為零
我遇到了一個 EVM 邊緣案例。在同一事務中
extcodesize(addr)
呼叫後不為零是否正確?selfdestruct``addr
這種行為似乎很奇怪,我找不到任何文件。
我能夠在 Remix 上使用以下程式碼重現您的問題(您可以檢查
extcodesize
在同一 tx 或後續呼叫中呼叫之間的不同行為)pragma solidity ^0.8.10; contract Test { SelfDestruct instance; constructor() { redeploy(); } function redeploy() public { instance = new SelfDestruct(); } function killInstanceAndGetCodeSize() public returns (uint256) { killInstance(); return getCodeSize(); } function killInstance() public { instance.kill(); } function getCodeSize() public view returns (uint256 codeSize) { address addr = address(instance); assembly { codeSize := extcodesize(addr) } } } contract SelfDestruct { function kill() public { selfdestruct(payable(address(0))); } }
這種行為的原因可以通過查看 selfdestruct 的geth 實現來解釋。
// 賬戶的狀態對像在狀態送出之前仍然可用, // getStateObject 將在 Suicide 之後返回一個非零賬戶。
這實際上是一種合乎邏輯的行為,因為你必須考慮到恢復的可能性,而且如果你決定自毀,你不能在交易過程中讓另一個合約處於不穩定狀態。在狀態承諾之前,自毀合約仍然是完全可訪問的。