Alert Source Discuss
⚠️ Review Standards Track: Core

EIP-7823: 设置 MODEXP 的上限

每个输入字段限制为最大 8192 位

Authors Alex Beregszaszi (@axic), Radoslaw Zagorowicz (@rodiazet)
Created 2024-11-11
Requires EIP-198

摘要

对 MODEXP 预编译的输入引入上限。这可以减少潜在错误的数量,因为测试范围不再是无限的,并且更容易使用 EVMMAX 进行替换。

动机

MODEXP 预编译一直是众多共识错误的来源。其中许多是由于使用不切实际的输入长度专门制作的案例造成的。

鉴于其无界输入的性质,其定价函数也相当复杂。虽然我们不建议修改定价函数,但一旦设置了限制,在未来的升级中可能会这样做。

此外,这种限制使得通过 EVMMAX 等功能用 EVM 代码替换预编译变得更加可行。

规范

EIP-198 回顾:

在地址 0x00……05,添加一个预编译,该预编译需要以下格式的输入:

<BASE 的长度> <EXPONENT 的长度> <MODULUS 的长度> <BASE> <EXPONENT> <MODULUS>

我们对预编译的输入引入上限,每个长度输入(BASE 的长度EXPONENT 的长度MODULUS 的长度)必须小于或等于 8192 位(1024 字节)。

如果任何这些输入大于限制,则预编译执行停止,返回错误,并消耗所有 gas。

理由

限制

此上限允许 MODEXP 的现有用例:

  1. 验证高达 8192 位密钥的 RSA。常用的有 1024/2048/4196 位。
  2. 与椭圆曲线相关的用例通常小于 384 位。

EVMMAX

使用像 EVMMAX 这样的指令集用 EVM 代码替换预编译会因这个限制而变得更简单:常见情况(256、381、1024、2048)可以在特殊的快速路径中实现,而可以为其余情况提供慢速回退。甚至特殊、经常使用的模数也可以有自己的路径。

此外,可以考虑仅将长度限制为某些输入。

分析

由于 MODEXP 是在拜占庭硬分叉中引入的,因此在区块 5472266(2018 年 4 月 20 日)和区块 21550926(2025 年 1 月 4 日)之间进行了分析。所有输入的长度均以字节表示。

Base 长度出现次数

input_of_BASE 数量
32 2439595
128 4167
256 2969
160 436
512 36
0 13
64 7
78 2
513 2
129 1
385 1

Exponent 长度出现次数

input_of_EXPONENT 数量
32 2442255
3 4771
1 159
128 29
0 13
5 2

Modulo 长度出现次数

input_of_MODULUS 数量
32 2439594
128 4167
256 2968
160 436
512 38
0 13
64 8
78 2
129 1
384 1
257 1

这表明过去没有成功的用例超过 513 字节的输入长度,并且大多数使用 32/128/256 字节的输入。

除了这些之外,还有一些无效输入的调用:

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

向后兼容性

这是一个向后不兼容的更改。但是,基于直到区块 21550926 的分析(见上文),在此更改之后,过去的任何交易都不会有不同的行为。

安全注意事项

由于仅减少了接受的输入范围,因此预计不会出现新的安全面积。

版权

通过 CC0 放弃版权及相关权利。

Citation

Please cite this document as:

Alex Beregszaszi (@axic), Radoslaw Zagorowicz (@rodiazet), "EIP-7823: 设置 MODEXP 的上限 [DRAFT]," Ethereum Improvement Proposals, no. 7823, November 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7823.