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: impl providers for BlockNumberFromBlockHash & BlockHashFromBlockNumber #2398

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion cmd/dev/grpc_toolbox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -991,7 +991,9 @@ int execute_temporal_kv_query(const std::string& target, KVQueryFunc<Q> query_fu
*grpc_context,
&state_cache,
rpc::ethdb::kv::block_provider(&eth_backend),
rpc::ethdb::kv::block_number_from_txn_hash_provider(&eth_backend)};
rpc::ethdb::kv::block_number_from_txn_hash_provider(&eth_backend),
rpc::ethdb::kv::block_number_from_block_hash_provider(&eth_backend),
rpc::ethdb::kv::block_hash_from_block_number_provider(&eth_backend)};
auto kv_service = client.service();

// NOLINTNEXTLINE(performance-unnecessary-value-param)
Expand Down
8 changes: 6 additions & 2 deletions silkworm/db/chain/remote_chain_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,14 @@ namespace silkworm::db::chain {

RemoteChainStorage::RemoteChainStorage(kv::api::Transaction& tx,
BlockProvider block_provider,
BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider)
BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
BlockHashFromBlockNumberProvider block_hash_from_number_provider)
: tx_{tx},
block_provider_{std::move(block_provider)},
block_number_from_txn_hash_provider_{std::move(block_number_from_txn_hash_provider)} {}
block_number_from_txn_hash_provider_{std::move(block_number_from_txn_hash_provider)},
block_number_from_block_hash_provider_{std::move(block_number_from_block_hash_provider)},
block_hash_from_number_provider_{std::move(block_hash_from_number_provider)} {}

