Solidity 中的 selfdestruct 是什么?

2025 年 6 月 8 日 | 5 分钟阅读

Solidity 编程语言提供了不同的预定义函数,用于加快开发人员的编程体验,其中一个这样的函数是 selfdestruct。 当开发人员想要终止任何合约时,关键字 selfdestruct 在 Solidity 智能合约中使用。

在本教程中,我们将介绍此函数的作用、其目的,并提供一个在Solidity智能合约中实现selfdestruct的示例。

什么是 selfdestruct?

“在 Solidity 中,Selfdestruct 用于从 ENM 网络终止智能合约,它会立即从 Ethereum 中删除字节码,并将剩余的合约资金发送到相应的地址帐户。”

Selfdestruct的概念始于 2016 年,当时以太坊区块链和 Solidity 仍处于早期阶段。 最早的 DAO 之一在黑客攻击中损失了 360 万个 ETH。 尽管攻击持续了许多天,因为在那个阶段 区块链 在市场上是新的,并且由于 Solidity 合约的不可变性。 在那时,没有任何方法可以销毁智能合约,因此 DAO 开发人员分叉了整个区块链以防止进一步的攻击。

为什么需要selfdestruct函数?

由于以下原因,selfdestruct 函数主要由开发人员在其智能合约中使用

  1. 提高智能合约的代码安全性。
  2. 清理空闲智能合约并立即转移剩余的以太坊代币。
  3. 在程序员想要升级其合约的情况下,Selfdestruct 非常有用。 例如,ERC-20 是以太坊网络中用于互操作性的标准代币框架。 任何不符合 ERC-20 代币标准的可替代代币都难以与其他智能合约进行联网。 以前,在这种情况下,开发人员必须将现有合约更改为新合约。 但是现在,他们可以使用 selfdestruct 函数从当前合约转移余额资金,并可以进一步创建一个具有基本功能的全新合约。
  4. 开发人员经常使用 selfdestruct 函数来保护智能合约免受区块链技术中潜在的漏洞和风险因素的影响。 无论何时,任何开发人员在其智能合约中发现安全威胁,立即调用selfdestruct函数有助于结束区块链完整性的挑战,并将其替换为安全的合约。

selfdestruct 的语法

以上语法解释如下

  • 我们声明了一个名为 destroy 的函数。 该函数被声明为 public,因此可以进一步被其子合约使用。
  • 使用地址数据类型调用参数 abc。
  • 调用 destroy 函数时,通过 apocalypse 变量指定地址

示例

使用selfdestruct的缺点

下面给出了 solidity 智能合约中selfdestruct的缺点

  1. selfdestruct函数无法恢复 ERC-20 代币,
  2. selfdestruct函数在自毁后无法重新路由代币。
  3. 通常,忘记及时沟通合约终止的开发人员在其智能合约中调用自毁函数。 即使团队及时更新,更新也可能需要一些时间才能传播。 因此,用户可能会将资金发送到已终止的合约,认为它仍然有效。 在这种情况下,资金会丢失。
  4. 使用selfdestruct的主要缺点是它只能转移以太币 (ETH)。 它不会转移任何其他 ERC-20 代币,例如符合 ERC-721 代币标准的替代币或 NFT。 一旦开发人员调用selfdestruct函数,这些剩余资产将永远无法恢复。

selfdestruct如何工作?

selfdestruct 的概念被调用来从以太坊区块链网络中删除终止合约字节码,将任何余额资金转移到给定的帐户,然后将一部分 gas 费用返还给开发人员。

通常,每个智能合约都包含以下给定的组件,即,

  1. 状态
  2. 函数。

以上两个组件在智能合约中用于定义合约行为和不同的函数。 如果您直接删除合约的字节码,它将删除包括可调用函数和不同组件在内的所有内容。 因此,使您的合约无效。

selfdestruct函数需要预定义的参数集,该参数指定用户希望合约交易费用在销毁合约后最终到达的位置。

常见问题

问题 1:一旦开发人员在其 solidity 合约中调用selfdestruct函数,资产是否永久丢失?

答案:问题的答案是否和是。 是,因为余额以太币 (ETH) 被转移到函数给出的另一个地址。 否,因为所有其他代币(除了 ETH 之外,如 ERC-20 代币)都将永久丢失。

此外,如果任何用户将资金转移到 selfdestruct 合约(即,已终止的合约),它们将不会被重定向,代币将永久丢失。

问题 2:selfdestruct是否删除合约的历史记录以及合约字节码?

答案:否,selfdestruct函数不具有从以太坊网络中删除任何智能合约历史记录的功能 - 它仅用于删除合约的字节码。

以太坊是一个运行智能合约的去中心化平台。 它是一个公共账本,其中复制、共享和同步的数字数据的数据库在地理上分布在国家、机构或多个站点,并且可供多人访问。 因此,在调用selfdestruct函数之前完成的所有数据和交易都将永久记录在链上,并且无法更改。

问题 3: 什么是负 gas?为什么它很重要?

答案:在以太坊区块链中,负 gas 被定义为区块链网络返回的费用的一部分,如果开发人员在其智能合约中调用selfdestruct函数。

负 gas 在智能合约中很重要,因为如果开发人员使用 selfdestruct 函数,那么只有以太坊会因消除区块链中的字节码而产生的交易 gas 节省(负 gas)来退还给他们。

结论

当开发人员检测到网络中的任何安全漏洞、使用新组件升级合约或消除任何不再使用的旧合约时,Self-destruct 会作为一种安全措施来删除智能合约。 虽然 Solidity 开发者社区仍在争论使用the selfdestruct函数,但不可否认的是,该函数的发明为防止许多区块链黑客攻击提供了一种有效的故障保护。 在上面的部分中,您将找到有关 self-destruct 需要了解的所有必要详细信息。 请记住,天空才是极限,所以继续练习吧!