区块链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:
- Gas至关重要 — MEV机器人、DEX聚合路由器
- 需要位操作 — 打包/解包数据
- 内存布局重要 — 构建外部调用的calldata
- 代理合约 — 最小代理(EIP-1167)
不使用Yul:
- 可读性比gas更重要 — 大多数应用合约
- 你对EVM知识不够自信 — Yul没有安全网
- gas节省微不足道 — 不值得审计风险
Yul vs Huff
| 特性 | Yul | Huff |
|---|---|---|
| 栈管理 | 自动(编译器) | 手动 |
| 变量名 | 是 | 否(栈位置) |
| 函数 | 是 | 宏 |
| 控制流 | if/switch/for | JUMPI/JUMPDEST |
| 代码大小控制 | 有限 | 完全 |
| Gas开销 | 小(变量管理) | 零 |
总结
Yul是Solidity安全性与EVM原始力量之间的桥梁。它以变量名、函数和结构化控制流给你操作码级别的控制。对MEV开发者来说,掌握Yul是盈利机器人和输给竞争对手之间的差异。