跳到主要内容
区块链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算术以及在适当时展开循环,可以显著降低合约的执行成本。