From c41ab32b4626821ce84336a437a1ff05dea7106e Mon Sep 17 00:00:00 2001 From: lupin012 <58134934+lupin012@users.noreply.github.com> Date: Wed, 4 Sep 2024 22:38:22 +0200 Subject: [PATCH 1/2] remove base fee from to_transaction --- silkworm/rpc/commands/eth_api.cpp | 6 ++--- silkworm/rpc/core/call_many.cpp | 2 +- silkworm/rpc/core/estimate_gas_oracle.cpp | 2 +- silkworm/rpc/core/evm_debug.cpp | 6 ++--- silkworm/rpc/core/evm_executor.cpp | 1 + silkworm/rpc/core/evm_trace.cpp | 4 ++-- silkworm/rpc/types/call.hpp | 5 ++-- silkworm/rpc/types/call_test.cpp | 28 +++++++++++------------ 8 files changed, 27 insertions(+), 27 deletions(-) diff --git a/silkworm/rpc/commands/eth_api.cpp b/silkworm/rpc/commands/eth_api.cpp index 31fa611770..ff150c2c04 100644 --- a/silkworm/rpc/commands/eth_api.cpp +++ b/silkworm/rpc/commands/eth_api.cpp @@ -1121,7 +1121,7 @@ Task EthereumRpcApi::handle_eth_call(const nlohmann::json& request, std::s co_await tx->close(); // RAII not (yet) available with coroutines co_return; } - silkworm::Transaction txn{call.to_transaction(block_with_hash->block.header.base_fee_per_gas)}; + silkworm::Transaction txn{call.to_transaction()}; const auto execution_result = co_await EVMExecutor::call( chain_config, *chain_storage, workers_, block_with_hash->block, txn, [&](auto& io_executor, auto block_num, auto& storage) { @@ -1304,7 +1304,7 @@ Task EthereumRpcApi::handle_eth_create_access_list(const nlohmann::json& r auto tracer = std::make_shared(); Tracers tracers{tracer}; - auto txn = call.to_transaction(block_with_hash->block.header.base_fee_per_gas, std::nullopt, nonce); + auto txn = call.to_transaction(std::nullopt, nonce); AccessList saved_access_list = call.access_list; while (true) { const auto execution_result = co_await EVMExecutor::call( @@ -1331,7 +1331,7 @@ Task EthereumRpcApi::handle_eth_create_access_list(const nlohmann::json& r reply = make_json_content(request, access_list_result); break; } - txn = call.to_transaction(block_with_hash->block.header.base_fee_per_gas, current_access_list, nonce); + txn = call.to_transaction(current_access_list, nonce); saved_access_list = current_access_list; } } catch (const std::invalid_argument& iv) { diff --git a/silkworm/rpc/core/call_many.cpp b/silkworm/rpc/core/call_many.cpp index 74983df66e..304acdfc6c 100644 --- a/silkworm/rpc/core/call_many.cpp +++ b/silkworm/rpc/core/call_many.cpp @@ -94,7 +94,7 @@ CallManyResult CallExecutor::executes_all_bundles(const silkworm::ChainConfig& c // Don't call reserve here to preallocate result.results - since json value is dynamic it doesn't know yet how much it should allocate! // -> Don't uncomment this line result.results.reserve(bundle.transactions.size()); for (const auto& call : bundle.transactions) { - silkworm::Transaction txn{call.to_transaction(block.header.base_fee_per_gas)}; + silkworm::Transaction txn{call.to_transaction()}; auto call_execution_result = executor.call(blockContext.block_with_hash->block, txn); diff --git a/silkworm/rpc/core/estimate_gas_oracle.cpp b/silkworm/rpc/core/estimate_gas_oracle.cpp index a3a0dbbd95..c83891ee91 100644 --- a/silkworm/rpc/core/estimate_gas_oracle.cpp +++ b/silkworm/rpc/core/estimate_gas_oracle.cpp @@ -84,7 +84,7 @@ Task EstimateGasOracle::estimate_gas(const Call& call, const silk auto state = transaction_.create_state(this_executor, storage_, block_number); ExecutionResult result{evmc_status_code::EVMC_SUCCESS}; - silkworm::Transaction transaction{call.to_transaction(block.header.base_fee_per_gas)}; + silkworm::Transaction transaction{call.to_transaction()}; while (lo + 1 < hi) { EVMExecutor executor{config_, workers_, state}; auto mid = (hi + lo) / 2; diff --git a/silkworm/rpc/core/evm_debug.cpp b/silkworm/rpc/core/evm_debug.cpp index 045f0a4b3d..575981d857 100644 --- a/silkworm/rpc/core/evm_debug.cpp +++ b/silkworm/rpc/core/evm_debug.cpp @@ -450,7 +450,7 @@ Task DebugExecutor::trace_call(json::Stream& stream, const BlockNumberOrHa if (!block_with_hash) { co_return; } - rpc::Transaction transaction{call.to_transaction(block_with_hash->block.header.base_fee_per_gas)}; + rpc::Transaction transaction{call.to_transaction()}; const auto& block = block_with_hash->block; const auto number = block.header.number; @@ -549,7 +549,7 @@ Task DebugExecutor::execute(json::Stream& stream, const ChainStorage& stor } Task DebugExecutor::execute(json::Stream& stream, const ChainStorage& storage, const silkworm::Block& block, const Call& call) { - rpc::Transaction transaction{call.to_transaction(block.header.base_fee_per_gas)}; + rpc::Transaction transaction{call.to_transaction()}; co_await execute(stream, storage, block.header.number, block, transaction, -1); co_return; } @@ -656,7 +656,7 @@ Task DebugExecutor::execute( stream.open_array(); for (const auto& call : bundle.transactions) { - silkworm::Transaction txn{call.to_transaction(block.header.base_fee_per_gas)}; + silkworm::Transaction txn{call.to_transaction()}; stream.open_object(); stream.write_field("structLogs"); diff --git a/silkworm/rpc/core/evm_executor.cpp b/silkworm/rpc/core/evm_executor.cpp index 43973f60a0..043dd966f5 100644 --- a/silkworm/rpc/core/evm_executor.cpp +++ b/silkworm/rpc/core/evm_executor.cpp @@ -275,6 +275,7 @@ ExecutionResult EVMExecutor::call( want = txn.gas_limit * effective_gas_price; } else { want = 0; + std::cout << "want zero\n"; } // EIP-4844 blob gas cost (calc_data_fee) diff --git a/silkworm/rpc/core/evm_trace.cpp b/silkworm/rpc/core/evm_trace.cpp index 1f596b1026..8664124ad3 100644 --- a/silkworm/rpc/core/evm_trace.cpp +++ b/silkworm/rpc/core/evm_trace.cpp @@ -1508,7 +1508,7 @@ Task> TraceCallExecutor::trace_block_transactions(c } Task TraceCallExecutor::trace_call(const silkworm::Block& block, const Call& call, const TraceConfig& config) { - rpc::Transaction transaction{call.to_transaction(block.header.base_fee_per_gas)}; + rpc::Transaction transaction{call.to_transaction()}; auto result = co_await execute(block.header.number, block, transaction, -1, config); co_return result; } @@ -1535,7 +1535,7 @@ Task TraceCallExecutor::trace_calls(const silkworm::Block& for (size_t index{0}; index < calls.size(); index++) { const auto& config = calls[index].trace_config; - silkworm::Transaction transaction{calls[index].call.to_transaction(block.header.base_fee_per_gas)}; + silkworm::Transaction transaction{calls[index].call.to_transaction()}; Tracers tracers; TraceCallTraces traces; diff --git a/silkworm/rpc/types/call.hpp b/silkworm/rpc/types/call.hpp index fbc3ca76c1..619ea4455c 100644 --- a/silkworm/rpc/types/call.hpp +++ b/silkworm/rpc/types/call.hpp @@ -45,8 +45,7 @@ struct Call { std::optional nonce; AccessList access_list; - [[nodiscard]] silkworm::Transaction to_transaction(const std::optional& base_fee_per_gas, - const std::optional& override_access_list = std::nullopt, + [[nodiscard]] silkworm::Transaction to_transaction(const std::optional& override_access_list = std::nullopt, const std::optional override_nonce = std::nullopt) const { silkworm::Transaction txn{}; txn.set_sender(from ? *from : evmc::address{}); @@ -78,7 +77,7 @@ struct Call { // SILKWORM_ASSERT(!gas_price); txn.type = TransactionType::kDynamicFee; txn.max_priority_fee_per_gas = max_priority_fee_per_gas.value_or(intx::uint256{0}); - txn.max_fee_per_gas = max_fee_per_gas.value_or(base_fee_per_gas.value_or(intx::uint256{0})); + txn.max_fee_per_gas = max_fee_per_gas.value_or(intx::uint256{0}); } txn.value = value.value_or(intx::uint256{0}); diff --git a/silkworm/rpc/types/call_test.cpp b/silkworm/rpc/types/call_test.cpp index 50aff12226..246fc63a71 100644 --- a/silkworm/rpc/types/call_test.cpp +++ b/silkworm/rpc/types/call_test.cpp @@ -58,7 +58,7 @@ TEST_CASE("call with gas price", "[rpc][types][call]") { 1, // nonce {}, }; - silkworm::Transaction txn = call.to_transaction(std::nullopt); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); CHECK(txn.max_fee_per_gas == 21000); CHECK(txn.max_priority_fee_per_gas == 21000); @@ -78,10 +78,10 @@ TEST_CASE("call w/o gas price and max_fee_per_gas & max_priority_fee_per_gas not 1, // nonce {}, }; - silkworm::Transaction txn = call.to_transaction(18000); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); - CHECK(txn.max_fee_per_gas == 18000); - CHECK(txn.max_priority_fee_per_gas == 18000); + CHECK(txn.max_fee_per_gas == 0); + CHECK(txn.max_priority_fee_per_gas == 0); CHECK(txn.nonce == 1); } @@ -98,7 +98,7 @@ TEST_CASE("call w/o gas price, max_fee_per_gas & max_priority_fee_per_gas", "[rp 1, // nonce {}, }; - silkworm::Transaction txn = call.to_transaction(std::nullopt); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); CHECK(txn.max_fee_per_gas == 0); CHECK(txn.max_priority_fee_per_gas == 0); @@ -118,9 +118,9 @@ TEST_CASE("call w/o gas price with base_fee", "[rpc][types][call]") { 1, // nonce {}, }; - silkworm::Transaction txn = call.to_transaction(23500); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); - CHECK(txn.max_fee_per_gas == 23500); + CHECK(txn.max_fee_per_gas == 0); CHECK(txn.max_priority_fee_per_gas == 0); CHECK(txn.nonce == 1); } @@ -138,7 +138,7 @@ TEST_CASE("call with gas price and base_fee", "[rpc][types][call]") { 1, // nonce {}, }; - silkworm::Transaction txn = call.to_transaction(23500); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); CHECK(txn.max_fee_per_gas == 21000); CHECK(txn.max_priority_fee_per_gas == 21000); @@ -166,7 +166,7 @@ TEST_CASE("call with no gas price and no max_fee_per_gas and max_priority_fee_pe std::nullopt, 23, }; - silkworm::Transaction txn = call.to_transaction(std::nullopt); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); CHECK(txn.max_fee_per_gas == 0); CHECK(txn.nonce == 23); @@ -183,7 +183,7 @@ TEST_CASE("call with no gas price and valid max_fee_per_gas and max_priority_fee 10000, // max_priority_fee_per_gas 31337, // value silkworm::from_hex("001122aabbcc")}; - silkworm::Transaction txn = call.to_transaction(10000); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.sender() == 0x99f9b87991262f6ba471f09758cde1c0fc1de734_address); CHECK(txn.to == 0x5df9b87991262f6ba471f09758cde1c0fc1de734_address); CHECK(txn.gas_limit == 235); @@ -195,7 +195,7 @@ TEST_CASE("call with no gas price and valid max_fee_per_gas and max_priority_fee TEST_CASE("call with no gas", "[rpc][types][call]") { Call call; - silkworm::Transaction txn = call.to_transaction(std::nullopt); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 50000000); CHECK(txn.value == 0); CHECK(txn.data.empty()); @@ -213,7 +213,7 @@ TEST_CASE("call with AccessList", "[rpc][types][call]") { {}, // data 1, // nonce access_list}; - silkworm::Transaction txn = call.to_transaction(std::nullopt); + silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); CHECK(txn.max_fee_per_gas == 21000); CHECK(txn.max_priority_fee_per_gas == 21000); @@ -233,7 +233,7 @@ TEST_CASE("call with no AccessList and pass it to_transaction", "[rpc][types][ca 31337, // value {}, // data 1}; // nonce - silkworm::Transaction txn = call.to_transaction(std::nullopt, access_list); + silkworm::Transaction txn = call.to_transaction(access_list); CHECK(txn.gas_limit == 235); CHECK(txn.max_fee_per_gas == 21000); CHECK(txn.max_priority_fee_per_gas == 21000); @@ -254,7 +254,7 @@ TEST_CASE("call with no nonce and pass it to_transaction", "[rpc][types][call]") 31337, // value {}, // data std::nullopt}; // nonce - silkworm::Transaction txn = call.to_transaction(std::nullopt, std::nullopt, nonce); + silkworm::Transaction txn = call.to_transaction(std::nullopt, nonce); CHECK(txn.gas_limit == 235); CHECK(txn.max_fee_per_gas == 21000); CHECK(txn.max_priority_fee_per_gas == 21000); From 798749fa0a443e2b57e8bfb6c89ed899e4938219 Mon Sep 17 00:00:00 2001 From: lupin012 <58134934+lupin012@users.noreply.github.com> Date: Fri, 6 Sep 2024 09:22:19 +0200 Subject: [PATCH 2/2] fix unit test --- silkworm/rpc/commands/eth_api_test.cpp | 4 ++-- silkworm/rpc/core/evm_executor.cpp | 1 - silkworm/rpc/types/call_test.cpp | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/silkworm/rpc/commands/eth_api_test.cpp b/silkworm/rpc/commands/eth_api_test.cpp index e038589fda..b1268f82dc 100644 --- a/silkworm/rpc/commands/eth_api_test.cpp +++ b/silkworm/rpc/commands/eth_api_test.cpp @@ -105,14 +105,14 @@ TEST_CASE_METHOD(test_util::RpcApiE2ETest, "unit: eth_feeHistory succeeds if req })"_json); } -TEST_CASE_METHOD(test_util::RpcApiE2ETest, "fuzzy: eth_call invalid params", "[rpc][api]") { +TEST_CASE_METHOD(test_util::RpcApiE2ETest, "eth_call without params on gas", "[rpc][api]") { const auto request = R"({"jsonrpc":"2.0","id":1,"method":"eth_call","params":[{}, "latest"]})"_json; std::string reply; run<&test_util::RequestHandlerForTest::request_and_create_reply>(request, reply); CHECK(nlohmann::json::parse(reply) == R"({ "jsonrpc":"2.0", "id":1, - "error":{"code":-32000,"message":"insufficient funds for gas * price + value: address 0x0000000000000000000000000000000000000000 have 0 want 15240199550000000"} + "result":"0x" })"_json); } diff --git a/silkworm/rpc/core/evm_executor.cpp b/silkworm/rpc/core/evm_executor.cpp index 043dd966f5..43973f60a0 100644 --- a/silkworm/rpc/core/evm_executor.cpp +++ b/silkworm/rpc/core/evm_executor.cpp @@ -275,7 +275,6 @@ ExecutionResult EVMExecutor::call( want = txn.gas_limit * effective_gas_price; } else { want = 0; - std::cout << "want zero\n"; } // EIP-4844 blob gas cost (calc_data_fee) diff --git a/silkworm/rpc/types/call_test.cpp b/silkworm/rpc/types/call_test.cpp index 246fc63a71..c0fccd3571 100644 --- a/silkworm/rpc/types/call_test.cpp +++ b/silkworm/rpc/types/call_test.cpp @@ -80,8 +80,8 @@ TEST_CASE("call w/o gas price and max_fee_per_gas & max_priority_fee_per_gas not }; silkworm::Transaction txn = call.to_transaction(); CHECK(txn.gas_limit == 235); - CHECK(txn.max_fee_per_gas == 0); - CHECK(txn.max_priority_fee_per_gas == 0); + CHECK(txn.max_fee_per_gas == 18000); + CHECK(txn.max_priority_fee_per_gas == 18000); CHECK(txn.nonce == 1); }