当前位置: 首页 > news >正文

Solidity——什么是selfdestruct

selfdestruct 是 Solidity 中一个特殊的指令,用于永久销毁合约将合约余额发送给指定地址

它是以太坊虚拟机(EVM)提供的一条原始操作指令,常用于合约生命周期结束时释放资源或主动清退合约。


✅ 基本语法:

selfdestruct(payable(address));
  • 会销毁当前合约

  • 同时把合约里所有 ETH 余额 发给参数中的地址

  • 一旦执行,合约代码和存储(storage)都会从链上清除(不可逆)


🧪 示例代码:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Killable {address payable public owner;constructor() {owner = payable(msg.sender);}// 销毁合约,把余额发给 ownerfunction destroy() public {require(msg.sender == owner, "Not owner");selfdestruct(owner);}// 接收 ETHreceive() external payable {}
}

部署后:

  1. 发送 ETH 到合约

  2. 调用 destroy() → 合约被销毁,余额转给 owner,合约地址彻底失效


⚠️ 注意事项:

事项说明
合约销毁是 永久性的所有代码和状态变量都从链上删除
调用者必须是权限控制者(一般是 owner)否则可能被恶意销毁
销毁合约 不会销毁已部署代码的历史记录历史区块中仍可看到合约部署、交易
被销毁地址 不能再调用函数调用会 revert(返回空代码)
合约地址可以被重新部署(同 CREATE2)但不是通常场景

🧨 使用场景:

  1. 合约升级(旧合约 selfdestruct + 部署新合约)

  2. 合约故障退出

  3. 退款与清算逻辑(有风险)

  4. 节省链上空间(但现在用途变少)


❗️在新版本中的提示:

自 Solidity 0.8.18 起,selfdestruct 已被标为不推荐使用(deprecated),未来可能会被移除。

原因是:销毁合约带来的副作用过大,尤其在 Layer 2 和 rollup 场景中难以正确处理,因此官方建议使用“停用开关”逻辑(pause/kill flag)而不是销毁


✅ 总结一句话:

selfdestruct(address) 会销毁当前合约并把余额发给指定地址,是不可逆的链上操作,慎用!


如果你想我帮你写一个带 selfdestruct 的合约升级机制(配合代理合约),可以继续问我。

http://www.dtcms.com/a/268315.html

相关文章:

  • Java线程池知识点
  • RAG技术新格局:知识图谱赋能智能检索与生成
  • 【机器学习笔记Ⅰ】2 线性回归模型
  • 图灵完备之路(数电学习三分钟)----逻辑与计算架构
  • 在phpstudy环境下配置搭建XDEBUG配合PHPSTORM的调试环境
  • ESMFold 安装教程
  • 手动使用 Docker 启动 MinIO 分布式集群(推荐生产环境)
  • list和list中的注意事项
  • 三位一体:Ovis-U1如何以30亿参数重构多模态AI格局?
  • K8s系列之:Kubernetes 的 RBAC (Role-Based Access Control)
  • 定时器怎么玩?做个LED渐变灯练手
  • 【面板数据】全球贸易救济立案案件(1995-2024年)
  • xyctf2025第三届京麒CTF
  • STM32之继电器模块
  • 11.6 ChatGPT训练第一步:深度解析SFT监督微调核心技术与实战全指南
  • C++ 基于广度优先搜索(BFS)的拓扑排序算法
  • 20250706-9-Docker快速入门(下)-Docker在线答疑_笔记
  • Linux 内存分配理论与水位机制全解
  • Mybatis--动态SQL
  • 前端防抖Debounce如何实现
  • Kafka “假死“现象深度解析与解决方案
  • JavaScript 中导入模块时,确实不需要显式地写 node_modules 路径。
  • week2
  • 基于 Rust 的前端工具基本实现
  • 【它加上100是一个完全平方数,再加上168又是一个完全平方数】2022-7-17
  • 第十六节:第三部分:多线程:线程安全问题、取钱问题的模拟
  • 浅谈漏洞扫描与工具
  • 计算机网络实验——互联网安全实验
  • 10046 解决 Oracle error
  • NLP文本预处理