From 85e6d9ac5b8455774eddd8c595d21110052630f5 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Mon, 15 May 2023 15:49:09 +0200 Subject: [PATCH] feat(rpc): set starting block to latest at launch (#2668) --- crates/rpc/rpc/src/eth/api/mod.rs | 18 ++++++++++++++++-- crates/storage/provider/src/test_utils/mock.rs | 6 +++--- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/crates/rpc/rpc/src/eth/api/mod.rs b/crates/rpc/rpc/src/eth/api/mod.rs index 6e6b7fa2a6..793c2d6b68 100644 --- a/crates/rpc/rpc/src/eth/api/mod.rs +++ b/crates/rpc/rpc/src/eth/api/mod.rs @@ -70,7 +70,10 @@ pub struct EthApi { fee_history_cache: FeeHistoryCache, } -impl EthApi { +impl EthApi +where + Client: BlockProviderIdExt, +{ /// Creates a new, shareable instance. pub fn new( client: Client, @@ -79,6 +82,14 @@ impl EthApi { eth_cache: EthStateCache, gas_oracle: GasPriceOracle, ) -> Self { + // get the block number of the latest block + let latest_block = client + .header_by_number_or_tag(BlockNumberOrTag::Latest) + .ok() + .flatten() + .map(|header| header.number) + .unwrap_or_default(); + let inner = EthApiInner { client, pool, @@ -86,6 +97,7 @@ impl EthApi { signers: Default::default(), eth_cache, gas_oracle, + starting_block: U256::from(latest_block), }; Self { inner: Arc::new(inner), @@ -232,7 +244,7 @@ where self.client().chain_info().map(|info| info.best_number).unwrap_or_default(), ); SyncStatus::Info(SyncInfo { - starting_block: U256::from(0), + starting_block: self.inner.starting_block, current_block, highest_block: current_block, warp_chunks_amount: None, @@ -259,4 +271,6 @@ struct EthApiInner { eth_cache: EthStateCache, /// The async gas oracle frontend for gas price suggestions gas_oracle: GasPriceOracle, + /// The block number at which the node started + starting_block: U256, } diff --git a/crates/storage/provider/src/test_utils/mock.rs b/crates/storage/provider/src/test_utils/mock.rs index 1dc1b17851..20ec5bfbb4 100644 --- a/crates/storage/provider/src/test_utils/mock.rs +++ b/crates/storage/provider/src/test_utils/mock.rs @@ -5,7 +5,7 @@ use crate::{ StateProvider, StateProviderBox, StateProviderFactory, StateRootProvider, TransactionsProvider, }; use parking_lot::Mutex; -use reth_interfaces::Result; +use reth_interfaces::{provider::ProviderError, Result}; use reth_primitives::{ keccak256, Account, Address, Block, BlockHash, BlockHashOrNumber, BlockId, BlockNumber, Bytecode, Bytes, ChainInfo, Header, Receipt, SealedBlock, SealedHeader, StorageKey, @@ -243,7 +243,7 @@ impl BlockNumProvider for MockEthProvider { .iter() .find(|(_, header)| header.number == best_block_number) .map(|(hash, header)| ChainInfo { best_hash: *hash, best_number: header.number }) - .expect("provider is empty")) + .unwrap_or_default()) } fn best_block_number(&self) -> Result { @@ -252,7 +252,7 @@ impl BlockNumProvider for MockEthProvider { .iter() .max_by_key(|h| h.1.number) .map(|(_, header)| header.number) - .expect("provider is empty")) + .ok_or(ProviderError::HeaderNotFound)?) } fn block_number(&self, hash: H256) -> Result> {