Task<ChainConfig> RemoteChainStorage::read_chain_config() const {
const auto genesis_block_hash{co_await read_canonical_block_hash(tx_, kEarliestBlockNumber)};
Expand Down
8 changes: 7 additions & 1 deletion silkworm/db/chain/remote_chain_storage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,14 +28,18 @@ namespace silkworm::db::chain {

using BlockProvider = std::function<Task<bool>(BlockNum, HashAsSpan, bool, Block&)>;
using BlockNumberFromTxnHashProvider = std::function<Task<BlockNum>(HashAsSpan)>;
using BlockNumberFromBlockHashProvider = std::function<Task<BlockNum>(HashAsSpan)>;
using BlockHashFromBlockNumberProvider = std::function<Task<evmc::bytes32>(BlockNum)>;

//! RemoteChainStorage must be used when blockchain data is remote with respect to the running component, i.e. it is
//! in remote database (accessed via gRPC KV I/F) or remote snapshot files (accessed via gRPC ETHBACKEND I/F)
class RemoteChainStorage : public ChainStorage {
public:
RemoteChainStorage(kv::api::Transaction& tx,
BlockProvider block_provider,
BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider);
BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
BlockHashFromBlockNumberProvider block_hash_from_number_provider);
~RemoteChainStorage() override = default;

[[nodiscard]] Task<ChainConfig> read_chain_config() const override;
Expand Down Expand Up @@ -80,6 +84,8 @@ class RemoteChainStorage : public ChainStorage {
kv::api::Transaction& tx_;
BlockProvider block_provider_;
BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider_;
BlockNumberFromBlockHashProvider block_number_from_block_hash_provider_;
BlockHashFromBlockNumberProvider block_hash_from_number_provider_;
};

} // namespace silkworm::db::chain
2 changes: 1 addition & 1 deletion silkworm/db/chain/remote_chain_storage_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ static Bytes kChainConfig{*from_hex(

struct RemoteChainStorageTest : public silkworm::test_util::ContextTestBase {
test_util::MockTransaction transaction;
RemoteChainStorage storage{transaction, {}, {}};
RemoteChainStorage storage{transaction, {}, {}, {}, {}};
};

TEST_CASE_METHOD(RemoteChainStorageTest, "read_chain_config") {
Expand Down
22 changes: 21 additions & 1 deletion silkworm/db/kv/grpc/client/remote_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,25 +43,33 @@ class RemoteClientImpl final : public api::Service {
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider,
rpc::DisconnectHook on_disconnect)
: channel_{create_channel()},
stub_{proto::KV::NewStub(channel_)},
grpc_context_{grpc_context},
state_cache_{state_cache},
block_provider_{std::move(block_provider)},
block_number_from_txn_hash_provider_{std::move(block_number_from_txn_hash_provider)},
block_number_from_block_hash_provider_{std::move(block_number_from_block_hash_provider)},
block_hash_from_number_provider_{std::move(block_hash_from_number_provider)},
on_disconnect_{std::move(on_disconnect)} {}
RemoteClientImpl(std::unique_ptr<Stub> stub,
agrpc::GrpcContext& grpc_context,
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider,
rpc::DisconnectHook on_disconnect)
: stub_{std::move(stub)},
grpc_context_{grpc_context},
state_cache_{state_cache},
block_provider_{std::move(block_provider)},
block_number_from_txn_hash_provider_{std::move(block_number_from_txn_hash_provider)},
block_number_from_block_hash_provider_{std::move(block_number_from_block_hash_provider)},
block_hash_from_number_provider_{std::move(block_hash_from_number_provider)},
on_disconnect_{std::move(on_disconnect)} {}

~RemoteClientImpl() override = default;
Expand All @@ -80,7 +88,9 @@ class RemoteClientImpl final : public api::Service {
grpc_context_,
state_cache_,
block_provider_,
block_number_from_txn_hash_provider_);
block_number_from_txn_hash_provider_,
block_number_from_block_hash_provider_,
block_hash_from_number_provider_);
co_await tx->open();
co_return tx;
}
Expand Down Expand Up @@ -151,6 +161,8 @@ class RemoteClientImpl final : public api::Service {
api::StateCache* state_cache_;
chain::BlockProvider block_provider_;
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider_;
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider_;
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider_;
rpc::DisconnectHook on_disconnect_;
std::chrono::milliseconds min_backoff_timeout_{rpc::kDefaultMinBackoffReconnectTimeout};
std::chrono::milliseconds max_backoff_timeout_{rpc::kDefaultMaxBackoffReconnectTimeout};
Expand All @@ -161,25 +173,33 @@ RemoteClient::RemoteClient(const rpc::ChannelFactory& create_channel,
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider,
rpc::DisconnectHook on_disconnect)
: p_impl_{std::make_shared<RemoteClientImpl>(create_channel,
grpc_context,
state_cache,
std::move(block_provider),
std::move(block_number_from_txn_hash_provider),
std::move(block_number_from_block_hash_provider),
std::move(block_hash_from_number_provider),
std::move(on_disconnect))} {}

RemoteClient::RemoteClient(std::unique_ptr<Stub> stub,
agrpc::GrpcContext& grpc_context,
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider,
rpc::DisconnectHook on_disconnect)
: p_impl_{std::make_shared<RemoteClientImpl>(std::move(stub),
grpc_context,
state_cache,
std::move(block_provider),
std::move(block_number_from_txn_hash_provider),
std::move(block_number_from_block_hash_provider),
std::move(block_hash_from_number_provider),
std::move(on_disconnect))} {}

// Must be here (not in header) because RemoteClientImpl size is necessary for std::unique_ptr in PIMPL idiom
Expand Down
4 changes: 4 additions & 0 deletions silkworm/db/kv/grpc/client/remote_client.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,17 @@ struct RemoteClient : public api::Client {
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider,
std::function<Task<void>()> on_disconnect = []() -> Task<void> { co_return; });
RemoteClient(
std::unique_ptr<::remote::KV::StubInterface> stub,
agrpc::GrpcContext& grpc_context,
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider,
std::function<Task<void>()> on_disconnect = []() -> Task<void> { co_return; });
~RemoteClient() override;

Expand Down
8 changes: 7 additions & 1 deletion silkworm/db/kv/grpc/client/remote_client_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,20 @@ struct RemoteClientTestRunner : public TestRunner<RemoteClient, StrictMockKVStub
// We're not testing blocks here, so we don't care about proper block-number-from-txn-hash provider
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider{
[](HashAsSpan) -> Task<BlockNum> { co_return 0; }};
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider{
[](HashAsSpan) -> Task<BlockNum> { co_return 0; }};
chain::BlockHashFromBlockNumberProvider block_hash_from_block_number_provider{
[](BlockNum) -> Task<evmc::bytes32> { co_return 0; }};

protected:
RemoteClient make_api_client() override {
return RemoteClient{std::move(stub_),
grpc_context_,
state_cache.get(),
block_provider,
block_number_from_txn_hash_provider};
block_number_from_txn_hash_provider,
block_number_from_block_hash_provider,
block_hash_from_block_number_provider};
}
};

Expand Down
8 changes: 6 additions & 2 deletions silkworm/db/kv/grpc/client/remote_transaction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,14 @@ RemoteTransaction::RemoteTransaction(
agrpc::GrpcContext& grpc_context,
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider)
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider)
: BaseTransaction(state_cache),
block_provider_{std::move(block_provider)},
block_number_from_txn_hash_provider_{std::move(block_number_from_txn_hash_provider)},
block_number_from_block_hash_provider_{std::move(block_number_from_block_hash_provider)},
block_hash_from_number_provider_{std::move(block_hash_from_number_provider)},
stub_{stub},
grpc_context_{grpc_context},
tx_rpc_{grpc_context_} {}
Expand Down Expand Up @@ -114,7 +118,7 @@ std::shared_ptr<silkworm::State> RemoteTransaction::create_state(boost::asio::an
}

std::shared_ptr<chain::ChainStorage> RemoteTransaction::create_storage() {
return std::make_shared<chain::RemoteChainStorage>(*this, block_provider_, block_number_from_txn_hash_provider_);
return std::make_shared<chain::RemoteChainStorage>(*this, block_provider_, block_number_from_txn_hash_provider_, block_number_from_block_hash_provider_, block_hash_from_number_provider_);
}

