Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rpcdaemon: fix ots_searchTransactionsBefore + ots_searchTransactionsAfter #2022

Merged
merged 17 commits into from
May 23, 2024
Merged
Next Next commit
fix on data filtering
lupin012 committed May 14, 2024
commit 4cf2c7768a54803c56fbef144041bda15f136c9d
14 changes: 7 additions & 7 deletions silkworm/rpc/commands/ots_api.cpp
Original file line number Diff line number Diff line change
@@ -711,16 +711,16 @@ Task<void> OtsRpcApi::handle_ots_search_transactions_before(const nlohmann::json
has_more = co_await trace_blocks(from_to_provider, *tx, address, page_size, result_count, transactions_with_receipts_vec);

for (const auto& item : transactions_with_receipts_vec) {
for (uint64_t i = item.transactions.size() - 1; i > 0 && i < item.transactions.size(); i--) {
receipts.push_back(item.receipts.at(i));
transactions.push_back(item.transactions.at(i));
blocks.push_back(item.blocks.at(i));
for (size_t i = item.transactions.size() - 1; i > 0; i--) {
receipts.push_back(std::move(item.receipts.at(i)));
transactions.push_back(std::move(item.transactions.at(i)));
blocks.push_back(std::move(item.blocks.at(i)));
}

if (!item.transactions.empty()) {
receipts.push_back(item.receipts.at(0));
transactions.push_back(item.transactions.at(0));
blocks.push_back(item.blocks.at(0));
receipts.push_back(std::move(item.receipts.at(0)));
transactions.push_back(std::move(item.transactions.at(0)));
blocks.push_back(std::move(item.blocks.at(0)));
}

result_count += item.transactions.size();
22 changes: 15 additions & 7 deletions silkworm/rpc/core/evm_trace.cpp
Original file line number Diff line number Diff line change
@@ -1530,7 +1530,7 @@ Task<bool> TraceCallExecutor::trace_touch_transaction(const silkworm::Block& blo
auto tracer = std::make_shared<trace::TouchTracer>(address, initial_ibs);
Tracers tracers{tracer};

executor.call(block, txn, tracers, /*refund=*/true, /*gas_bailout=*/true);
executor.call(block, txn, tracers, /*refund=*/true, /*gas_bailout=*/false);
return tracer->found();
});

@@ -1782,22 +1782,30 @@ void TouchTracer::on_execution_start(evmc_revision, const evmc_message& msg, evm
auto sender = evmc::address{msg.sender};
auto recipient = evmc::address{msg.recipient};
auto code_address = evmc::address{msg.code_address};
auto kind = msg.kind;

bool create = (!initial_ibs_.exists(recipient) && recipient != code_address);

if (!found_ && (sender == address_ || recipient == address_ || code_address == address_)) {
this->found_ = true;
if (sender == address_ || recipient == address_ || (code_address == address_ && (kind == EVMC_DELEGATECALL || kind == EVMC_CALLCODE))) {
found_ = true;
}

SILK_DEBUG << "TouchTracer::on_execution_start: gas: " << std::dec << msg.gas
<< " create: " << create
<< ", msg.depth: " << msg.depth
<< ", msg.kind: " << msg.kind
<< ", sender: " << sender
<< ", recipient: " << recipient << " (created: " << create << ")"
<< ", recipient: " << recipient
<< ", code_address: " << code_address
<< ", msg.value: " << intx::hex(intx::be::load<intx::uint256>(msg.value))
<< ", code: " << silkworm::to_hex(code);
}

void TouchTracer::on_self_destruct(const evmc::address& address, const evmc::address& beneficiary) noexcept {
if (found_) {
return;
}
if (address == address_ || beneficiary == address_) {
found_ = true;
}
}


} // namespace silkworm::rpc::trace
1 change: 1 addition & 0 deletions silkworm/rpc/core/evm_trace.hpp
Original file line number Diff line number Diff line change
@@ -429,6 +429,7 @@ class TouchTracer : public silkworm::EvmTracer {
TouchTracer& operator=(const TouchTracer&) = delete;

void on_execution_start(evmc_revision rev, const evmc_message& msg, evmone::bytes_view code) noexcept override;
void on_self_destruct(const evmc::address& address, const evmc::address& beneficiary) noexcept override;

bool found() const { return found_; }