图片由 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 机制
自从伦敦硬分叉以来,费用分为:
用户通过 maxFeePerGas 和 maxPriorityFeePerGas 出价来控制成本和包含速度。
2. 节省 Gas 的五个关键领域
优化分为合约生命周期的五个阶段。专注于每个阶段都可以带来巨大的节省:
2.1 部署时2.2 计算期间2.3 交易数据2.4 内存管理2.5 存储操作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)3.4 Gas 成本规则一览3.5 Bitwise Operations3.6 Comparison Operators
严格的 </> 操作码花费 3 gas;<=/>= 增加一个额外的 ISZERO,大约 6 gas。 尽可能使用严格的比较。
4. 整合在一起
通过分层应用这些技术——优化你的数据布局、使用正确的内存模型、选择高效的操作码以及调整编译器设置——你可以显著降低每笔交易的 gas 成本。随着以太坊的不断发展,掌握 gas 不仅对于今天为用户省钱至关重要,而且对于构建未来的高性能 DApp 至关重要。