diff --git a/crates/net/network/src/config.rs b/crates/net/network/src/config.rs index bde2cf78d9..44f34c3a4b 100644 --- a/crates/net/network/src/config.rs +++ b/crates/net/network/src/config.rs @@ -16,7 +16,7 @@ use reth_eth_wire::{ use reth_ethereum_forks::{ForkFilter, Head}; use reth_network_peers::{mainnet_nodes, pk2id, sepolia_nodes, PeerId, TrustedPeer}; use reth_network_types::{PeersConfig, SessionsConfig}; -use reth_storage_api::{noop::NoopBlockReader, BlockNumReader, BlockReader, HeaderProvider}; +use reth_storage_api::{noop::NoopProvider, BlockNumReader, BlockReader, HeaderProvider}; use reth_tasks::{TaskSpawner, TokioTaskExecutor}; use secp256k1::SECP256K1; use std::{collections::HashSet, net::SocketAddr, sync::Arc}; @@ -498,11 +498,11 @@ impl NetworkConfigBuilder { pub fn build_with_noop_provider( self, chain_spec: Arc, - ) -> NetworkConfig, N> + ) -> NetworkConfig, N> where ChainSpec: EthChainSpec + Hardforks + 'static, { - self.build(NoopBlockReader::new(chain_spec)) + self.build(NoopProvider::eth(chain_spec)) } /// Sets the NAT resolver for external IP. diff --git a/crates/storage/storage-api/src/noop.rs b/crates/storage/storage-api/src/noop.rs index 7325e2b743..9c971e7b29 100644 --- a/crates/storage/storage-api/src/noop.rs +++ b/crates/storage/storage-api/src/noop.rs @@ -1,28 +1,81 @@ //! Various noop implementations for traits. -use std::sync::Arc; - -use crate::{BlockHashReader, BlockNumReader}; -use alloy_primitives::{BlockNumber, B256}; -use reth_chainspec::{ChainInfo, ChainSpecProvider, EthChainSpec}; +use crate::{ + AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, + BlockSource, ChangeSetReader, HeaderProvider, NodePrimitivesProvider, PruneCheckpointReader, + ReceiptProvider, ReceiptProviderIdExt, StageCheckpointReader, StateProofProvider, + StateProvider, StateRootProvider, StorageRootProvider, TransactionVariant, + TransactionsProvider, WithdrawalsProvider, +}; +use alloy_eips::{ + eip4895::{Withdrawal, Withdrawals}, + BlockHashOrNumber, BlockId, +}; +use alloy_primitives::{ + map::{HashMap, HashSet}, + Address, BlockHash, BlockNumber, Bytes, StorageKey, StorageValue, TxHash, TxNumber, B256, U256, +}; +use reth_chainspec::{ChainInfo, ChainSpecProvider, EthChainSpec, MAINNET}; +use reth_db_models::{AccountBeforeTx, StoredBlockBodyIndices}; +use reth_primitives::{ + BlockWithSenders, EthPrimitives, SealedBlockFor, SealedBlockWithSenders, TransactionMeta, +}; +use reth_primitives_traits::{Account, Bytecode, NodePrimitives, SealedHeader}; +use reth_prune_types::{PruneCheckpoint, PruneSegment}; +use reth_stages_types::{StageCheckpoint, StageId}; use reth_storage_errors::provider::ProviderResult; +use reth_trie::{ + updates::TrieUpdates, AccountProof, HashedPostState, HashedStorage, MultiProof, TrieInput, +}; +use std::{ + marker::PhantomData, + ops::{RangeBounds, RangeInclusive}, + sync::Arc, +}; /// Supports various api interfaces for testing purposes. -#[derive(Debug, Clone)] +#[derive(Debug)] #[non_exhaustive] -pub struct NoopBlockReader { +pub struct NoopProvider { chain_spec: Arc, + _phantom: PhantomData, } -impl NoopBlockReader { +impl NoopProvider { + /// Create a new instance for specific primitive types. + pub fn new(chain_spec: Arc) -> Self { + Self { chain_spec, _phantom: Default::default() } + } +} + +impl NoopProvider { /// Create a new instance of the `NoopBlockReader`. - pub const fn new(chain_spec: Arc) -> Self { - Self { chain_spec } + pub fn eth(chain_spec: Arc) -> Self { + Self { chain_spec, _phantom: Default::default() } + } +} + +impl NoopProvider { + /// Create a new instance of the [`NoopProvider`] with the mainnet chain spec. + pub fn mainnet() -> Self { + Self::eth(MAINNET.clone()) + } +} + +impl Default for NoopProvider { + fn default() -> Self { + Self::mainnet() + } +} + +impl Clone for NoopProvider { + fn clone(&self) -> Self { + Self { chain_spec: Arc::clone(&self.chain_spec), _phantom: Default::default() } } } /// Noop implementation for testing purposes -impl BlockHashReader for NoopBlockReader { +impl BlockHashReader for NoopProvider { fn block_hash(&self, _number: u64) -> ProviderResult> { Ok(None) } @@ -36,7 +89,7 @@ impl BlockHashReader for NoopBlockReader { } } -impl BlockNumReader for NoopBlockReader { +impl BlockNumReader for NoopProvider { fn chain_info(&self) -> ProviderResult { Ok(ChainInfo::default()) } @@ -54,10 +107,461 @@ impl BlockNumReader for NoopBlockReader { } } -impl ChainSpecProvider for NoopBlockReader { +impl ChainSpecProvider + for NoopProvider +{ type ChainSpec = ChainSpec; fn chain_spec(&self) -> Arc { self.chain_spec.clone() } } + +impl BlockIdReader for NoopProvider { + fn pending_block_num_hash(&self) -> ProviderResult> { + Ok(None) + } + + fn safe_block_num_hash(&self) -> ProviderResult> { + Ok(None) + } + + fn finalized_block_num_hash(&self) -> ProviderResult> { + Ok(None) + } +} + +impl BlockReaderIdExt for NoopProvider { + fn block_by_id(&self, _id: BlockId) -> ProviderResult> { + Ok(None) + } + + fn sealed_header_by_id( + &self, + _id: BlockId, + ) -> ProviderResult>> { + Ok(None) + } + + fn header_by_id(&self, _id: BlockId) -> ProviderResult> { + Ok(None) + } + + fn ommers_by_id(&self, _id: BlockId) -> ProviderResult>> { + Ok(None) + } +} + +impl BlockReader for NoopProvider { + type Block = N::Block; + + fn find_block_by_hash( + &self, + _hash: B256, + _source: BlockSource, + ) -> ProviderResult> { + Ok(None) + } + + fn block(&self, _id: BlockHashOrNumber) -> ProviderResult> { + Ok(None) + } + + fn pending_block(&self) -> ProviderResult>> { + Ok(None) + } + + fn pending_block_with_senders( + &self, + ) -> ProviderResult>> { + Ok(None) + } + + fn pending_block_and_receipts( + &self, + ) -> ProviderResult, Vec)>> { + Ok(None) + } + + fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { + Ok(None) + } + + fn block_body_indices(&self, _num: u64) -> ProviderResult> { + Ok(None) + } + + fn block_with_senders( + &self, + _id: BlockHashOrNumber, + _transaction_kind: TransactionVariant, + ) -> ProviderResult>> { + Ok(None) + } + + fn sealed_block_with_senders( + &self, + _id: BlockHashOrNumber, + _transaction_kind: TransactionVariant, + ) -> ProviderResult>> { + Ok(None) + } + + fn block_range(&self, _range: RangeInclusive) -> ProviderResult> { + Ok(vec![]) + } + + fn block_with_senders_range( + &self, + _range: RangeInclusive, + ) -> ProviderResult>> { + Ok(vec![]) + } + + fn sealed_block_with_senders_range( + &self, + _range: RangeInclusive, + ) -> ProviderResult>> { + Ok(vec![]) + } +} + +impl TransactionsProvider for NoopProvider { + type Transaction = N::SignedTx; + + fn transaction_id(&self, _tx_hash: TxHash) -> ProviderResult> { + Ok(None) + } + + fn transaction_by_id(&self, _id: TxNumber) -> ProviderResult> { + Ok(None) + } + + fn transaction_by_id_unhashed( + &self, + _id: TxNumber, + ) -> ProviderResult> { + Ok(None) + } + + fn transaction_by_hash(&self, _hash: TxHash) -> ProviderResult> { + Ok(None) + } + + fn transaction_by_hash_with_meta( + &self, + _hash: TxHash, + ) -> ProviderResult> { + Ok(None) + } + + fn transaction_block(&self, _id: TxNumber) -> ProviderResult> { + todo!() + } + + fn transactions_by_block( + &self, + _block_id: BlockHashOrNumber, + ) -> ProviderResult>> { + Ok(None) + } + + fn transactions_by_block_range( + &self, + _range: impl RangeBounds, + ) -> ProviderResult>> { + Ok(Vec::default()) + } + + fn transactions_by_tx_range( + &self, + _range: impl RangeBounds, + ) -> ProviderResult> { + Ok(Vec::default()) + } + + fn senders_by_tx_range( + &self, + _range: impl RangeBounds, + ) -> ProviderResult> { + Ok(Vec::default()) + } + + fn transaction_sender(&self, _id: TxNumber) -> ProviderResult> { + Ok(None) + } +} + +impl ReceiptProvider for NoopProvider { + type Receipt = N::Receipt; + + fn receipt(&self, _id: TxNumber) -> ProviderResult> { + Ok(None) + } + + fn receipt_by_hash(&self, _hash: TxHash) -> ProviderResult> { + Ok(None) + } + + fn receipts_by_block( + &self, + _block: BlockHashOrNumber, + ) -> ProviderResult>> { + Ok(None) + } + + fn receipts_by_tx_range( + &self, + _range: impl RangeBounds, + ) -> ProviderResult> { + Ok(vec![]) + } +} + +impl ReceiptProviderIdExt for NoopProvider {} + +impl HeaderProvider for NoopProvider { + type Header = N::BlockHeader; + + fn header(&self, _block_hash: &BlockHash) -> ProviderResult> { + Ok(None) + } + + fn header_by_number(&self, _num: u64) -> ProviderResult> { + Ok(None) + } + + fn header_td(&self, _hash: &BlockHash) -> ProviderResult> { + Ok(None) + } + + fn header_td_by_number(&self, _number: BlockNumber) -> ProviderResult> { + Ok(None) + } + + fn headers_range( + &self, + _range: impl RangeBounds, + ) -> ProviderResult> { + Ok(vec![]) + } + + fn sealed_header( + &self, + _number: BlockNumber, + ) -> ProviderResult>> { + Ok(None) + } + + fn sealed_headers_while( + &self, + _range: impl RangeBounds, + _predicate: impl FnMut(&SealedHeader) -> bool, + ) -> ProviderResult>> { + Ok(vec![]) + } +} + +impl AccountReader for NoopProvider { + fn basic_account(&self, _address: Address) -> ProviderResult> { + Ok(None) + } +} + +impl ChangeSetReader for NoopProvider { + fn account_block_changeset( + &self, + _block_number: BlockNumber, + ) -> ProviderResult> { + Ok(Vec::default()) + } +} + +impl StateRootProvider for NoopProvider { + fn state_root(&self, _state: HashedPostState) -> ProviderResult { + Ok(B256::default()) + } + + fn state_root_from_nodes(&self, _input: TrieInput) -> ProviderResult { + Ok(B256::default()) + } + + fn state_root_with_updates( + &self, + _state: HashedPostState, + ) -> ProviderResult<(B256, TrieUpdates)> { + Ok((B256::default(), TrieUpdates::default())) + } + + fn state_root_from_nodes_with_updates( + &self, + _input: TrieInput, + ) -> ProviderResult<(B256, TrieUpdates)> { + Ok((B256::default(), TrieUpdates::default())) + } +} + +impl StorageRootProvider for NoopProvider { + fn storage_root( + &self, + _address: Address, + _hashed_storage: HashedStorage, + ) -> ProviderResult { + Ok(B256::default()) + } + + fn storage_proof( + &self, + _address: Address, + slot: B256, + _hashed_storage: HashedStorage, + ) -> ProviderResult { + Ok(reth_trie::StorageProof::new(slot)) + } + + fn storage_multiproof( + &self, + _address: Address, + _slots: &[B256], + _hashed_storage: HashedStorage, + ) -> ProviderResult { + Ok(reth_trie::StorageMultiProof::empty()) + } +} + +impl StateProofProvider for NoopProvider { + fn proof( + &self, + _input: TrieInput, + address: Address, + _slots: &[B256], + ) -> ProviderResult { + Ok(AccountProof::new(address)) + } + + fn multiproof( + &self, + _input: TrieInput, + _targets: HashMap>, + ) -> ProviderResult { + Ok(MultiProof::default()) + } + + fn witness( + &self, + _input: TrieInput, + _target: HashedPostState, + ) -> ProviderResult> { + Ok(HashMap::default()) + } +} + +impl StateProvider for NoopProvider { + fn storage( + &self, + _account: Address, + _storage_key: StorageKey, + ) -> ProviderResult> { + Ok(None) + } + + fn bytecode_by_hash(&self, _code_hash: B256) -> ProviderResult> { + Ok(None) + } +} + +// impl EvmEnvProvider for NoopProvider { +// fn fill_env_at( +// &self, +// _cfg: &mut CfgEnvWithHandlerCfg, +// _block_env: &mut BlockEnv, +// _at: BlockHashOrNumber, +// _evm_config: EvmConfig, +// ) -> ProviderResult<()> +// where +// EvmConfig: ConfigureEvmEnv
, +// { +// Ok(()) +// } +// +// fn fill_env_with_header( +// &self, +// _cfg: &mut CfgEnvWithHandlerCfg, +// _block_env: &mut BlockEnv, +// _header: &Header, +// _evm_config: EvmConfig, +// ) -> ProviderResult<()> +// where +// EvmConfig: ConfigureEvmEnv
, +// { +// Ok(()) +// } +// +// fn fill_cfg_env_at( +// &self, +// _cfg: &mut CfgEnvWithHandlerCfg, +// _at: BlockHashOrNumber, +// _evm_config: EvmConfig, +// ) -> ProviderResult<()> +// where +// EvmConfig: ConfigureEvmEnv
, +// { +// Ok(()) +// } +// +// fn fill_cfg_env_with_header( +// &self, +// _cfg: &mut CfgEnvWithHandlerCfg, +// _header: &Header, +// _evm_config: EvmConfig, +// ) -> ProviderResult<()> +// where +// EvmConfig: ConfigureEvmEnv
, +// { +// Ok(()) +// } +// } + +impl StageCheckpointReader for NoopProvider { + fn get_stage_checkpoint(&self, _id: StageId) -> ProviderResult> { + Ok(None) + } + + fn get_stage_checkpoint_progress(&self, _id: StageId) -> ProviderResult>> { + Ok(None) + } + + fn get_all_checkpoints(&self) -> ProviderResult> { + Ok(Vec::new()) + } +} + +impl WithdrawalsProvider for NoopProvider { + fn withdrawals_by_block( + &self, + _id: BlockHashOrNumber, + _timestamp: u64, + ) -> ProviderResult> { + Ok(None) + } + fn latest_withdrawal(&self) -> ProviderResult> { + Ok(None) + } +} + +impl PruneCheckpointReader for NoopProvider { + fn get_prune_checkpoint( + &self, + _segment: PruneSegment, + ) -> ProviderResult> { + Ok(None) + } + + fn get_prune_checkpoints(&self) -> ProviderResult> { + Ok(Vec::new()) + } +} + +impl NodePrimitivesProvider for NoopProvider { + type Primitives = N; +}