跳到主要内容
区块链Mar 28, 2026

Deep EVM #5:Yul入门——Solidity的秘密汇编语言

OS
Open Soft Team

Engineering Team

什么是Yul以及它为何存在

Yul是Solidity团队设计的中间语言,编译为EVM字节码。它介于Solidity和原始操作码之间:你通过可读的、结构化的语法——变量、函数、if/switch/for构造和作用域块——直接访问每个EVM操作码。

Yul的存在是因为Solidity编译器生成保守的字节码。溢出检查、ABI编码、内存管理——对应用合约有用,但对于gas关键代码(如MEV机器人、DEX路由器或链上数学库)来说开销不可接受。

当你在Solidity内写assembly { ... }时,你就是在写Yul。

Yul语法基础

Yul的语法极简。没有类型——一切都是256位字。没有数组、没有结构体、没有继承。

变量

let x := 42
let y := add(x, 1)    // y = 43
let z := mul(x, y)    // z = 42 * 43 = 1806

函数

function safeAdd(a, b) -> result {
    result := add(a, b)
    if lt(result, a) {
        revert(0, 0)  // 溢出
    }
}

控制流

If(Yul中没有else!):

if iszero(calldatasize()) {
    revert(0, 0)
}

Switch(else的等价物):

switch selector
case 0xa9059cbb { /* 处理transfer */ }
case 0x70a08231 { /* 处理balanceOf */ }
default { revert(0, 0) }

Solidity中的内联汇编

使用Yul最常见的方式是在Solidity的assembly { }块内。这绕过了Solidity的映射访问器,节省了ABI编码和边界检查的gas。

何时使用Yul(何时不用)

使用Yul:

  1. Gas至关重要 — MEV机器人、DEX聚合路由器
  2. 需要位操作 — 打包/解包数据
  3. 内存布局重要 — 构建外部调用的calldata
  4. 代理合约 — 最小代理(EIP-1167)

不使用Yul:

  1. 可读性比gas更重要 — 大多数应用合约
  2. 你对EVM知识不够自信 — Yul没有安全网
  3. gas节省微不足道 — 不值得审计风险

Yul vs Huff

特性YulHuff
栈管理自动(编译器)手动
变量名否(栈位置)
函数
控制流if/switch/forJUMPI/JUMPDEST
代码大小控制有限完全
Gas开销小(变量管理)

总结

Yul是Solidity安全性与EVM原始力量之间的桥梁。它以变量名、函数和结构化控制流给你操作码级别的控制。对MEV开发者来说,掌握Yul是盈利机器人和输给竞争对手之间的差异。