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 的现有用例:
- 验证高达 8192 位密钥的 RSA。常用的有 1024/2048/4196 位。
- 与椭圆曲线相关的用例通常小于 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 字节的输入。
除了这些之外,还有一些无效输入的调用:
- 空输入
- 仅由
0x9e5faafc
或0x85474728
组成的输入 - 一个大的但无效的输入:
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.