From bbc52b9774c68bfe9091f39e6c8ef501a4ec98e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Bylica?= Date: Sat, 19 Jul 2025 13:46:04 +0200 Subject: [PATCH] Update modexp precompile costs (EIP-7883) Update the [EIP-7883 "ModExp Gas Cost Increase"](https://eips.ethereum.org/EIPS/eip-7883) to the latest revision: - https://github.com/ethereum/EIPs/pull/9855 - https://github.com/ethereum/EIPs/pull/9969 --- circle.yml | 4 ++-- test/state/precompiles.cpp | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/circle.yml b/circle.yml index 6bcf63540f..2b7efaf9d3 100644 --- a/circle.yml +++ b/circle.yml @@ -423,13 +423,13 @@ jobs: working_directory: ~/build command: > bin/evmone-statetest ~/spec-tests/fixtures/state_tests/ - --gtest_filter='-byzantium/eip198_modexp_precompile/modexp.modexp:cancun/eip4844_blobs/blob_txs.invalid_tx_blob_count:frontier/precompiles/precompiles.precompiles:osaka/eip7594_peerdas/max_blob_per_tx.invalid_max_blobs_per_tx:osaka/eip7825_transaction_gas_limit_cap/tx_gas_limit.transaction_gas_limit_cap:osaka/eip7883_modexp_gas_increase/modexp_thresholds.vectors_from_file:osaka/eip7939_count_leading_zeros/*.*:osaka/eip7951_p256verify_precompiles/*.*:prague/eip7702_set_code_tx/set_code_txs.set_code_to_precompile' + --gtest_filter='-cancun/eip4844_blobs/blob_txs.invalid_tx_blob_count:frontier/precompiles/precompiles.precompiles:osaka/eip7594_peerdas/max_blob_per_tx.invalid_max_blobs_per_tx:osaka/eip7825_transaction_gas_limit_cap/tx_gas_limit.transaction_gas_limit_cap:osaka/eip7939_count_leading_zeros/*.*:osaka/eip7951_p256verify_precompiles/*.*:prague/eip7702_set_code_tx/set_code_txs.set_code_to_precompile' - run: name: "Fusaka pre-release execution spec tests (blockchain_tests)" working_directory: ~/build command: > bin/evmone-blockchaintest ~/spec-tests/fixtures/blockchain_tests/ - --gtest_filter='-byzantium/eip198_modexp_precompile/modexp.modexp:cancun/eip4844_blobs/blob_txs.valid_blob_tx_combinations:frontier/precompiles/precompiles.precompiles:osaka/eip7594_peerdas/max_blob_per_tx.max_blobs_per_tx_fork_transition:osaka/eip7825_transaction_gas_limit_cap/tx_gas_limit.transaction_gas_limit_cap_at_transition:osaka/eip7883_modexp_gas_increase/modexp_thresholds.vectors_from_file:osaka/eip7918_blob_reserve_price/*.*:osaka/eip7934_block_rlp_limit/max_block_rlp_size.block_at_rlp_size_limit_boundary:osaka/eip7939_count_leading_zeros/*.*:osaka/eip7951_p256verify_precompiles/*.*:prague/eip7702_set_code_tx/set_code_txs.set_code_to_precompile' + --gtest_filter='-cancun/eip4844_blobs/blob_txs.valid_blob_tx_combinations:frontier/precompiles/precompiles.precompiles:osaka/eip7594_peerdas/max_blob_per_tx.max_blobs_per_tx_fork_transition:osaka/eip7825_transaction_gas_limit_cap/tx_gas_limit.transaction_gas_limit_cap_at_transition:osaka/eip7918_blob_reserve_price/*.*:osaka/eip7934_block_rlp_limit/max_block_rlp_size.block_at_rlp_size_limit_boundary:osaka/eip7939_count_leading_zeros/*.*:osaka/eip7951_p256verify_precompiles/*.*:prague/eip7702_set_code_tx/set_code_txs.set_code_to_precompile' - collect_coverage_gcc - upload_coverage: flags: fusaka_execution_spec_tests diff --git a/test/state/precompiles.cpp b/test/state/precompiles.cpp index 9a8950815b..97cfd5f7c2 100644 --- a/test/state/precompiles.cpp +++ b/test/state/precompiles.cpp @@ -127,8 +127,7 @@ PrecompileAnalysis expmod_analyze(bytes_view input, evmc_revision rev) noexcept // With EIP-7823 the computation never overflows. assert(max_len <= MODEXP_LEN_LIMIT_EIP7823); const auto num_words = (max_len + 7) / 8; - const auto num_words_squared = num_words * num_words; - const auto mult_complexity = max_len <= 32 ? num_words_squared : num_words_squared * 2; + const auto mult_complexity = max_len <= 32 ? 16 : num_words * num_words * 2; return uint64_t{mult_complexity}; }; static constexpr auto calc_mult_complexity_eip2565 = [](uint32_t max_len) noexcept { @@ -153,7 +152,7 @@ PrecompileAnalysis expmod_analyze(bytes_view input, evmc_revision rev) noexcept }; const auto& [min_gas, final_divisor, calc_mult_complexity] = [rev]() noexcept -> Params { if (rev >= EVMC_OSAKA) - return {500, 3, calc_mult_complexity_eip7883}; + return {500, 1, calc_mult_complexity_eip7883}; else if (rev >= EVMC_BERLIN) return {200, 3, calc_mult_complexity_eip2565}; else // Byzantium