EIP-7823 深度解读:为 MODEXP 预编译设置输入长度上限(8192 位)
2026/9/15 21:13:46 网站建设 项目流程

EIP-7823 深度解读:为 MODEXP 预编译设置输入长度上限(8192 位)

【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs

导读

EIP-7823(Set upper bounds for MODEXP)为以太坊 0x05 地址的 MODEXP(大整数模幂)预编译引入了输入长度上限:BASE、EXPONENT、MODULUS 三个字段的长度各自不得超过 8192 位(1024 字节)。这一限制旨在收窄 MODEXP 的测试面、降低共识缺陷风险,并为此后通过 EVMMAX 等指令集用 EVM 代码替换该预编译铺平道路。本文将以 EIPS/eip-7823.md 为主体,结合 EIP-198、EIP-2565、EIP-7883、EIP-6690 与 Fusaka 升级元 EIP EIP-7607 等仓库内文档,完整讲解该提案的规范、动机、链上数据分析、兼容性影响及其在 Fusaka 网络升级中的落地情况。

背景:MODEXP 预编译与 EIP-198

MODEXP 预编译最初由 EIP-198(Big integer modular exponentiation)在 Byzantium 硬分叉中引入。它位于地址0x00……05,期望输入格式为:

<length_of_BASE> <length_of_EXPONENT> <length_of_MODULUS> <BASE> <EXPONENT> <MODULUS>

其中每个length都是 32 字节左填充的整数,表示紧随其后的值所占用的字节数。调用数据被视为无限右补零,多余数据被忽略。预编译返回(BASE**EXPONENT) % MODULUS,输出字节数组长度与模数长度一致。

其 gas 消耗由 EIP-198 定义,基于mult_complexity(对 Karatsuba 乘法难度的近似)与ADJUSTED_EXPONENT_LENGTH

def mult_complexity(x): if x <= 64: return x ** 2 elif x <= 1024: return x ** 2 // 4 + 96 * x - 3072 else: return x ** 2 // 16 + 480 * x - 199680

EIP-198 文档中给出的例子可帮助理解其行为:输入3**(2**256 - 2**32 - 978) % (2**256 - 2**32 - 977),由费马小定理可知结果为 1,输出 32 字节的1;此时ADJUSTED_EXPONENT_LENGTH为 255,gas 成本为mult_complexity(32) * 255 / 20 = 13056。一个 4096 位 RSA 指数运算在最坏情况下约需mult_complexity(512) * 4095 / 100 = 22853376gas,但实际 RSA 验证常用指数 3 或 65537,gas 消耗分别可降至 5580 或 89292。

后续的 EIP-2565 重新定义了 MODEXP 的定价算法(引入最小 200 gas 下限、以 8 字节为 word 的乘法复杂度近似、将 GQUADDIVISOR 由 20 调整为 3),EIP-7883 又进一步上调了其价格(最小成本 200→500,一般成本三倍,指数大于 32 字节时乘数由 8 翻倍为 16)。而 EIP-7823 不改动定价,只限制输入长度本身。

动机:共识缺陷与无界输入定价的困境

EIP-7823 的动机来自三个方面:

  1. MODEXP 是共识缺陷的常见来源。EIP-7823 明确指出,MODEXP 预编译已成为大量共识 bug 的源头,其中许多源于使用不切实际输入长度的精心构造用例(例如 EIP-198 中2**256 - 1字节长的模数示例)。输入无界意味着测试面无限,客户端实现在边界情况下容易出现分歧。
  2. 定价函数因无界输入而复杂。在无界输入下,定价公式需要分段处理不同的数量级,复杂度显著上升。EIP-7823 不主张立即重写定价函数,但指出一旦长度上限生效,未来升级中重新设计定价函数将变得更加可行。
  3. 为 EVMMAX 替换铺路。长度受限后,用 EVM 代码(如通过 EVMMAX 这类指令集)替换 MODEXP 预编译的可行性显著提高——这呼应了以太坊社区通过 EIP-7666(EVM-ify the identity precompile)展现的"用 EVM 代码取代预编译"的整体思路。

规范:每个输入字段上限 8192 位(1024 字节)

EIP-7823 的规范非常简洁,仅对 EIP-198 定义的输入格式附加一个约束:

为预编译的输入引入一个上限:三个长度字段length_of_BASElength_of_EXPONENTlength_of_MODULUS各自必须小于或等于 8192 位(1024 字节)

超限时的行为定义为:

如果任一输入超过该限制,预编译执行立即停止,返回错误,并消耗调用方提供的全部 gas

注意"消耗全部 gas"(consume all gas)这一语义:超限调用不仅失败,还会烧掉该调用附带的所有 gas,这与 EVM 中异常终止(exceptional halt)的典型行为一致——从实现角度看,这等效于在执行前触发一次异常退出,客户端无需为超限输入分配或计算任何大数运算。

该规范没有改动 MODEXP 的接口、计算语义或定价公式,纯粹是对输入域的收窄。三个长度字段是独立判定的,只要其中一个超过 1024 字节即触发失败。

理由与依据:限制值如何选定

限制值覆盖现有真实用例

8192 位(1024 字节)的上限足以覆盖 MODEXP 现有的全部实际使用场景:

  1. RSA 验证:支持最高 8192 位密钥的 RSA 验证。常用密钥长度为 1024/2048/4096 位,均远低于上限。
  2. 椭圆曲线相关用例:通常低于 384 位。

即该上限"足够宽"以不破坏既有合法用例,又"足够窄"以收窄测试面。

EVMMAX:预编译替换的可行性

