You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用Solidity的selfdestruct后合约是否真被删除无法收发资产

问题描述

enter image description here
我编写了Solidity代码,部署得到地址为0x583...的合约,首先向其他账户转入1ETH。在点击withdrawAllMoney前我先调用了destroySmartContract触发selfdestruct,1ETH自动发送至接收方,该流程无异常。但之后我再次向0x583...合约地址转入1ETH时,转出方的ETH被扣除,但收款方未收到对应资产。
我想咨询:调用selfdestruct后,合约是否真的被彻底删除,无法正常执行收款、转账等操作?


解答

调用selfdestruct后,合约的链上代码会被彻底清除,但合约地址本身不会被删除,这是你转账后资产丢失的核心原因,具体逻辑如下:

  • 合约销毁时,selfdestruct会执行内置逻辑:将合约当前的全部余额强制转入你预先指定的接收地址,随后清空该合约地址存储的所有代码与状态数据,你第一次执行销毁时1ETH正常到账就是这个逻辑的作用。
  • 销毁完成后,该地址就是没有任何代码的空地址,你写的所有自定义逻辑(包括收款触发的转账、receive/fallback函数等)都完全失效,不会再自动执行任何操作。
  • 以太坊网络允许用户向任意合法地址转ETH,哪怕这个地址是已经销毁的合约地址:纯ETH转账不需要触发目标地址的代码,只会直接修改对应地址的余额字段,所以你第二次转账时转出方扣款成功,交易合法上链,但这部分ETH转入空地址后没有任何代码能触发转账,就永远滞留在该地址中,没有人可以取出。

补充说明:Solidity 0.8.18版本已经将selfdestruct标记为废弃特性,后续以太坊升级后也会调整selfdestruct的实现逻辑,仅保留执行时转出当前合约余额的功能,不再支持清除合约代码,进一步避免开发者踩同类坑。

内容的提问来源于stack exchange,提问作者phuc hung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:45:06