Skip to content

Latest commit

 

History

History
54 lines (38 loc) · 2.26 KB

File metadata and controls

54 lines (38 loc) · 2.26 KB

删除合约

selfdestruct 删除智能合约,并将删除后该合约剩余ETH转到指定地址。

selfdestructv0.8.18 版本就废弃,由于目前还没有代替方案,目前只是对开发者做了编译阶段的警告,相关内容可以查看 EIP-6049

然而,在以太坊坎昆(Cancun)升级中,EIP-6780被纳入升级以实现对Verkle Tree更好的支持。EIP-6780减少了SELFDESTRUCT操作码的功能。根据提案描述,当前SELFDESTRUCT仅会被用来将合约中的ETH转移到指定地址,而原先的删除功能只有在合约创建-自毁这两个操作处在同一笔交易时才能生效。所以目前来说:

  1. 已经部署的合约无法被SELFDESTRUCT了。
  2. 如果要使用原先的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;
    }
}