Evm

Q: selfdestructextcodesize 不為零

  • November 18, 2021

我遇到了一個 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 之後返回一個非零賬戶。

這實際上是一種合乎邏輯的行為,因為你必須考慮到恢復的可能性,而且如果你決定自毀,你不能在交易過程中讓另一個合約處於不穩定狀態。在狀態承諾之前,自毀合約仍然是完全可訪問的。

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