Solidity require/assert/revert 三兄弟:错误处理的区别与 gas 优化实战

发布时间:2026/9/26 1:48:00
Solidity require/assert/revert 三兄弟:错误处理的区别与 gas 优化实战 在 Solidity 里处理异常时,几乎每份代码都会用到 require、assert、revert 这三个语句。很多新手把它们当"报错就 throw"混着用,结果要么多烧了 gas,要么在特定优化版本下把不该翻的合约搞挂。本文用一段可跑通的合约,讲清三者底层区别(借助汇编级 invalid vs revert),并给出按场景选择的 checklist。## 适用场景- 你正在写 ERC20 / 众筹 / 多签等需要入参校验、白名单判断、余额检查的合约。- 你遇到过报错信息相同但 gas 消耗不同的困惑,或合约在升级后某些 assert 莫名失效。- 你需要理解 Solidity 0.8 内置溢出检查与 require/assert 的协同关系。## 核心技术栈- Solidity ^0.8.0(内置算术溢出检查)- 编译目标:EVM(Remix / Hardhat / Foundry 均可)- 关键字节码:invalid操作码(0xFE)与REVERT指令## 完整可跑代码示例solidity// SPDX-License-Identifier: MITpragma solidity ^0.8.20;contract GuardDemo { uint256 public total = 0; address public owner; constructor() { owner = msg.sender; } // 1) require:入参/外部条件校验,最常用,退回剩余 gas function deposit(uint256 amount) external payable { require(msg.value == amount, "value mismatch"); require(amount 0, "amount must 0"); total += amount; } // 2) revert:主动回滚,可带定制错误(0.8+ 推荐用 error) error InsufficientBalance(uint256 have, uint256 need); function withdraw(uint256 amount) external { if

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询