编写更低成本的合约:开发者Gas优化指南

本文总结了Udemy上“高级Solidity:理解并优化Gas成本”课程的内容,涵盖了费用机制、calldata与memory的差异、变量压缩以及编译器优化等关键方面。

图片由 Giorgio Trovato 拍摄于 Unsplash

以太坊上的每次计算、存储访问和数据传输都会产生 gas 成本,这直接影响用户费用和合约性能。

本文总结了 Udemy 的课程 “Advanced Solidity: Understanding and Optimizing Gas Costs”,涵盖了费用机制、calldata 与 memory 的区别、变量打包和编译器优化。

应用这些技术,每次交易可以节省数千个 gas 单位,并使你的合约更精简、更快且更经济高效。

1. 以太坊费用如何运作

1.1 交易费用计算

以太坊交易费用很简单:

Gas used × Gas price (in gwei)

这决定了将你的交易包含在区块中需要支付多少 ETH。

1.2 区块 Gas Limit

每个区块都限制了总 gas 使用量——目前在主网上约为 25-30 百万——从而平衡了吞吐量(更多交易)与去中心化(更快的区块传播)。

1.3 EIP-1559 机制

自从伦敦硬分叉以来,费用分为:

  • Base fee(被销毁,调整至 15 M gas 目标)
  • Priority fee(给验证者的 Tip)

用户通过 maxFeePerGasmaxPriorityFeePerGas 出价来控制成本和包含速度。

2. 节省 Gas 的五个关键领域

优化分为合约生命周期的五个阶段。专注于每个阶段都可以带来巨大的节省:

2.1 部署时

  • 缩小字节码:删除死代码,标记常量/immutable
  • 利用库:通过 delegatecall 复用链下通用代码
  • 优化编译器:为热路径合约设置更高的 --optimize-runs

2.2 计算期间

  • Unchecked arithmetic:将安全计算包装在 unchecked { … } 中以跳过溢出检查
  • Custom errors:使用 error MyError(); 而不是 require("…") 字符串来减少字节

2.3 交易数据

  • Pack parameters:使用更小的类型和 abi.encodePacked 来降低 calldata 成本(4 gas/零字节,16 gas/非零字节)
  • Prefer calldata:对于外部函数来说,它是 immutable 且零拷贝的

2.4 内存管理

  • Minimize growth:每个 32 字节的字花费 3 gas,在 724 字节后有二次附加费
  • Reuse buffers:避免在循环中重复的内存扩展

2.5 存储操作

  • Slot packing:将小变量分组到一个 256 位插槽中
  • Use refunds:删除存储(例如 delete mapping[key])可产生高达 50% 的 gas 退款
  • Constants & immutables:将不变的值存储在链下或字节码中

3. 高级 Gas 节省技巧

3.1 Payable vs Non-Payable

一个 non-payable 函数隐式地检查 msg.value == 0。如果你不需要拒绝 ETH 转账,将其标记为 payable 可以通过跳过该检查来节省 gas。

3.2 Intrinsic Gas

每笔交易都会产生 21 000 gas 的基本成本,包括签名检查、RLP 编码和共识验证。低于此限制的交易将被拒绝。

3.3 编译器标志 (--optimize-runs)

  • 1-10 runs:最小的字节码(适用于很少使用的合约)
  • 200 (default):平衡
  • 1000+ runs:优化的执行(非常适合热路径合约)

3.4 Gas 成本规则一览

  • SSTORE zero→non-zero:20 000 gas
  • SSTORE non-zero→non-zero:5 000 gas
  • First storage read:+2 100 gas;后续:+100 gas

3.5 Bitwise Operations

  • Bit shiftsSHL/SHR)花费 3 gas,而 MUL/DIV 花费 5 gas,这使得它们成为 2 的幂的理想选择。

3.6 Comparison Operators

严格的 </> 操作码花费 3 gas;<=/>= 增加一个额外的 ISZERO,大约 6 gas。 尽可能使用严格的比较。

4. 整合在一起

通过分层应用这些技术——优化你的数据布局、使用正确的内存模型、选择高效的操作码以及调整编译器设置——你可以显著降低每笔交易的 gas 成本。随着以太坊的不断发展,掌握 gas 不仅对于今天为用户省钱至关重要,而且对于构建未来的高性能 DApp 至关重要。

更多阅读和资源

关于作者和作品集

大家好!我是 Milad,一位 Solidity 爱好者,痴迷于从你的合约中榨取每一个 gas 单位。当我不争论 unchecked 块的哲学含义时,你可以在我的作品集中找到我的作品和项目:

sg-milad.github.io

  • 原文链接: coinsbench.com/write-che...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
CoinsBench
CoinsBench
https://coinsbench.com/