selfdestruct
删除智能合约,并将删除后该合约剩余ETH
转到指定地址。
selfdestruct
在 v0.8.18 版本就废弃,由于目前还没有代替方案,目前只是对开发者做了编译阶段的警告,相关内容可以查看 EIP-6049。
然而,在以太坊坎昆(Cancun)升级中,EIP-6780被纳入升级以实现对Verkle Tree
更好的支持。EIP-6780减少了SELFDESTRUCT
操作码的功能。根据提案描述,当前SELFDESTRUCT
仅会被用来将合约中的ETH转移到指定地址,而原先的删除功能只有在合约创建-自毁
这两个操作处在同一笔交易时才能生效。所以目前来说:
- 已经部署的合约无法被
SELFDESTRUCT
了。 - 如果要使用原先的
SELFDESTRUCT
功能,必须在同一笔交易中创建并SELFDESTRUCT
。
selfdestruct(_addr);
_addr
是接收删除合约后该合约剩余ETH
转去的指定地址。_addr
地址不需要有receive()
或fallback()
也能接收ETH
。
在坎昆升级前,合约会被自毁。但是在升级后,合约依然存在,只是将合约包含的ETH转移到指定地址,而合约依然能够调用。
在坎昆升级后,删除功能只有在**合约创建-自毁
**这两个操作处在同一笔交易时才能生效。所以我们需要通过另一个合约进行控制。
contract DeployContract {
struct DemoResult {
address addr;
uint balance;
uint value;
}
constructor() payable {}
function getBalance() external view returns(uint balance){
balance = address(this).balance;
}
// 新的提案删除功能只有在合约 创建-自毁 这两个操作处在同一笔交易时才能生效。
function demo() public payable returns (DemoResult memory){
Helloworld del = new Helloworld{value:msg.value}(); // 创建
DemoResult memory res = DemoResult({
addr: address(del),
balance: del.getBalance(),
value: del.value()
});
del.beibei(); // 自毁
return res;
}
}