区块链Mar 28, 2026
Deep EVM #7:Yul中的Gas高效循环和条件语句
OS
Open Soft Team
Engineering Team
for循环的Gas剖析
Yul中的for循环由四部分组成:初始化、条件、后续操作和循环体。每个部分的gas成本可以精确计算。
for { let i := 0 } lt(i, 10) { i := add(i, 1) } {
// 循环体
}
每次迭代消耗:
- lt比较:3 gas
- add递增:3 gas
- JUMPI条件跳转:10 gas
- JUMP循环开始:8 gas
switch vs if
Yul没有else关键字。对于多分支逻辑,使用switch:
switch selector
case 0xa9059cbb { /* transfer */ }
case 0x70a08231 { /* balanceOf */ }
default { revert(0, 0) }
switch生成跳转表比嵌套if更高效。
unchecked算术
Yul中所有算术默认不检查溢出。这是一个特性,不是bug——它让你完全控制何时需要安全检查:
// 当你确定不会溢出时
let result := add(a, b) // 无溢出检查,节省~40 gas
循环展开
当迭代次数已知时,展开循环可以消除跳转开销:
// 替代3次迭代的循环
let sum := add(mload(0x00), mload(0x20))
sum := add(sum, mload(0x40))
每次消除的跳转节省约18 gas。
实际基准测试
在实际MEV机器人代码中,优化循环可以节省数千gas。关键是测量而非猜测——使用Foundry的gas快照来量化每次优化的影响。
总结
在Yul中优化循环和条件是gas敏感合约的核心技能。理解for循环剖析、善用switch、利用unchecked算术以及在适当时展开循环,可以显著降低合约的执行成本。