自毁合约 selfdestruct
本章讲解在 Solidity
中,如何使用 selfdestruct
函数销毁一个合约。
推特:@BinSchool Discord:BinDAO 微信: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
为合约拥有者,提供了一种在紧急情况下保护资产的手段,通常只有合约拥有者有权调用。所以,我们要在智能合约中使用自毁指令,就必须合理规划函数的使用权限。