EIP-2666: 重新定价预编译合约和 Keccak256 函数
Authors | Alex Vlasov (@shamatar) |
---|---|
Created | 2020-05-22 |
Discussion Link | https://ethereum-magicians.org/t/eip2666-global-precompiles-repricing-and-many-more-discussion-thread/4332 |
Requires | EIP-1352, EIP-2046, EIP-2565 |
简述
本 EIP 尝试将某些预编译合约和内置 EVM 函数的价格设置为与其性能、消耗的资源以及 EVM 本身的新变化保持一致。
为以下内容提出了新的价格公式:
- SHA256 预编译合约 (
0x02
) - RIPEMD 预编译合约 (
0x03
) - KECCAK256 操作码 (
0x20
)
摘要
许多预编译合约和内置函数的成本在当前客户端状态下是无效的。此 EIP 包含一系列对定价公式的更改,以更好地反映底层计算的结构。
动机
EVM 中这些函数的历史定价不能反映底层计算的内部结构(哈希函数的内部结构)。
- EIP-2046 将
STATICCALL (0xfa)
成本更改为预编译合约,并且可能需要调整某些预编译合约的成本,这些预编译合约可能考虑了旧的大成本 (700
gas) 并试图对其进行补偿 - 一些预编译合约的价格过高,并且其定价公式不能反映底层函数的结构
- EVM 中的 Keccak256 内置函数(操作码)的定价不能反映底层哈希函数的结构
规范
如果 block_number >= X
,则设置以下预编译合约和 Keccak256 操作码的 gas 成本:
- SHA256 (预编译
0x02
):10 + ((len(input) + 8)/64 + 1) * 9
- RIPEMD (预编译
0x03
):6 + ((len(input) + 8)/64 + 1) * 12
- KECCAK256 (
0x20
):13 + (len(input)/136 + 1)*15
此 EIP 理想情况下要求 实现 MODEXP
的重新定价,以准确反映不存在对旧 STATICCALL (0xfa)
成本(pre-2046)的隐式补偿。
原理
正在执行的函数的成本必须准确反映花费在计算上的实际 CPU 时间,因此对当前预编译合约和 Keccak256 函数进行了基准测试,以衡量运行时间与输入参数的关系。
重新定价方法的详细摘要
此 EIP 依赖于两个事实:
- 哈希函数内部结构的先验知识
- 客户端团队为某些合理范围的随机输入长度(给定长度的随机字节字符串)提供的基准
最流行的客户端上的基准
EIP-2666 所需的基准由客户端提供,原始形式在此处 here 组装
- SHA256 预编译
目前是 60
gas + 每 32
字节字 12
gas(此处以及类似的地方,字的数目是 ceil(len(input)/word_len)
。 如果没有 floor
或 ceil
说明符,则下面的所有除法都是整数除法(向下取整除法))。 建议的公式是 A * ((len(input) + 8) / 64 + 1) + B
,系数如下所示
A | B | ||
---|---|---|---|
Geth | 5 | 3 | |
OE | 9 | 4 | |
Besu | 5 | 10 | |
Nethermind | 10 | 5 |
EIP-2666 建议 A = 9
,B = 10
。 此预编译合约中没有大量的一次性成本,因此它是 EIP-2046 - 安全的。
- RIPEMD 预编译
目前是 600
gas + 每 32
字节字 120
gas。 建议的公式是 A * ((len(input) + 8) / 64 + 1) + B
,系数如下所示
A | B | ||
---|---|---|---|
Geth | 12 | 6 | |
OE | 8 | 2 | |
Besu | 29 | 16 | |
Nethermind | 10 | 6 |
EIP-2666 建议 A = 12
,B = 6
。 此预编译合约中没有大量的一次性成本,因此它是 EIP-2046 - 安全的。Besu 预计在年底前会有性能改进。
- Keccak256 性能
目前是 30
gas + 每 32
字节字 6
gas。 建议的公式是 A * (len(input) / 136 + 1) + B
,系数如下所示
A | B | ||
---|---|---|---|
Geth | 13 | 13 | |
OE | 15 | 2 | |
Besu | 19 | 28 | |
Nethermind | 16 | 3 |
EIP-2666 建议 A = 15
,B = 13
。 此预编译合约中没有大量的一次性成本,因此它是 EIP-2046 - 安全的。Besu 预计在年底前会有性能改进。
工具和数据
包含原始数据的参考资料(来自不同客户端的基准测试)可以在 here 中找到。
有一个存储库可用,其中包含用于基准测试和预编译测试的输入 here,客户端团队可以使用该存储库执行所有必要的测量。
原始 Besu 基准。
关于公式结构的说明
公式中有些项看起来像 A * 1
,这些项没有显式地组合到 B
系数中,以反映对空字节数组进行哈希无论如何都需要执行一轮哈希。
向后兼容性
预编译合约的重新定价过去已经发生过,可以认为是标准程序。 预计许多合约的 Gas 成本会降低,这可能会破坏基于固定 Gas 成本的重入保护措施。 在任何情况下,这种保护都不应被认为是良好而最终的。
测试用例
让我们考虑一个简单的 Keccak256 哈希示例,哈希 0
、64
和 160
字节,这对于实现来说是一个简单的健全性检查。
- 哈希
0
字节:- 旧价格:
30 + 6 * ceil(0 / 32) = 30
gas - 新价格:
15 * (0/136 + 1) + 13 = 28
gas
- 旧价格:
- 哈希
64
字节- 旧价格:
30 + 6 * ceil(64 / 32) = 42
gas - 新价格:
15 * (64/136 + 1) + 13 = 28
gas
- 旧价格:
- 哈希
160
字节- 旧价格:
30 + 6 * ceil(160 / 32) = 60
gas - 新价格:
15 * (160/136 + 1) + 13 = 43
gas
- 旧价格:
实现
在撰写本文时,没有参考实现,因为它只需要主要客户端中常量的简单更改。
安全考虑事项
如向后兼容性部分所述,在某些情况下,成本的降低可能会允许例如以前未预期的重入,但我们认为,基于固定 Gas 成本的重入保护无论如何都是有缺陷的设计决策。
版权
通过 CC0 放弃版权及相关权利。
Citation
Please cite this document as:
Alex Vlasov (@shamatar), "EIP-2666: 重新定价预编译合约和 Keccak256 函数 [DRAFT]," Ethereum Improvement Proposals, no. 2666, May 2020. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2666.