Task<api::DomainPointResult> RemoteTransaction::domain_get(api::DomainPointQuery&& query) { // NOLINT(*-rvalue-reference-param-not-moved)
Expand Down
6 changes: 5 additions & 1 deletion silkworm/db/kv/grpc/client/remote_transaction.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,9 @@ class RemoteTransaction : public api::BaseTransaction {
agrpc::GrpcContext& grpc_context,
api::StateCache* state_cache,
chain::BlockProvider block_provider,
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider);
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider,
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider,
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider);
~RemoteTransaction() override = default;

uint64_t tx_id() const override { return tx_id_; }
Expand Down Expand Up @@ -81,6 +83,8 @@ class RemoteTransaction : public api::BaseTransaction {

chain::BlockProvider block_provider_;
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider_;
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider_;
chain::BlockHashFromBlockNumberProvider block_hash_from_number_provider_;
std::map<std::string, std::shared_ptr<api::CursorDupSort>> cursors_;
std::map<std::string, std::shared_ptr<api::CursorDupSort>> dup_cursors_;
::remote::KV::StubInterface& stub_;
Expand Down
2 changes: 2 additions & 0 deletions silkworm/db/kv/grpc/client/remote_transaction_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ struct RemoteTransactionTest : db::test_util::KVTestBase {
grpc_context_,
&state_cache_,
{},
{},
{},
{}};
};

Expand Down
8 changes: 7 additions & 1 deletion silkworm/db/kv/state_changes_stream_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -85,14 +85,20 @@ struct RemoteStateChangesStreamTest : public StateChangesStreamTest {
// We're not testing blocks here, so we don't care about proper block-number-from-txn-hash provider
chain::BlockNumberFromTxnHashProvider block_number_from_txn_hash_provider{
[](HashAsSpan) -> Task<BlockNum> { co_return 0; }};
chain::BlockNumberFromBlockHashProvider block_number_from_block_hash_provider{
[](HashAsSpan) -> Task<BlockNum> { co_return 0; }};
chain::BlockHashFromBlockNumberProvider block_hash_from_block_number_provider{
[](BlockNum) -> Task<evmc::bytes32> { co_return 0; }};

RemoteClient make_remote_client(auto&& channel_or_stub) {
return {
std::forward<decltype(channel_or_stub)>(channel_or_stub),
grpc_context_,
state_cache.get(),
block_provider,
block_number_from_txn_hash_provider};
block_number_from_txn_hash_provider,
block_number_from_block_hash_provider,
block_hash_from_block_number_provider};
}
};

Expand Down
12 changes: 10 additions & 2 deletions silkworm/rpc/core/estimate_gas_oracle_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,16 @@ TEST_CASE("estimate gas") {
remote_db_test.grpc_context_,
&remote_db_test.state_cache_,
ethdb::kv::block_provider(&backend),
ethdb::kv::block_number_from_txn_hash_provider(&backend));
const db::chain::RemoteChainStorage storage{*tx, ethdb::kv::block_provider(&backend), ethdb::kv::block_number_from_txn_hash_provider(&backend)};
ethdb::kv::block_number_from_txn_hash_provider(&backend),
ethdb::kv::block_number_from_block_hash_provider(&backend),
ethdb::kv::block_hash_from_block_number_provider(&backend));
const db::chain::RemoteChainStorage storage{
*tx,
ethdb::kv::block_provider(&backend),
ethdb::kv::block_number_from_txn_hash_provider(&backend),
ethdb::kv::block_number_from_block_hash_provider(&backend),
ethdb::kv::block_hash_from_block_number_provider(&backend),
};
MockEstimateGasOracle estimate_gas_oracle{block_header_provider, account_reader, config, workers, *tx, storage};

SECTION("Call empty, always fails but success in last step") {
Expand Down
2 changes: 1 addition & 1 deletion silkworm/rpc/core/evm_debug_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ struct DebugExecutorTest : public test_util::ServiceContextTestBase {
boost::asio::any_io_executor io_executor{io_context_.get_executor()};
json::Stream stream{io_executor, writer};
test::BackEndMock backend;
RemoteChainStorage chain_storage{transaction, ethdb::kv::block_provider(&backend), ethdb::kv::block_number_from_txn_hash_provider(&backend)};
RemoteChainStorage chain_storage{transaction, ethdb::kv::block_provider(&backend), ethdb::kv::block_number_from_txn_hash_provider(&backend), ethdb::kv::block_number_from_block_hash_provider(&backend), ethdb::kv::block_hash_from_block_number_provider(&backend)};
};

class TestDebugExecutor : DebugExecutor {
Expand Down
4 changes: 3 additions & 1 deletion silkworm/rpc/core/evm_executor_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,9 @@ struct EVMExecutorTest : public test_util::ServiceContextTestBase {
test::BackEndMock backend;
RemoteChainStorage storage{transaction,
ethdb::kv::block_provider(&backend),
ethdb::kv::block_number_from_txn_hash_provider(&backend)};
ethdb::kv::block_number_from_txn_hash_provider(&backend),
ethdb::kv::block_number_from_block_hash_provider(&backend),
ethdb::kv::block_hash_from_block_number_provider(&backend)};
const uint64_t chain_id{11155111};
const ChainConfig* chain_config_ptr{lookup_chain_config(chain_id)};
BlockNum block_number{6'000'000};
Expand Down
Loading
Loading