我最近在重新学以太坊opcodes,也写一个“WTF EVM Opcodes极简入门”,供小白们使用。
所有代码和教程开源在github: github.com/WTFAcademy/WTF-Opcodes
这一讲,我们介绍EVM中的SELFDESTRUCT
指令,它可以让合约自毁。这个指令可能在未来会被弃用,见EIP-4758和EIP-6049。
基本概念
EVM中的SELFDESTRUCT
指令可以让合约自行销毁,并将账户中的ETH余额发送到指定地址。这个指令一些特殊的地方:
- 使用
SELFDESTRUCT
指令时,当前合约会被标记为待销毁。但实际的销毁操作会在整个交易完成后进行。 - 合约的
ETH
余额会被发送到指定的地址,并且这一过程保证会成功的。 - 如果指定的地址是一个合约,那么该合约的代码不会被执行,即不会像平常的
ETH
转账执行目标地址的fallback
方法。 - 如果指定的地址不存在,则会为其创建一个新的账户,并存储这些ETH。
- 一旦合约被销毁,其代码和数据都会永久地从链上删除,无法恢复。销毁合约可能会影响到与它互动的其他合约或服务。
SELFDESTRUCT
指令的工作流程如下:
- 从堆栈中弹出接收
ETH
的指定地址。 - 将当前合约的余额转移到指定地址。
- 销毁合约。
下面,我们在极简EVM中实现SELFDESTRUCT
指令:
测试
- 自毁当前合约,并将余额转移到新地址。
总结
这一讲,我们介绍了EVM中销毁合约的SELFDESTRUCT
指令,它可以自毁合约并且将其剩余的ETH
强行发送到另一个地址。该指令将会在未来被弃用,大家尽量不要使用。现在,我们已经学习了144个操作码中的143个(99%),仅剩一个了!