Alert Source Discuss
⚠️ Draft Standards Track: Core

EIP-7883: ModExp Gas 成本增加

增加 ModExp 预编译的成本

Authors Marcin Sobczak (@marcindsobczak), Marek Moraczyński (@MarekM25), Marcos Maceo (@stdevMac)
Created 2025-02-11
Discussion Link https://ethereum-magicians.org/t/eip-7883-modexp-gas-cost-increase/22841
Requires EIP-2565

摘要

本 EIP 修改了 EIP-2565 中引入的 ModExp 预编译定价算法。

动机

在某些情况下,ModExp 预编译的定价低于其资源消耗。通过修改 ModExp 定价公式,这些情况将被覆盖,同时对实际应用程序的影响最小。目标是使 ModExp 在所有情况下至少与 EcRecover 预编译一样快。

规范

在激活此 EIP 后,调用地址 0x0000000000000000000000000000000000000005 处的预编译的 Gas 成本将按如下方式计算:

def calculate_multiplication_complexity(base_length, modulus_length):
    max_length = max(base_length, modulus_length)
    words = math.ceil(max_length / 8)
    multiplication_complexity = 16
    if max_length > 32: multiplication_complexity = 2 * words**2
    return multiplication_complexity

def calculate_iteration_count(exponent_length, exponent):
    iteration_count = 0
    if exponent_length <= 32 and exponent == 0: iteration_count = 0
    elif exponent_length <= 32: iteration_count = exponent.bit_length() - 1
    elif exponent_length > 32: iteration_count = (16 * (exponent_length - 32)) + ((exponent & (2**256 - 1)).bit_length() - 1)
    return max(iteration_count, 1)

def calculate_gas_cost(base_length, modulus_length, exponent_length, exponent):
    multiplication_complexity = calculate_multiplication_complexity(base_length, modulus_length)
    iteration_count = calculate_iteration_count(exponent_length, exponent)
    return max(500, math.floor(multiplication_complexity * iteration_count / 3))

更改(使用 EIP-2565 中的算法):

1. 将最低价格从 200 增加到 500

等式的这部分:

    return max(200, math.floor(multiplication_complexity * iteration_count / 3))

被替换为:

    return max(500, math.floor(multiplication_complexity * iteration_count / 3))

2. 增加 exponent 大于 32 字节时的成本

等式的这部分:

    elif exponent_length > 32: iteration_count = (8 * (exponent_length - 32)) + ((exponent & (2**256 - 1)).bit_length() - 1)

被替换为:

    elif exponent_length > 32: iteration_count = (16 * (exponent_length - 32)) + ((exponent & (2**256 - 1)).bit_length() - 1)

乘数 8 被替换为 16。

3. 假设最小 base / modulus 长度为 32,并增加大于 32 字节时的成本

等式的这部分:

def calculate_multiplication_complexity(base_length, modulus_length):
    max_length = max(base_length, modulus_length)
    words = math.ceil(max_length / 8)
    return words**2

被替换为:

def calculate_multiplication_complexity(base_length, modulus_length):
    max_length = max(base_length, modulus_length)
    words = math.ceil(max_length / 8)
    multiplication_complexity = 16
    if max_length > 32: multiplication_complexity = 2 * words**2
    return multiplication_complexity

如果 base 或 modulus 大于 32 字节,则乘法复杂度加倍。

理由

在对 ModExp 预编译进行基准测试后,我们发现某些情况的定价过低,需要重新定价以确保适当的成本。进一步的研究表明,可以通过调整当前 ModExp 定价公式中的参数来解决所有定价过低的极端情况。通过这些更改,使用 ModExp 预编译的最低成本将从 200 增加到 500(增加 150%),并且当 basemodulusexponent 超过 32 字节时,成本将更高。这些调整将确保 ModExp 预编译的最差性能的极端情况不会比 EcRecover 预编译更差。

向后兼容性

此更改不向后兼容。但是,类似的 Gas 重新定价在以太坊生态系统中已经发生多次,并且它们的影响已被充分理解。

测试用例

底层接口或算术算法没有变化,因此可以重用现有的测试向量。下表是更新后的测试向量:

测试用例 EIP-2565 定价 EIP-7883 定价 增加
modexp_nagydani_1_square 200 500 150%
modexp_nagydani_1_qube 200 500 150%
modexp_nagydani_1_pow0x10001 341 682 100%
modexp_nagydani_2_square 200 500 150%
modexp_nagydani_2_qube 200 500 150%
modexp_nagydani_2_pow0x10001 1365 2730 100%
modexp_nagydani_3_square 341 682 100%
modexp_nagydani_3_qube 341 682 100%
modexp_nagydani_3_pow0x10001 5461 10922 100%
modexp_nagydani_4_square 1365 2730 100%
modexp_nagydani_4_qube 1365 2730 100%
modexp_nagydani_4_pow0x10001 21845 43690 100%
modexp_nagydani_5_square 5461 10922 100%
modexp_nagydani_5_qube 5461 10922 100%
modexp_nagydani_5_pow0x10001 87381 174762 100%
modexp_marius_1_even 2057 3774 83%
modexp_guido_1_even 2298 4261 85%
modexp_guido_2_even 2300 4262 85%
modexp_guido_3_even 5400 10800 100%
modexp_guido_4_even 1026 1967 92%
modexp_marcin_1_base_heavy 200 500 150%
modexp_marcin_1_exp_heavy 215 500 133%
modexp_marcin_1_balanced 200 500 150%
modexp_marcin_2_base_heavy 867 1734 100%
modexp_marcin_2_exp_heavy 852 1364 60%
modexp_marcin_2_balanced 996 1992 100%
modexp_marcin_3_base_heavy 677 677 0%
modexp_marcin_3_exp_heavy 765 765 0%
modexp_marcin_3_balanced 1360 1360 0%

安全考虑

由于没有引入新功能或降低成本,因此不存在安全问题。此 EIP 的主要考虑因素是可能定价过高的 ModExp 方案的风险。

版权

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

Citation

Please cite this document as:

Marcin Sobczak (@marcindsobczak), Marek Moraczyński (@MarekM25), Marcos Maceo (@stdevMac), "EIP-7883: ModExp Gas 成本增加 [DRAFT]," Ethereum Improvement Proposals, no. 7883, February 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7883.