自毁合约 selfdestruct

本章讲解在 Solidity 中,如何使用 selfdestruct 函数销毁一个合约。

官网binschool.app
推特@BinSchool    DiscordBinDAO   微信:bkra50 

selfdestruct 是以太坊提供的一个自毁合约的指令,可以用来删除已经部署的智能合约,并将该合约中的 ETH 转到指定地址。

selfdestruct 是为了解决合约存在缺陷的极端情况,而设计的紧急补救措施。

Solidity 语言中 selfdestruct 的使用语法:

selfdestruct(receiver);

其中地址 receiver 是接收合约中 ETH 的地址。

智能合约跟外部账户 EOA 一样,也可以用来保存 ETH。所以,当销毁一个合约时,可以指定一个地址来接收合约中保存的 ETH

下面是一个使用自毁函数的合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract DestructContract {
  // 状态变量
  string public data = "BinSchool.app";

  function destruct() external {
      // 调用 selfdestruct 销毁合约,并将里面的 ETH 转给调用者
      selfdestruct(payable(msg.sender));
  }

  // 确保合约可以接收 ETH
  receive() external payable {}
}

在合约中,我们定义了一个public 状态变量 data,用于测试合约自毁后状态变量的变化。其中的 destruct 函数用于合约自毁,并把 ETH 转给调用者。

我们把合约代码复制到 Remix,并进行部署。

首先,我们向合约中转入 1 ETH,此时合约的账户余额为 1 ETH。状态变量 data 的值为 "BinSchool.app"

 

然后,调用 destruct 函数,我们可以看到合约的账户余额变为了 0,状态变量 data 的值也无法查看了。

 

自毁合约指令 selfdestruct 为合约拥有者,提供了一种在紧急情况下保护资产的手段,通常只有合约拥有者有权调用。所以,我们要在智能合约中使用自毁指令,就必须合理规划函数的使用权限。