函数搬进集装箱:EIP-4750 的 CALLF、RETF 与告别动态跳转 图 1
函数搬进集装箱:EIP-4750 的 CALLF、RETF 与告别动态跳转 · 图 1

EVM 执行合约代码几十年只有一个原语:跳转。所谓「函数」是编译器习俗——把参数压栈、把返回地址压栈、JUMP 过去,回来靠从栈里捞地址。这套机巧的代价遍布每个环节:JUMP 的目的地运行时才知道,解释器必须先把整段代码扫一遍、标记哪些字节是合法跳转点(JUMPDEST 分析);参数与返回值的数量、位置全靠约定,静态分析寸步难行;而攻击者可以在 PUSH 数据里伪造跳转标记做文章。2022 年 1 月 10 日提交的 EIP-4750 想终结这门习俗:在 EOF 字节码集装箱(EIP-3540 的容器格式设想)里,函数不再是排版出来的,而是一段一段真实存在的代码段,配上两条新指令与一本独立账——返回栈。

类型段:函数有了合同

4750 把容器里的代码切成多个段,一段即一个函数,另设一个类型段登记每个段的「函数签名」:四个字节一条记录,依次是该段的输入栈项数(1 字节)、输出项数(1 字节)、最大栈增量(2 字节);输入输出字节的高位留给未来(输出值的 0x80 已被非返回函数占用),实际限 127 项。第 0 段必须是零输入、不返回的入口段。这些静态声明是整套设计的支点:调用方与被调方不再靠默契对齐栈,验证期就能数清谁欠谁几个栈位——提案明确说,栈下溢检查自此消失,因为 EIP-5450 的静态栈验证保证运行时不可能下溢。

函数搬进集装箱:EIP-4750 的 CALLF、RETF 与告别动态跳转 图 2
函数搬进集装箱:EIP-4750 的 CALLF、RETF 与告别动态跳转 · 图 2

CALLF 与 RETF

CALLF(0xe3)带一个 2 字节大端立即数指明目标段号:不收栈、不压栈,只把(当前段号,CALLF 之后那条指令的偏移)推上返回栈,然后跳到目标段开头继续;若操作数栈剩余空间容不下目标函数的最大栈增量,或返回栈已满一千零二十四项,则执行立即异常中止。静态 Gas 五。RETF(0xe4)反向操作:从返回栈弹出一条记录,恢复段号与 PC,静态 Gas 三。两条指令在遗留字节码里都是异常停机,互不侵占老地址。规则之外全是减法:JUMP 与 JUMPI 被判无效,PC 指令(读程序计数器)无效,JUMPDEST 改名 NOP——保留一 Gas 的空操作,供基准测试、对齐与填充使用。提案算过账:没有动态跳转,JUMPDEST 分析整个环节就不需要了——「EOF 代码不再需要跳转点扫描」这句话,是控制流改革最直接的效率红利。

为什么停在 Stagnant

4750 不是一份能单飞的提案:它 requires EIP-3540(容器格式)、3670(代码验证)与 5450(栈验证),是 EOF 全家桶的函数篇。整个 EOF 系列在多次升级打包中反复进出议程,最终随以太坊路线图重心转向协议级重构与执行层并行化(EVM 对象格式的目标被部分吸收进别的工作流),4750 停在了 Stagnant:无活动、未撤回,随时可能被复活也可能就此归档。它留下的思想遗产清晰可见:类型段与段隔离是静态分析友好的字节码设计范本,返回栈方案回答了「1024 层调用深度与 1024 项操作数栈互相纠缠」的经典难题,对 JUMPDEST 分析的废除思路也被后续多个执行层优化提案反复引用。读今天的 EVM 控制流讨论,绕不开这份 2022 年的图纸。

一笔对照账

把 4750 的世界和现状放一起数:现行 EVM 里一次函数调用要经历压返回地址、JUMP、被调方按约定取参、尾部压返回地址、JUMP 回来或 SWAP+JUMP——至少三四条指令加一次全码跳转点扫描;4750 世界里 CALLF 一条指令、目标编译期已知、验证期完成栈收支配平。省下的每条 Gas 都是亿万次调用的乘数,这正是当年 Solidity 编译器阵营支持它的原因——静态生成的跳转虽多,却都是本可避免的搬运。

快速问答

问:CALLF 能调任意地址的函数吗? 答:不能,只能调同一容器内代码段,段号立即数必须小于段总数,跨合约调用仍走 CALL 一族。

问:返回栈和现在的返回地址压栈有何区别? 答:物理分离——返回地址不再占用操作数栈,也就不能被数据污染或被跳转误读。

问:这套格式上线了吗? 答:没有。EOF 系列整体未进主网,4750 状态 Stagnant。

常见误区

一是把 CALLF/RETF 与 EIP-2315 的裸返回栈搞混:2315 只加隐形返回栈、不动跳转,4750 则连同段与类型段一起重造函数概念;二是以为禁了动态跳转就禁止了分派——跳转表可用 RJUMPV 相对跳转表实现,编译器损失的主要是「运行时改地址」这种花活;三是把 Stagnant 读成已废弃,按流程它仍可被重新激活讨论。

风险提示:本文为 EVM 字节码机制科普,不构成投资建议;合约执行与 Gas 特性以当前主网行为为准。