Gas优化新手入门
刚接触以太坊与 Binance 智能链开发的同学,往往会被一连串术语劝退:Gas、Gas Price、Base Fee、Priority Fee、Opcode……本篇 Gas优化新手入门 用最朴素的语言,把整个成本模型梳理一遍,并给出第一阶段就能上手的优化建议。
一、为什么链上要收 Gas
Gas 本质上是计算资源的计费单位。EVM 是一台共享虚拟机,每个节点都要为每一条 opcode 付出 CPU、内存、磁盘代价。Gas 让用户为这些消耗付费,避免恶意脚本无限循环占用网络。
一笔交易最终支付的费用 = Gas 用量 × Gas 单价。Gas 用量取决于合约写法,Gas 单价由网络拥堵决定。开发者无法直接控制单价,但可以通过优化用量来降低用户体验成本。
二、最基础的成本结构
任何一笔交易首先要支付 21000 的基础 Gas。在此之上:
- 每字节非零 calldata 收 16 Gas;
- 写一个新的 storage 槽位收 22100 Gas;
- 修改已有槽位收 2900 Gas;
- 读 storage 收 2100 Gas;
- 读 memory 仅 3 Gas。
这组数字解释了一个核心规律:内存便宜,存储昂贵。新手入门阶段,只要养成「能用 memory 就别 storage」的习惯,就能省下大量 Gas。
三、新手最容易踩的 3 个坑
1. 在循环里读同一个状态变量
for (uint i = 0; i < users.length; i++) {
total += users[i].balance;
}
上面 users.length 每次循环都会触发 SLOAD。改成本地变量:
uint len = users.length;
for (uint i = 0; i < len; i++) { ... }
2. 用字符串做 revert 信息
require(amount > 0, "amount must be positive");
字符串会被打包进合约字节码并在 revert 时返回。新手期可以用更短的字符串,进阶后改成 custom error。
3. 多次写入同一变量
如果在函数里多处累加 balance,最后才写回,比每次都 SSTORE 划算得多。
四、初学者的优化清单
面向 B安 智能链等开发者友好型网络,先掌握下面五条:
- 把高频读取的状态变量缓存到局部变量;
- 删除不必要的事件参数;
- 紧凑结构体字段顺序,让多个小字段共享一个 slot;
- 把不会变的合约 owner 改为 immutable;
- 用 unchecked 包裹纯内部循环计数器。
这五条不需要写汇编、不需要改架构,但通常能让你的合约 Gas 直接下降 15%–25%。
五、用工具量化每一次优化
感觉「应该变快」不算优化。建议新手立刻把 Foundry 装上,跑一遍:
forge test --gas-report
forge snapshot
每次修改后再跑一次,看具体函数的 Gas 变化。把数据贴在 PR 描述里,是新人能展示的最直观成长。
六、再往后该看什么
如果你已经能熟练运用上面这些技巧,可以继续阅读 solmate、solady 等开源库的源码。它们针对 ERC-20、ERC-721 等基础合约做过极致优化,是从「会写合约」到「会写高效合约」之间最好的桥梁。在 BN 与 必安 等生态项目中,这种能力会直接转化为用户费率优势。
持之以恒地度量、对比、复盘,每一位新手都能在三到六个月内成长为团队里值得信赖的 Gas 优化专家。