预编译合约改成字节码放_same地址:EIP-8200的EVM化收尾 图 1
预编译合约改成字节码放_same地址:EIP-8200的EVM化收尾 · 图 1

预编译是协议里的小尾巴

0x010x0a 这一段极低的地址上,以太坊住着一批特殊合约:调用它们时不走 EVM 指令,而是由客户端代码里的特例函数直接算。这就是预编译合约。它们的历史角色是为哈希、签名验证这类 EVM 写起来太贵的运算开后门,但代价逐年显现:每个客户端都要为每个预编译单独实现一遍并永远保持逐位一致,这本身就是一个共识 bug 的温床;而对 zkEVM 来说,每个预编译都意味着一个独立的、需要专门算术化的非 EVM 组件,是接入门槛的大头。EIP-8200(2026年3月起草,Draft 状态)延续 EIP-7666 把 identity 预编译(0x04)换成字节码的思路,把另外三个使用率不高的成员也请下神坛。

三个候选,三条理由

第一个是 RIPEMD-160(0x03),链上用量很小,历史包袱主要是比特币风格的地址推导,在以太坊上很少见。第二个是 MODEXP(0x05),模幂运算;提案引用的分析显示,其 99.99% 的使用来自 256 位模数的 SNARK 验证场景,为极少数 RSA 场景维护整个通用实现并不划算。第三个是 BLAKE2f(0x09),分析显示它如今主要由单个合约使用。三个共同点:特例的维护成本已经高于它们在 EVM 里慢一点运行的成本。

替换怎么发生

规则简单到近乎优雅:在激活区块开始执行时,把三个地址的代码设置为功能等效的 EVM 字节码;从该区块起(含),这些地址不再按预编译对待。调用方视角完全不变——地址一样、输入输出格式一样、合约照常调用,只是底层从”客户端特例”变成了”逐条指令执行”。计费随之切换:不再套用预编译专用价目表,而按执行到的指令累计 gas。原文对 RIPEMD-160 的对照写着现状是 600 加每 32 字节 120 gas 的线性定价,字节码版本则取决于实际指令路径,Gas 差异的量化条目在提案里还标记为待补充——这也意味着上线前计费偏差是评审焦点。

快速问答

问:地址上”部署了代码”和预编译有什么本质区别? 答:预编译是客户端代码里的函数,不可升级、无存储、EVM 看不到其内部;字节码是普通合约代码,可被调试、可被追踪,也让每个客户端少维护一份特例。

问:为什么不在库合约地址上重写一套? 答:提案明确比较过:放在同一地址可以保证所有既有调用者零改动;换地址则需要迁移,等于制造兼容性断层。

一次审计怎么受益

对做合约审计或节点运维的读者,这条变化的实际意义在于状态审计口径统一:预编译地址在历史上处于”有地址、无代码、无存储”的三不管地带,工具链要特判;变成字节码后,它们与任何合约一样出现在 EXTCODE 相关查询里,一致性检查、gas 估算与 zk 证明系统都少一个分支。

一条判断线

以太坊这几年的减法提案有个共同公式:先用数据证明用量、再证明 EVM 表达可得、最后地址不变地换引擎。EIP-8200 三步齐了前两步,第三步的字节码与定价还没写死,这也是它停留在 Draft 的直接原因。

预编译为什么会存在

回到最初的问题:为什么早期要给哈希和签名验证开特例?因为 EVM 的每一条指令都要付出解释执行的代价,一条指令平均几个 gas,用几百条指令模拟一次哈希的开销和速度都难以接受,硬编码进客户端是唯一现实选择。这个逻辑在 MODEXP、BLAKE2f 诞生时成立,但随着 EVM 本身提速、专用优化工具链成熟,“特例更快”的优势逐年缩水,而”每个客户端各写一份、各错各的”风险始终不降。EIP-7666 对 identity(0x04)的成功实验证明:地址不变、语义不变、只换实现路线,网络可以平稳消化。EIP-8200 是这条实验线的第二批,也是对”协议减法”方法论的一次复用。

风险提示:本文为协议提案的科普介绍,EIP-8200 截至撰写时未在主网激活,Gas 差异以最终规范为准;本文不构成投资建议或对任何链上操作的指导。