掌握 gas 优化技巧是每个严肃的 Solidity 开发者必备的技能。本系列文章将系统性地介绍各种 gas 优化技术,帮助大家编写更高效、更经济的智能合约。
在深入学习优化技巧之前,我们需要先理解以太坊的 Gas 机制以及交易费用是如何计算的。
Gas 是以太坊网络中用于衡量计算工作量的单位。每个 EVM 操作码都有固定的 gas 消耗:
ADD)消耗 3 gasSSTORE)根据情况消耗 2,900 至 20,000 gas一个交易的总 gas 消耗等于该交易执行过程中所有操作码 gas 消耗的总和。
2021 年 8 月,以太坊通过 EIP-1559 升级改变了交易费用的计算方式。在 EIP-1559 机制下,交易费用由两部分组成:
交易费用 = Gas Used × (Base Fee + Priority Fee)
其中:
为了保护用户,EIP-1559 引入了两个上限参数:
实际支付的费用计算如下:
实际费用 = Gas Used × min(Max Fee, Base Fee + min(Max Priority Fee, Max Fee - Base Fee))
多支付的部分会自动退还给用户。
假设:
计算过程:
实际优先费用 = min(2 gwei, 100 gwei - 30 gwei) = 2 gwei
实际总费用每 gas = min(100 gwei, 30 gwei + 2 gwei) = 32 gwei
交易总费用 = 21,000 × 32 gwei = 672,000 gwei = 0.000672 ETH
其中:
从上述公式可以看出,降低 Gas Used 可以直接按比例减少交易费用。如果你能将合约的 gas 消耗从 100,000 降低到 80,000(减少 20%),那么用户的交易费用也会相应减少 20%。
这就是为什么 Gas 优化如此重要——它直接影响到每一位用户的钱包。
在以太坊和其他兼容 EVM 的区块链上,每一次智能合约交互都需要消耗 gas。Gas 不仅是执行计算的成本,更是区块链资源的定价机制。对于开发者和用户而言,gas 优化的重要性体现在以下几个方面:
在以太坊主网上,gas 费用可能非常昂贵,特别是在网络拥堵时期。一个经过良好优化的智能合约可以为用户节省大量费用。例如,一个常见的 DeFi 操作如果能节省 20% 的 gas,对于频繁交易的用户来说,累积节省的成本可能相当可观。
在 DeFi、NFT 市场和其他 dApp 领域,gas 效率往往是产品竞争力的关键因素。用户会倾向于选择交易成本更低的平台。一个 gas 效率高的协议可以吸引更多用户,建立更好的市场声誉。
某些复杂的应用逻辑可能因为 gas 成本过高而无法在链上实现。通过优化,原本不可行的功能可能变得经济可行,从而扩展了智能合约的应用边界。
每个交易都有 gas 限制,过于复杂的交易可能超过这个限制而无法执行。优化可以确保即使是复杂的操作也能在单个交易中完成。
尽管 Gas 优化很重要,但它不是万能药,我们依旧要知晓:
某些 gas 优化技巧只在特定情况下有效。例如,直观上,以下代码:
if (!cond) {
// branch False
}
else {
// branch True
}
比以下代码效率更低
if (cond) {
// branch True
}
else {
// branch False
}
因为在条件取反时会消耗额外的操作码。令人意外的是,有很多情况下,这种优化实际上会增加交易的成本。Solidity 编译器有时是不可预测的。
因此,在选择特定算法之前,你应该实际测量替代方案的效果。考虑这些技巧可以认识到编译器一些可能会让人惊讶的地方。
本文档中一些技巧会被标记为非通用。Gas 优化技巧有时取决于编译器在本地的操作。通常应同时测试代码的最优版本和非最优版本,以查看是否真正获得了改进。我们将记录一些令人惊讶的情况,即本应导致优化的情况实际上导致了更高的成本。
其次,当使用 Solidity 编译器的 --via-ir 选项时,某些优化行为可能会发生变化。
gas 优化通常会使代码变得更难读和更复杂。一个好的工程师必须在主观上权衡哪些优化是值得的,哪些不是。
学习本教程需要你具备一定的 Solidity 编程基础,推荐学习学习这套系统的Solidity 开发教程。
本教程专注于通用的、可广泛应用的 gas 优化技巧。从基础到高级。我们建议按以下方式学习:
Gas 优化是一门既需要理论知识,也需要实践经验的技能。通过本系列教程的学习,你将能够:
让我们开始这段优化之旅,一起探索如何编写更加高效的 Solidity 代码!