Alert Source Discuss
🚧 Stagnant Standards Track: Core

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)。 如果没有 floorceil 说明符,则下面的所有除法都是整数除法(向下取整除法))。 建议的公式是 A * ((len(input) + 8) / 64 + 1) + B,系数如下所示

    A B
Geth   5 3
OE   9 4
Besu   5 10
Nethermind   10 5

EIP-2666 建议 A = 9B = 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 = 12B = 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 = 15B = 13。 此预编译合约中没有大量的一次性成本,因此它是 EIP-2046 - 安全的。Besu 预计在年底前会有性能改进。

工具和数据

包含原始数据的参考资料(来自不同客户端的基准测试)可以在 here 中找到。

有一个存储库可用,其中包含用于基准测试和预编译测试的输入 here,客户端团队可以使用该存储库执行所有必要的测量。

原始 Besu 基准

关于公式结构的说明

公式中有些项看起来像 A * 1,这些项没有显式地组合到 B 系数中,以反映对空字节数组进行哈希无论如何都需要执行一轮哈希。

向后兼容性

预编译合约的重新定价过去已经发生过,可以认为是标准程序。 预计许多合约的 Gas 成本会降低,这可能会破坏基于固定 Gas 成本的重入保护措施。 在任何情况下,这种保护都不应被认为是良好而最终的。

测试用例

让我们考虑一个简单的 Keccak256 哈希示例,哈希 064160 字节,这对于实现来说是一个简单的健全性检查。

  • 哈希 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.