Skip to content

Commit c0c479e

Browse files
authored
rpcdaemon: fix result as error in some ots API (#2053)
1 parent 3975da4 commit c0c479e

File tree

6 files changed

+22
-35
lines changed

6 files changed

+22
-35
lines changed

.github/workflows/rpc-integration-tests.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ jobs:
2727
- name: Checkout RPC Tests Repository & Install Requirements
2828
run: |
2929
rm -rf ${{runner.workspace}}/rpc-tests
30-
git -c advice.detachedHead=false clone --depth 1 --branch v0.23.0 https://github.com/erigontech/rpc-tests ${{runner.workspace}}/rpc-tests
30+
git -c advice.detachedHead=false clone --depth 1 --branch v0.24.0 https://github.com/erigontech/rpc-tests ${{runner.workspace}}/rpc-tests
3131
cd ${{runner.workspace}}/rpc-tests
3232
pip3 install -r requirements.txt
3333

silkworm/rpc/commands/ots_api.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -547,8 +547,9 @@ Task<void> OtsRpcApi::handle_ots_trace_transaction(const nlohmann::json& request
547547
const auto transaction_with_block = co_await core::read_transaction_by_hash(*block_cache_, *chain_storage, transaction_hash);
548548

549549
if (!transaction_with_block.has_value()) {
550-
reply = make_json_content(request, nlohmann::detail::value_t::null);
551-
co_await tx->close();
550+
const auto error_msg = "transaction 0x" + silkworm::to_hex(transaction_hash) + " not found";
551+
reply = make_json_error(request, -32000, error_msg);
552+
co_await tx->close(); // RAII not (yet) available with coroutines
552553
co_return;
553554
}
554555

@@ -594,7 +595,8 @@ Task<void> OtsRpcApi::handle_ots_get_transaction_error(const nlohmann::json& req
594595
const auto transaction_with_block = co_await core::read_transaction_by_hash(*block_cache_, *chain_storage, transaction_hash);
595596

596597
if (!transaction_with_block.has_value()) {
597-
reply = make_json_content(request, nlohmann::detail::value_t::null);
598+
const auto error_msg = "transaction 0x" + silkworm::to_hex(transaction_hash) + " not found";
599+
reply = make_json_error(request, -32000, error_msg);
598600
co_await tx->close();
599601
co_return;
600602
}
@@ -641,7 +643,8 @@ Task<void> OtsRpcApi::handle_ots_get_internal_operations(const nlohmann::json& r
641643
const auto transaction_with_block = co_await core::read_transaction_by_hash(*block_cache_, *chain_storage, transaction_hash);
642644

643645
if (!transaction_with_block.has_value()) {
644-
reply = make_json_content(request, nlohmann::detail::value_t::null);
646+
const auto error_msg = "transaction 0x" + silkworm::to_hex(transaction_hash) + " not found";
647+
reply = make_json_error(request, -32000, error_msg);
645648
co_await tx->close();
646649
co_return;
647650
}

silkworm/rpc/core/evm_executor.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,13 @@ uint64_t EVMExecutor::refund_gas(const EVM& evm, const silkworm::Transaction& tx
178178
return gas_left;
179179
}
180180

181+
void EVMExecutor::call_first_n(const silkworm::Block& block, const uint64_t n, const Tracers& tracers, bool refund, bool gas_bailout) {
182+
for (size_t idx = 0; idx < block.transactions.size() && idx < n; idx++) {
183+
const auto& txn = block.transactions.at(idx);
184+
call(block, txn, tracers, refund, gas_bailout);
185+
}
186+
}
187+
181188
void EVMExecutor::reset() {
182189
ibs_state_.clear_journal_and_substate();
183190
}

silkworm/rpc/core/evm_executor.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ class EVMExecutor {
126126

127127
void reset();
128128

129+
void call_first_n(const silkworm::Block& block, const uint64_t n, const Tracers& tracers = {}, bool refund = true, bool gas_bailout = false);
130+
129131
const IntraBlockState& get_ibs_state() { return ibs_state_; }
130132

131133
private:

silkworm/rpc/core/evm_trace.cpp

Lines changed: 5 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,21 +1460,6 @@ Task<std::vector<Trace>> TraceCallExecutor::trace_transaction(const BlockWithHas
14601460
co_return traces;
14611461
}
14621462

1463-
bool TraceCallExecutor::run_previous_transactions(EVMExecutor& executor, const silkworm::Block& block, uint64_t tx_id) {
1464-
if (tx_id == 0) {
1465-
return true;
1466-
}
1467-
for (size_t idx = 0; idx < block.transactions.size(); idx++) {
1468-
const auto& txn = block.transactions.at(idx);
1469-
1470-
if (tx_id == idx) {
1471-
return true;
1472-
}
1473-
executor.call(block, txn, {}, /*refund=*/true, /*gas_bailout=*/false);
1474-
}
1475-
return false;
1476-
}
1477-
14781463
Task<TraceEntriesResult> TraceCallExecutor::trace_transaction_entries(const TransactionWithBlock& transaction_with_block) {
14791464
const auto& block = transaction_with_block.block_with_hash->block;
14801465
const auto block_number = block.header.number;
@@ -1489,10 +1474,7 @@ Task<TraceEntriesResult> TraceCallExecutor::trace_transaction_entries(const Tran
14891474
auto curr_state = tx_.create_state(current_executor, database_reader_, chain_storage_, block_number - 1);
14901475
EVMExecutor executor{*chain_config_ptr, workers_, curr_state};
14911476

1492-
if (!run_previous_transactions(executor, block, transaction_with_block.transaction.transaction_index)) {
1493-
SILK_ERROR << "trace_operations: transaction idx: " << transaction_with_block.transaction.transaction_index << " not found";
1494-
return {};
1495-
}
1477+
executor.call_first_n(block, transaction_with_block.transaction.transaction_index);
14961478

14971479
const auto entry_tracer = std::make_shared<trace::EntryTracer>(initial_ibs);
14981480
Tracers tracers{entry_tracer};
@@ -1520,10 +1502,7 @@ Task<std::string> TraceCallExecutor::trace_transaction_error(const TransactionWi
15201502
auto curr_state = tx_.create_state(current_executor, database_reader_, chain_storage_, block_number - 1);
15211503
EVMExecutor executor{*chain_config_ptr, workers_, curr_state};
15221504

1523-
if (!run_previous_transactions(executor, block, transaction_with_block.transaction.transaction_index)) {
1524-
SILK_ERROR << "trace_transaction_error: transaction idx: " << transaction_with_block.transaction.transaction_index << " not found";
1525-
return {};
1526-
}
1505+
executor.call_first_n(block, transaction_with_block.transaction.transaction_index);
15271506

15281507
const auto& txn = block.transactions.at(transaction_with_block.transaction.transaction_index);
15291508
auto execution_result = executor.call(block, txn, {}, /*refund=*/true, /*gas_bailout=*/false);
@@ -1553,10 +1532,7 @@ Task<TraceOperationsResult> TraceCallExecutor::trace_operations(const Transactio
15531532
auto curr_state = tx_.create_state(current_executor, database_reader_, chain_storage_, block_number - 1);
15541533
EVMExecutor executor{*chain_config_ptr, workers_, curr_state};
15551534

1556-
if (!run_previous_transactions(executor, block, transaction_with_block.transaction.transaction_index)) {
1557-
SILK_ERROR << "trace_operations: transaction idx: " << transaction_with_block.transaction.transaction_index << " not found";
1558-
return {};
1559-
}
1535+
executor.call_first_n(block, transaction_with_block.transaction.transaction_index);
15601536

15611537
auto entry_tracer = std::make_shared<trace::OperationTracer>(initial_ibs);
15621538
Tracers tracers{entry_tracer};
@@ -1785,6 +1761,8 @@ void EntryTracer::on_execution_start(evmc_revision rev, const evmc_message& msg,
17851761
const auto str_value = "0x" + intx::hex(intx::be::load<intx::uint256>(msg.value));
17861762
auto str_input = "0x" + silkworm::to_hex(input);
17871763

1764+
current_depth_ = msg.depth;
1765+
17881766
// Ignore precompiles in the returned trace (maybe we shouldn't?)
17891767
if (precompile::is_precompile(msg.code_address, rev)) {
17901768
// writes special value for index
@@ -1817,7 +1795,6 @@ void EntryTracer::on_execution_start(evmc_revision rev, const evmc_message& msg,
18171795
}
18181796
}
18191797
traces_stack_idx_.emplace(result_.size() - 1);
1820-
current_depth_ = msg.depth;
18211798

18221799
SILK_DEBUG << "EntryTracer::on_execution_start: gas: " << std::dec << msg.gas
18231800
<< ", msg.depth: " << msg.depth

silkworm/rpc/core/evm_trace.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,8 +494,6 @@ class TraceCallExecutor {
494494
std::int32_t index,
495495
const TraceConfig& config);
496496

497-
bool run_previous_transactions(EVMExecutor& executor, const silkworm::Block& block, uint64_t tx_id);
498-
499497
silkworm::BlockCache& block_cache_;
500498
const core::rawdb::DatabaseReader& database_reader_;
501499
const ChainStorage& chain_storage_;

0 commit comments

Comments
 (0)