Solidity

如果沒有寫在契約中,如何呼叫“selfdestruct”,因為文件說它是可能的

  • August 8, 2020

如文件中所述“即使合約的程式碼不包含對 selfdestruct 的呼叫,它仍然可以使用 delegatecall 或 callcode 執行該操作。” 所以我的問題是怎麼可能,我的目的是釋放由於程式碼錯誤而卡在合約中的Eth,現在沒有辦法退出

如果你的合約有一個函式可以delegatecall通過某種方式執行來提供呼叫的函式,你可以讓它在另一個合約中執行一個函式,它呼叫selfdestruct. 由於執行的函式delegatecall將在第一個合約的上下文中執行,這將自毀第一個合約。例如:

contract A {
 function kill (address payable to) public {
   selfdestruct(to);
 }
}

contract B {
 function run (address target, string calldata func, address to) public {
   target.delegatecall(abi.encodeWithSignature(func, to));
 }
}

run使用合約 A 的地址kill(address)asfunc和任何地址 as呼叫to,將導致合約 B 自毀並將乙太幣發送到 address to

run如您所見,此功能不是很安全。如果你的合約沒有內置這樣的功能,那你就不走運了,你的 ETH 不幸被卡住了。

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