EIP-7823 明确指出,通过类似 EVMMAX 的指令集用 EVM 代码替换该预编译,会因该上限而变得更加简单:常见的长度(256、381、1024、2048 位等)可实现为专用快速路径(fast paths),其余情况可提供慢速回退路径(slow fallback);甚至可以对频繁使用的特定模数提供专属路径。此外,可以考虑仅对某些输入字段施加限制。

EVMMAX 的形态可以参考仓库内的 EIP-6690(EVM Modular Arithmetic Extensions):该提案引入SETMODXLOADXSTOREX等新指令,为 3 到 2**768-1 之间的奇数或 2 的幂模数提供扩展宽度的高效模运算操作,并定义了 EVM 内存与 EVMMAX 虚拟寄存器空间之间的分离与拷贝语义。EIP-7823 与这类提案的目标互补——一个收窄现有预编译的输入域,另一个在 EVM 层面原生支持高效模运算,共同推动 MODEXP 的"EVM 化"。

链上数据分析(5472266 ~ 21550926 区块)

为了验证限制值的合理性,作者对 Byzantium 引入 MODEXP 以来的链上调用进行了分析,统计区间为区块 5472266(2018 年 4 月 20 日)至区块 21550926(2025 年 1 月 4 日),长度单位均为字节。

Base 长度出现频次:

input_of_BASEcount
322439595
1284167
2562969
160436
51236
013
647
782
5132
1291
3851

Exponent 长度出现频次:

input_of_EXPONENTcount
322442255
34771
1159
12829
013
52

Modulo 长度出现频次:

input_of_MODULUScount
322439594
1284167
2562968
160436
51238
013
648
782
1291
3841
2571

该分析表明:没有任何一次成功的链上调用超过 513 字节的输入长度,绝大多数调用使用 32/128/256 字节的输入。这与上限 1024 字节之间存在可观的安全余量。

除上述成功调用外,链上还观察到少量无效输入的调用:

  • 空输入;
  • 仅由0x9e5faafc0x85474728组成的输入;
  • 一个大型但无效的输入:0x9e281a98000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000021e19e0c9bab2400000

这些正是 EIP-7823 动机中提到的"精心构造的异常输入"类型的现实样本。

向后兼容性

EIP-7823 是一项向后不兼容的变更(backwards incompatible):在历史上,任何传入超限长度字段的调用原本可能被解析或失败,而升级后这些调用将统一以"耗尽全部 gas"的方式失败。

不过,基于截至区块 21550926 的链上分析(见上文),没有任何历史交易会在该变更后表现出不同的行为——因为从未有成功调用超过 513 字节的输入长度。从数据上看,该变更对既有链上生态的实际影响为零,仅收紧了未来调用的输入域。

安全考量

EIP-7823 认为:由于只是缩减了可接受的输入范围(accepted input range),不会引入新的安全攻击面。相比定价调整类提案(如 EIP-2565、EIP-7883 需要担心"计价过低导致 DoS"或"计价过高导致可用性下降"),纯长度限制的变更方向是单边的——只排除异常输入,不影响合法输入的可用性。

落地:Fusaka 网络升级中的激活

EIP-7823 状态为Final(类型:Standards Track / Core),并被列入 Fusaka(Fulu/Osaka)网络升级。根据元 EIP EIP-7607(Hardfork Meta - Fusaka),EIP-7823 是 Fusaka 的核心 EIP 之一,与该升级中的其他变更(如 EIP-7883 ModExp Gas Cost Increase、EIP-7825 Transaction Gas Limit Cap、EIP-7594 PeerDAS 等)一同激活。

EIP-7607 给出了各网络的激活时间表:

网络激活 Epoch激活时间戳激活时间(UTC)Fork ID
Holešky16512017593084802025-10-01 08:48:000x783def52
Sepolia27264017604273602025-10-14 07:36:000xe2ae4999
Hoodi5068817616775922025-10-28 18:53:120xe7e0e7ff
Mainnet41139217647985512025-12-03 21:49:110x5167e2a6

可以看到,MODEXP 相关的两项提案(EIP-7823 限制输入长度 + EIP-7883 上调定价)在同一次升级中同时生效,共同提升 MODEXP 预编译的可维护性与资源计费准确性。

关联阅读

  • EIP-198:MODEXP 预编译的原始规范(输入格式、mult_complexity 定价、ADJUSTED_EXPONENT_LENGTH 定义)。
  • EIP-2565:ModExp Gas Cost,重新定义定价算法(最小 200 gas、words² 复杂度、GQUADDIVISOR=3)。
  • EIP-7883:ModExp Gas Cost Increase,进一步提高 MODEXP 定价(最小 500 gas、移除 /3、指数乘数 8→16)。
  • EIP-7607:Fusaka 网络升级元 EIP,包含 EIP-7823 的激活时间表。
  • EIP-6690:EVM Modular Arithmetic Extensions(EVMMAX 形态之一),体现扩展宽度模运算的 EVM 原生化方向。
  • EIP-7666:EVM-ify the identity precompile,展示"用 EVM 代码替换预编译"的实践路径。

小结

EIP-7823 以一段极简的规范(三个长度字段上限 8192 位、超限耗尽全部 gas)解决了 MODEXP 预编译长期存在的三个问题:收窄共识 bug 测试面、为定价函数重设计创造条件、降低以 EVMMAX 方式用 EVM 代码替换该预编译的难度。其限制值选择有充分的链上数据支撑——历史所有成功调用均未超过 513 字节,因此尽管该变更被标记为向后不兼容,实际链上影响为零。作为 Fusaka 升级的核心 EIP 之一,它将于 2025 年末随网络升级在主网及测试网生效,与 EIP-7883 的定价上调一道,为 MODEXP 预编译走向"有限输入域 + 更准确计费 + 可 EVM 化替换"的演进路径奠定基础。

【免费下载链接】EIPsThe Ethereum Improvement Proposal repository项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询