chore: add OmmersProvider trait (#13331)

This commit is contained in:
joshieDo
2024-12-12 11:20:03 +00:00
committed by GitHub
parent 328d4937f2
commit 7764b9a038
12 changed files with 126 additions and 88 deletions

View File

@ -35,7 +35,8 @@ use reth_primitives_traits::BlockBody as _;
use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::{ use reth_storage_api::{
DBProvider, NodePrimitivesProvider, StateCommitmentProvider, StorageChangeSetReader, DBProvider, NodePrimitivesProvider, OmmersProvider, StateCommitmentProvider,
StorageChangeSetReader,
}; };
use reth_storage_errors::provider::ProviderResult; use reth_storage_errors::provider::ProviderResult;
use reth_trie::HashedPostState; use reth_trie::HashedPostState;
@ -314,10 +315,6 @@ impl<N: ProviderNodeTypes> BlockReader for BlockchainProvider2<N> {
Ok(self.canonical_in_memory_state.pending_block_and_receipts()) Ok(self.canonical_in_memory_state.pending_block_and_receipts())
} }
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
self.consistent_provider()?.ommers(id)
}
fn block_body_indices( fn block_body_indices(
&self, &self,
number: BlockNumber, number: BlockNumber,
@ -478,6 +475,12 @@ impl<N: ProviderNodeTypes> WithdrawalsProvider for BlockchainProvider2<N> {
} }
} }
impl<N: ProviderNodeTypes> OmmersProvider for BlockchainProvider2<N> {
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
self.consistent_provider()?.ommers(id)
}
}
impl<N: ProviderNodeTypes> StageCheckpointReader for BlockchainProvider2<N> { impl<N: ProviderNodeTypes> StageCheckpointReader for BlockchainProvider2<N> {
fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> {
self.consistent_provider()?.get_stage_checkpoint(id) self.consistent_provider()?.get_stage_checkpoint(id)
@ -815,7 +818,7 @@ mod tests {
use reth_primitives_traits::{BlockBody as _, SignedTransaction}; use reth_primitives_traits::{BlockBody as _, SignedTransaction};
use reth_storage_api::{ use reth_storage_api::{
BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, BlockSource, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, BlockSource,
ChangeSetReader, DatabaseProviderFactory, HeaderProvider, ReceiptProvider, ChangeSetReader, DatabaseProviderFactory, HeaderProvider, OmmersProvider, ReceiptProvider,
ReceiptProviderIdExt, StateProviderFactory, TransactionVariant, TransactionsProvider, ReceiptProviderIdExt, StateProviderFactory, TransactionVariant, TransactionsProvider,
WithdrawalsProvider, WithdrawalsProvider,
}; };

View File

@ -28,7 +28,8 @@ use reth_primitives_traits::BlockBody;
use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::{ use reth_storage_api::{
DatabaseProviderFactory, NodePrimitivesProvider, StateProvider, StorageChangeSetReader, DatabaseProviderFactory, NodePrimitivesProvider, OmmersProvider, StateProvider,
StorageChangeSetReader,
}; };
use reth_storage_errors::provider::ProviderResult; use reth_storage_errors::provider::ProviderResult;
use revm::{ use revm::{
@ -840,20 +841,6 @@ impl<N: ProviderNodeTypes> BlockReader for ConsistentProvider<N> {
Ok(self.canonical_in_memory_state.pending_block_and_receipts()) Ok(self.canonical_in_memory_state.pending_block_and_receipts())
} }
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<HeaderTy<N>>>> {
self.get_in_memory_or_storage_by_block(
id,
|db_provider| db_provider.ommers(id),
|block_state| {
if self.chain_spec().final_paris_total_difficulty(block_state.number()).is_some() {
return Ok(Some(Vec::new()))
}
Ok(block_state.block_ref().block().body.ommers().map(|o| o.to_vec()))
},
)
}
fn block_body_indices( fn block_body_indices(
&self, &self,
number: BlockNumber, number: BlockNumber,
@ -1216,6 +1203,22 @@ impl<N: ProviderNodeTypes> WithdrawalsProvider for ConsistentProvider<N> {
} }
} }
impl<N: ProviderNodeTypes> OmmersProvider for ConsistentProvider<N> {
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<HeaderTy<N>>>> {
self.get_in_memory_or_storage_by_block(
id,
|db_provider| db_provider.ommers(id),
|block_state| {
if self.chain_spec().final_paris_total_difficulty(block_state.number()).is_some() {
return Ok(Some(Vec::new()))
}
Ok(block_state.block_ref().block().body.ommers().map(|o| o.to_vec()))
},
)
}
}
impl<N: ProviderNodeTypes> StageCheckpointReader for ConsistentProvider<N> { impl<N: ProviderNodeTypes> StageCheckpointReader for ConsistentProvider<N> {
fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> {
self.storage_provider.get_stage_checkpoint(id) self.storage_provider.get_stage_checkpoint(id)

View File

@ -26,7 +26,7 @@ use reth_primitives::{
use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::{ use reth_storage_api::{
NodePrimitivesProvider, StateCommitmentProvider, TryIntoHistoricalStateProvider, NodePrimitivesProvider, OmmersProvider, StateCommitmentProvider, TryIntoHistoricalStateProvider,
}; };
use reth_storage_errors::provider::ProviderResult; use reth_storage_errors::provider::ProviderResult;
use reth_trie::HashedPostState; use reth_trie::HashedPostState;
@ -404,10 +404,6 @@ impl<N: ProviderNodeTypes> BlockReader for ProviderFactory<N> {
self.provider()?.pending_block_and_receipts() self.provider()?.pending_block_and_receipts()
} }
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
self.provider()?.ommers(id)
}
fn block_body_indices( fn block_body_indices(
&self, &self,
number: BlockNumber, number: BlockNumber,
@ -576,6 +572,12 @@ impl<N: ProviderNodeTypes> WithdrawalsProvider for ProviderFactory<N> {
} }
} }
impl<N: ProviderNodeTypes> OmmersProvider for ProviderFactory<N> {
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
self.provider()?.ommers(id)
}
}
impl<N: ProviderNodeTypes> StageCheckpointReader for ProviderFactory<N> { impl<N: ProviderNodeTypes> StageCheckpointReader for ProviderFactory<N> {
fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> {
self.provider()?.get_stage_checkpoint(id) self.provider()?.get_stage_checkpoint(id)

View File

@ -60,7 +60,7 @@ use reth_primitives_traits::{Block as _, BlockBody as _, SignedTransaction};
use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::{ use reth_storage_api::{
BlockBodyReader, NodePrimitivesProvider, StateProvider, StorageChangeSetReader, BlockBodyReader, NodePrimitivesProvider, OmmersProvider, StateProvider, StorageChangeSetReader,
TryIntoHistoricalStateProvider, TryIntoHistoricalStateProvider,
}; };
use reth_storage_errors::provider::{ProviderResult, RootMismatch}; use reth_storage_errors::provider::{ProviderResult, RootMismatch};
@ -1222,26 +1222,6 @@ impl<TX: DbTx + 'static, N: NodeTypesForProvider> BlockReader for DatabaseProvid
Ok(None) Ok(None)
} }
/// Returns the ommers for the block with matching id from the database.
///
/// If the block is not found, this returns `None`.
/// If the block exists, but doesn't contain ommers, this returns `None`.
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
if let Some(number) = self.convert_hash_or_number(id)? {
// If the Paris (Merge) hardfork block is known and block is after it, return empty
// ommers.
if self.chain_spec.final_paris_total_difficulty(number).is_some() {
return Ok(Some(Vec::new()))
}
let ommers =
self.tx.get::<tables::BlockOmmers<Self::Header>>(number)?.map(|o| o.ommers);
return Ok(ommers)
}
Ok(None)
}
fn block_body_indices(&self, num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> { fn block_body_indices(&self, num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
Ok(self.tx.get::<tables::BlockBodyIndices>(num)?) Ok(self.tx.get::<tables::BlockBodyIndices>(num)?)
} }
@ -1635,6 +1615,28 @@ impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> Withdrawals
} }
} }
impl<TX: DbTx + 'static, N: NodeTypesForProvider> OmmersProvider for DatabaseProvider<TX, N> {
/// Returns the ommers for the block with matching id from the database.
///
/// If the block is not found, this returns `None`.
/// If the block exists, but doesn't contain ommers, this returns `None`.
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
if let Some(number) = self.convert_hash_or_number(id)? {
// If the Paris (Merge) hardfork block is known and block is after it, return empty
// ommers.
if self.chain_spec.final_paris_total_difficulty(number).is_some() {
return Ok(Some(Vec::new()))
}
let ommers =
self.tx.get::<tables::BlockOmmers<Self::Header>>(number)?.map(|o| o.ommers);
return Ok(ommers)
}
Ok(None)
}
}
impl<TX: DbTx + 'static, N: NodeTypesForProvider> EvmEnvProvider<HeaderTy<N>> impl<TX: DbTx + 'static, N: NodeTypesForProvider> EvmEnvProvider<HeaderTy<N>>
for DatabaseProvider<TX, N> for DatabaseProvider<TX, N>
{ {

View File

@ -37,7 +37,7 @@ use reth_primitives::{
}; };
use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::CanonChainTracker; use reth_storage_api::{CanonChainTracker, OmmersProvider};
use reth_storage_errors::provider::ProviderResult; use reth_storage_errors::provider::ProviderResult;
use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg}; use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg};
use std::{ use std::{
@ -402,10 +402,6 @@ impl<N: TreeNodeTypes> BlockReader for BlockchainProvider<N> {
Ok(self.tree.pending_block_and_receipts()) Ok(self.tree.pending_block_and_receipts())
} }
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
self.database.ommers(id)
}
fn block_body_indices( fn block_body_indices(
&self, &self,
number: BlockNumber, number: BlockNumber,
@ -584,6 +580,12 @@ impl<N: ProviderNodeTypes> WithdrawalsProvider for BlockchainProvider<N> {
} }
} }
impl<N: TreeNodeTypes> OmmersProvider for BlockchainProvider<N> {
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
self.database.ommers(id)
}
}
impl<N: ProviderNodeTypes> StageCheckpointReader for BlockchainProvider<N> { impl<N: ProviderNodeTypes> StageCheckpointReader for BlockchainProvider<N> {
fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> {
self.database.provider()?.get_stage_checkpoint(id) self.database.provider()?.get_stage_checkpoint(id)

View File

@ -43,7 +43,7 @@ use reth_primitives::{
}; };
use reth_primitives_traits::SignedTransaction; use reth_primitives_traits::SignedTransaction;
use reth_stages_types::{PipelineTarget, StageId}; use reth_stages_types::{PipelineTarget, StageId};
use reth_storage_api::DBProvider; use reth_storage_api::{DBProvider, OmmersProvider};
use reth_storage_errors::provider::{ProviderError, ProviderResult}; use reth_storage_errors::provider::{ProviderError, ProviderResult};
use std::{ use std::{
collections::{hash_map::Entry, BTreeMap, HashMap}, collections::{hash_map::Entry, BTreeMap, HashMap},
@ -1628,11 +1628,6 @@ impl<N: FullNodePrimitives<SignedTx: Value, Receipt: Value, BlockHeader: Value>>
Err(ProviderError::UnsupportedProvider) Err(ProviderError::UnsupportedProvider)
} }
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
// Required data not present in static_files
Err(ProviderError::UnsupportedProvider)
}
fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> { fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
// Required data not present in static_files // Required data not present in static_files
Err(ProviderError::UnsupportedProvider) Err(ProviderError::UnsupportedProvider)
@ -1692,6 +1687,13 @@ impl<N: NodePrimitives> WithdrawalsProvider for StaticFileProvider<N> {
} }
} }
impl<N: FullNodePrimitives<BlockHeader: Value>> OmmersProvider for StaticFileProvider<N> {
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
// Required data not present in static_files
Err(ProviderError::UnsupportedProvider)
}
}
impl<N: NodePrimitives> StatsReader for StaticFileProvider<N> { impl<N: NodePrimitives> StatsReader for StaticFileProvider<N> {
fn count_entries<T: Table>(&self) -> ProviderResult<usize> { fn count_entries<T: Table>(&self) -> ProviderResult<usize> {
match T::NAME { match T::NAME {

View File

@ -29,7 +29,7 @@ use reth_primitives::{
use reth_primitives_traits::SignedTransaction; use reth_primitives_traits::SignedTransaction;
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::{ use reth_storage_api::{
DatabaseProviderFactory, HashedPostStateProvider, StageCheckpointReader, DatabaseProviderFactory, HashedPostStateProvider, OmmersProvider, StageCheckpointReader,
StateCommitmentProvider, StateProofProvider, StorageRootProvider, StateCommitmentProvider, StateProofProvider, StorageRootProvider,
}; };
use reth_storage_errors::provider::{ConsistentViewError, ProviderError, ProviderResult}; use reth_storage_errors::provider::{ConsistentViewError, ProviderError, ProviderResult};
@ -510,10 +510,6 @@ impl BlockReader for MockEthProvider {
Ok(None) Ok(None)
} }
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
Ok(None)
}
fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> { fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
Ok(None) Ok(None)
} }
@ -794,6 +790,12 @@ impl WithdrawalsProvider for MockEthProvider {
} }
} }
impl OmmersProvider for MockEthProvider {
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
Ok(None)
}
}
impl ChangeSetReader for MockEthProvider { impl ChangeSetReader for MockEthProvider {
fn account_block_changeset( fn account_block_changeset(
&self, &self,

View File

@ -28,7 +28,8 @@ use reth_primitives::{
use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::{ use reth_storage_api::{
HashedPostStateProvider, NodePrimitivesProvider, StateProofProvider, StorageRootProvider, HashedPostStateProvider, NodePrimitivesProvider, OmmersProvider, StateProofProvider,
StorageRootProvider,
}; };
use reth_storage_errors::provider::ProviderResult; use reth_storage_errors::provider::ProviderResult;
use reth_trie::{ use reth_trie::{
@ -121,10 +122,6 @@ impl BlockReader for NoopProvider {
Ok(None) Ok(None)
} }
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
Ok(None)
}
fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> { fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
Ok(None) Ok(None)
} }
@ -528,6 +525,12 @@ impl WithdrawalsProvider for NoopProvider {
} }
} }
impl OmmersProvider for NoopProvider {
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>> {
Ok(None)
}
}
impl PruneCheckpointReader for NoopProvider { impl PruneCheckpointReader for NoopProvider {
fn get_prune_checkpoint( fn get_prune_checkpoint(
&self, &self,

View File

@ -1,6 +1,6 @@
use crate::{ use crate::{
BlockNumReader, HeaderProvider, ReceiptProvider, ReceiptProviderIdExt, TransactionVariant, BlockNumReader, HeaderProvider, OmmersProvider, ReceiptProvider, ReceiptProviderIdExt,
TransactionsProvider, WithdrawalsProvider, TransactionVariant, TransactionsProvider, WithdrawalsProvider,
}; };
use alloy_eips::{BlockHashOrNumber, BlockId, BlockNumberOrTag}; use alloy_eips::{BlockHashOrNumber, BlockId, BlockNumberOrTag};
use alloy_primitives::{BlockNumber, B256}; use alloy_primitives::{BlockNumber, B256};
@ -53,6 +53,7 @@ pub trait BlockReader:
+ TransactionsProvider + TransactionsProvider
+ ReceiptProvider + ReceiptProvider
+ WithdrawalsProvider + WithdrawalsProvider
+ OmmersProvider
+ Send + Send
+ Sync + Sync
{ {
@ -98,11 +99,6 @@ pub trait BlockReader:
&self, &self,
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>>; ) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>>;
/// Returns the ommers/uncle headers of the given block from the database.
///
/// Returns `None` if block is not found.
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>>;
/// Returns the block with matching hash from the database. /// Returns the block with matching hash from the database.
/// ///
/// Returns `None` if block is not found. /// Returns `None` if block is not found.
@ -190,9 +186,6 @@ impl<T: BlockReader> BlockReader for std::sync::Arc<T> {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> { ) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
T::pending_block_and_receipts(self) T::pending_block_and_receipts(self)
} }
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
T::ommers(self, id)
}
fn block_by_hash(&self, hash: B256) -> ProviderResult<Option<Self::Block>> { fn block_by_hash(&self, hash: B256) -> ProviderResult<Option<Self::Block>> {
T::block_by_hash(self, hash) T::block_by_hash(self, hash)
} }
@ -259,9 +252,6 @@ impl<T: BlockReader> BlockReader for &T {
) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> { ) -> ProviderResult<Option<(SealedBlockFor<Self::Block>, Vec<Self::Receipt>)>> {
T::pending_block_and_receipts(self) T::pending_block_and_receipts(self)
} }
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
T::ommers(self, id)
}
fn block_by_hash(&self, hash: B256) -> ProviderResult<Option<Self::Block>> { fn block_by_hash(&self, hash: B256) -> ProviderResult<Option<Self::Block>> {
T::block_by_hash(self, hash) T::block_by_hash(self, hash)
} }

View File

@ -55,6 +55,9 @@ pub use chain_info::*;
mod withdrawals; mod withdrawals;
pub use withdrawals::*; pub use withdrawals::*;
mod ommers;
pub use ommers::*;
mod database_provider; mod database_provider;
pub use database_provider::*; pub use database_provider::*;

View File

@ -3,9 +3,10 @@
use crate::{ use crate::{
AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt,
BlockSource, ChangeSetReader, HashedPostStateProvider, HeaderProvider, NodePrimitivesProvider, BlockSource, ChangeSetReader, HashedPostStateProvider, HeaderProvider, NodePrimitivesProvider,
PruneCheckpointReader, ReceiptProvider, ReceiptProviderIdExt, StageCheckpointReader, OmmersProvider, PruneCheckpointReader, ReceiptProvider, ReceiptProviderIdExt,
StateProofProvider, StateProvider, StateProviderBox, StateProviderFactory, StateRootProvider, StageCheckpointReader, StateProofProvider, StateProvider, StateProviderBox,
StorageRootProvider, TransactionVariant, TransactionsProvider, WithdrawalsProvider, StateProviderFactory, StateRootProvider, StorageRootProvider, TransactionVariant,
TransactionsProvider, WithdrawalsProvider,
}; };
use alloy_eips::{ use alloy_eips::{
eip4895::{Withdrawal, Withdrawals}, eip4895::{Withdrawal, Withdrawals},
@ -184,10 +185,6 @@ impl<C: Send + Sync, N: NodePrimitives> BlockReader for NoopProvider<C, N> {
Ok(None) Ok(None)
} }
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
Ok(None)
}
fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> { fn block_body_indices(&self, _num: u64) -> ProviderResult<Option<StoredBlockBodyIndices>> {
Ok(None) Ok(None)
} }
@ -608,6 +605,12 @@ impl<C: Send + Sync, N: NodePrimitives> WithdrawalsProvider for NoopProvider<C,
} }
} }
impl<C: Send + Sync, N: NodePrimitives> OmmersProvider for NoopProvider<C, N> {
fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
Ok(None)
}
}
impl<C: Send + Sync, N: NodePrimitives> PruneCheckpointReader for NoopProvider<C, N> { impl<C: Send + Sync, N: NodePrimitives> PruneCheckpointReader for NoopProvider<C, N> {
fn get_prune_checkpoint( fn get_prune_checkpoint(
&self, &self,

View File

@ -0,0 +1,23 @@
use crate::HeaderProvider;
use alloy_eips::BlockHashOrNumber;
use reth_storage_errors::provider::ProviderResult;
/// Client trait for fetching ommers.
pub trait OmmersProvider: HeaderProvider + Send + Sync {
/// Returns the ommers/uncle headers of the given block from the database.
///
/// Returns `None` if block is not found.
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>>;
}
impl<T: OmmersProvider> OmmersProvider for std::sync::Arc<T> {
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
T::ommers(self, id)
}
}
impl<T: OmmersProvider> OmmersProvider for &T {
fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Self::Header>>> {
T::ommers(self, id)
}
}