深入理解以太坊智能合约:从汇编到字节码
1. 指令风格代码与 Yul 中间语言
指令风格代码在执行过程中,栈的高度不断变化,跟踪需要引用的位置较为复杂。0.4.25 版本的编译器会警告不要使用指令风格。当函数嵌入指令风格时,由于编译器无法确定运行时是否会访问存储,因此不能使用纯修饰符。例如以下代码:
1
add
swap3
pop
// lt(i, 10)
dup1
dup3
lt
// jumpi(loop, lt(i, 10))
loop
jumpi
pop
pop
运行该函数会消耗 801 gas,比前两种实现更高效,但不如另一种特定实现。
Yul(0.5.0 版本之前称为 JULIA 或 IULIA)可编译为不同虚拟机的字节码。自 0.5.0 版本起,内联汇编的函数风格基于 Yul,这使得可以禁用之前学过的其他风格。如今,Yul 和内联汇编可视为同义词,在 Solidity 和以太坊的上下文中,Yul 用于为 EVM 编译字节码。目前,Yul 常被用于智能合约内的高级优化。
Yul 项目有以下几个目标:
- 用 Yul 编写的程序应具有可读性。
- 控制流应易于理解。
- 转换为字节码应直接明了。
- 适合进行全程序优化。
你可以在 文档 中详细了解这些目标。Yul 和内联汇编除了 u256 外没有其他数据类型,所有可用函数与 EVM 的操作码相同。Yul 支持字面量、内置函数调用、变
超级会员免费看
订阅专栏 解锁全文
87

被折叠的 条评论
为什么被折叠?



