# Solidity极简入门: 26. 删除合约

By [0xAA](https://paragraph.com/@wtfacademy) · 2022-05-16

---

我最近在重新学solidity，巩固一下细节，也写一个“Solidity极简入门”，供小白们使用（编程大佬可以另找教程），每周更新1-3讲。

欢迎关注我的推特：[@0xAA\_Science](https://twitter.com/0xAA_Science)

WTF技术社群discord，内有加微信群方法：[链接](https://discord.gg/5akcruXrsk)

所有代码和教程开源在github（1024个star发课程认证，2048个star发社群NFT）: [github.com/AmazingAng/WTFSolidity](https://github.com/AmazingAng/WTFSolidity)

* * *

`selfdestruct`
--------------

`selfdestruct`（自毁）命令可以用来删除智能合约，并将该合约剩余`ETH`转到指定地址。`selfdestruct`是为了应对合约出错的极端情况而设计的。它最早被命名为`suicide`（自杀），但是这个词太敏感。为了保护抑郁的程序员，改名为`selfdestruct`。

### 如何使用`selfdestruct`

`selfdestruct`使用起来非常简单：

    selfdestruct(_addr)；
    

其中`_addr`是接收合约中剩余`ETH`的地址。

### 例子

    contract DeleteContract {
    
        uint public value = 10;
    
        constructor() payable {}
    
        receive() external payable {}
    
        function deleteContract() external {
            // 调用selfdestruct销毁合约，并把剩余的ETH转给msg.sender
            selfdestruct(payable(msg.sender));
        }
    
        function getBalance() external view returns(uint balance){
            balance = address(this).balance;
        }
    }
    

在`DeleteContract`合约中，我们写了一个`public`状态变量`value`，两个函数：`getBalance()`用于获取合约`ETH`余额，`deleteContract()`用于自毁合约，并把`ETH`转入给发起人。

部署好合约后，我们向`DeleteContract`合约转入1 `ETH`。这时，`getBalance()`会返回1 `ETH`，`value`变量是10。

当我们调用`deleteContract()`函数，合约将自毁，所有变量都清空，此时`value`变为默认值`0`，`getBalance()`也返回空值。

总结
--

`selfdestruct`是智能合约的紧急按钮，销毁合约并将剩余`ETH`转移到指定账户。当著名的`The DAO`攻击发生时，以太坊的创始人们一定后悔过没有在合约里加入`selfdestruct`来停止黑客的攻击吧。

---

*Originally published on [0xAA](https://paragraph.com/@wtfacademy/solidity-26)*
