本文总结了Udemy上“高级Solidity:理解并优化Gas成本”课程的内容,涵盖了费用机制、calldata与memory的差异、变量压缩以及编译器优化等关键方面。
图片由 Giorgio Trovato 拍摄于 Unsplash
以太坊上的每次计算、存储访问和数据传输都会产生 gas 成本,这直接影响用户费用和合约性能。
本文总结了 Udemy 的课程 “Advanced Solidity: Understanding and Optimizing Gas Costs”,涵盖了费用机制、calldata 与 memory 的区别、变量打包和编译器优化。
应用这些技术,每次交易可以节省数千个 gas 单位,并使你的合约更精简、更快且更经济高效。
以太坊交易费用很简单:
Gas used × Gas price (in gwei)
这决定了将你的交易包含在区块中需要支付多少 ETH。
每个区块都限制了总 gas 使用量——目前在主网上约为 25-30 百万——从而平衡了吞吐量(更多交易)与去中心化(更快的区块传播)。
自从伦敦硬分叉以来,费用分为:
用户通过 maxFeePerGas
和 maxPriorityFeePerGas
出价来控制成本和包含速度。
优化分为合约生命周期的五个阶段。专注于每个阶段都可以带来巨大的节省:
delegatecall
复用链下通用代码--optimize-runs
unchecked { … }
中以跳过溢出检查error MyError();
而不是 require("…")
字符串来减少字节abi.encodePacked
来降低 calldata 成本(4 gas/零字节,16 gas/非零字节)calldata
:对于外部函数来说,它是 immutable 且零拷贝的delete mapping[key]
)可产生高达 50% 的 gas 退款一个 non-payable 函数隐式地检查 msg.value == 0
。如果你不需要拒绝 ETH 转账,将其标记为 payable
可以通过跳过该检查来节省 gas。
每笔交易都会产生 21 000 gas 的基本成本,包括签名检查、RLP 编码和共识验证。低于此限制的交易将被拒绝。
--optimize-runs
)SHL
/SHR
)花费 3 gas,而 MUL
/DIV
花费 5 gas,这使得它们成为 2 的幂的理想选择。严格的 <
/>
操作码花费 3 gas;<=
/>=
增加一个额外的 ISZERO
,大约 6 gas。 尽可能使用严格的比较。
通过分层应用这些技术——优化你的数据布局、使用正确的内存模型、选择高效的操作码以及调整编译器设置——你可以显著降低每笔交易的 gas 成本。随着以太坊的不断发展,掌握 gas 不仅对于今天为用户省钱至关重要,而且对于构建未来的高性能 DApp 至关重要。
大家好!我是 Milad,一位 Solidity 爱好者,痴迷于从你的合约中榨取每一个 gas 单位。当我不争论 unchecked
块的哲学含义时,你可以在我的作品集中找到我的作品和项目:
- 原文链接: coinsbench.com/write-che...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!