From 7764b9a038faecf8f37bddfd37dce4214b73ce52 Mon Sep 17 00:00:00 2001 From: joshieDo <93316087+joshieDo@users.noreply.github.com> Date: Thu, 12 Dec 2024 11:20:03 +0000 Subject: [PATCH] chore: add `OmmersProvider` trait (#13331) --- .../src/providers/blockchain_provider.rs | 15 ++++--- .../provider/src/providers/consistent.rs | 33 +++++++------- .../provider/src/providers/database/mod.rs | 12 ++--- .../src/providers/database/provider.rs | 44 ++++++++++--------- crates/storage/provider/src/providers/mod.rs | 12 ++--- .../src/providers/static_file/manager.rs | 14 +++--- .../storage/provider/src/test_utils/mock.rs | 12 ++--- .../storage/provider/src/test_utils/noop.rs | 13 +++--- crates/storage/storage-api/src/block.rs | 16 ++----- crates/storage/storage-api/src/lib.rs | 3 ++ crates/storage/storage-api/src/noop.rs | 17 ++++--- crates/storage/storage-api/src/ommers.rs | 23 ++++++++++ 12 files changed, 126 insertions(+), 88 deletions(-) create mode 100644 crates/storage/storage-api/src/ommers.rs diff --git a/crates/storage/provider/src/providers/blockchain_provider.rs b/crates/storage/provider/src/providers/blockchain_provider.rs index 2d624fbc7..7d5399897 100644 --- a/crates/storage/provider/src/providers/blockchain_provider.rs +++ b/crates/storage/provider/src/providers/blockchain_provider.rs @@ -35,7 +35,8 @@ use reth_primitives_traits::BlockBody as _; use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; use reth_storage_api::{ - DBProvider, NodePrimitivesProvider, StateCommitmentProvider, StorageChangeSetReader, + DBProvider, NodePrimitivesProvider, OmmersProvider, StateCommitmentProvider, + StorageChangeSetReader, }; use reth_storage_errors::provider::ProviderResult; use reth_trie::HashedPostState; @@ -314,10 +315,6 @@ impl BlockReader for BlockchainProvider2 { Ok(self.canonical_in_memory_state.pending_block_and_receipts()) } - fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { - self.consistent_provider()?.ommers(id) - } - fn block_body_indices( &self, number: BlockNumber, @@ -478,6 +475,12 @@ impl WithdrawalsProvider for BlockchainProvider2 { } } +impl OmmersProvider for BlockchainProvider2 { + fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { + self.consistent_provider()?.ommers(id) + } +} + impl StageCheckpointReader for BlockchainProvider2 { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult> { self.consistent_provider()?.get_stage_checkpoint(id) @@ -815,7 +818,7 @@ mod tests { use reth_primitives_traits::{BlockBody as _, SignedTransaction}; use reth_storage_api::{ BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, BlockSource, - ChangeSetReader, DatabaseProviderFactory, HeaderProvider, ReceiptProvider, + ChangeSetReader, DatabaseProviderFactory, HeaderProvider, OmmersProvider, ReceiptProvider, ReceiptProviderIdExt, StateProviderFactory, TransactionVariant, TransactionsProvider, WithdrawalsProvider, }; diff --git a/crates/storage/provider/src/providers/consistent.rs b/crates/storage/provider/src/providers/consistent.rs index 4604f29db..643bc2e38 100644 --- a/crates/storage/provider/src/providers/consistent.rs +++ b/crates/storage/provider/src/providers/consistent.rs @@ -28,7 +28,8 @@ use reth_primitives_traits::BlockBody; use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; use reth_storage_api::{ - DatabaseProviderFactory, NodePrimitivesProvider, StateProvider, StorageChangeSetReader, + DatabaseProviderFactory, NodePrimitivesProvider, OmmersProvider, StateProvider, + StorageChangeSetReader, }; use reth_storage_errors::provider::ProviderResult; use revm::{ @@ -840,20 +841,6 @@ impl BlockReader for ConsistentProvider { Ok(self.canonical_in_memory_state.pending_block_and_receipts()) } - fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>>> { - 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( &self, number: BlockNumber, @@ -1216,6 +1203,22 @@ impl WithdrawalsProvider for ConsistentProvider { } } +impl OmmersProvider for ConsistentProvider { + fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>>> { + 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 StageCheckpointReader for ConsistentProvider { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult> { self.storage_provider.get_stage_checkpoint(id) diff --git a/crates/storage/provider/src/providers/database/mod.rs b/crates/storage/provider/src/providers/database/mod.rs index bb0e49420..a6195ff81 100644 --- a/crates/storage/provider/src/providers/database/mod.rs +++ b/crates/storage/provider/src/providers/database/mod.rs @@ -26,7 +26,7 @@ use reth_primitives::{ use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; use reth_storage_api::{ - NodePrimitivesProvider, StateCommitmentProvider, TryIntoHistoricalStateProvider, + NodePrimitivesProvider, OmmersProvider, StateCommitmentProvider, TryIntoHistoricalStateProvider, }; use reth_storage_errors::provider::ProviderResult; use reth_trie::HashedPostState; @@ -404,10 +404,6 @@ impl BlockReader for ProviderFactory { self.provider()?.pending_block_and_receipts() } - fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { - self.provider()?.ommers(id) - } - fn block_body_indices( &self, number: BlockNumber, @@ -576,6 +572,12 @@ impl WithdrawalsProvider for ProviderFactory { } } +impl OmmersProvider for ProviderFactory { + fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { + self.provider()?.ommers(id) + } +} + impl StageCheckpointReader for ProviderFactory { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult> { self.provider()?.get_stage_checkpoint(id) diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index eaaecb756..f21773d12 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -60,7 +60,7 @@ use reth_primitives_traits::{Block as _, BlockBody as _, SignedTransaction}; use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; use reth_storage_api::{ - BlockBodyReader, NodePrimitivesProvider, StateProvider, StorageChangeSetReader, + BlockBodyReader, NodePrimitivesProvider, OmmersProvider, StateProvider, StorageChangeSetReader, TryIntoHistoricalStateProvider, }; use reth_storage_errors::provider::{ProviderResult, RootMismatch}; @@ -1222,26 +1222,6 @@ impl BlockReader for DatabaseProvid 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>> { - 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::>(number)?.map(|o| o.ommers); - return Ok(ommers) - } - - Ok(None) - } - fn block_body_indices(&self, num: u64) -> ProviderResult> { Ok(self.tx.get::(num)?) } @@ -1635,6 +1615,28 @@ impl> Withdrawals } } +impl OmmersProvider for DatabaseProvider { + /// 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>> { + 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::>(number)?.map(|o| o.ommers); + return Ok(ommers) + } + + Ok(None) + } +} + impl EvmEnvProvider> for DatabaseProvider { diff --git a/crates/storage/provider/src/providers/mod.rs b/crates/storage/provider/src/providers/mod.rs index 9e9e1d16f..810d6b1c7 100644 --- a/crates/storage/provider/src/providers/mod.rs +++ b/crates/storage/provider/src/providers/mod.rs @@ -37,7 +37,7 @@ use reth_primitives::{ }; use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; -use reth_storage_api::CanonChainTracker; +use reth_storage_api::{CanonChainTracker, OmmersProvider}; use reth_storage_errors::provider::ProviderResult; use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg}; use std::{ @@ -402,10 +402,6 @@ impl BlockReader for BlockchainProvider { Ok(self.tree.pending_block_and_receipts()) } - fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { - self.database.ommers(id) - } - fn block_body_indices( &self, number: BlockNumber, @@ -584,6 +580,12 @@ impl WithdrawalsProvider for BlockchainProvider { } } +impl OmmersProvider for BlockchainProvider { + fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { + self.database.ommers(id) + } +} + impl StageCheckpointReader for BlockchainProvider { fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult> { self.database.provider()?.get_stage_checkpoint(id) diff --git a/crates/storage/provider/src/providers/static_file/manager.rs b/crates/storage/provider/src/providers/static_file/manager.rs index 7af071299..45f22f378 100644 --- a/crates/storage/provider/src/providers/static_file/manager.rs +++ b/crates/storage/provider/src/providers/static_file/manager.rs @@ -43,7 +43,7 @@ use reth_primitives::{ }; use reth_primitives_traits::SignedTransaction; 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 std::{ collections::{hash_map::Entry, BTreeMap, HashMap}, @@ -1628,11 +1628,6 @@ impl> Err(ProviderError::UnsupportedProvider) } - fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { - // Required data not present in static_files - Err(ProviderError::UnsupportedProvider) - } - fn block_body_indices(&self, _num: u64) -> ProviderResult> { // Required data not present in static_files Err(ProviderError::UnsupportedProvider) @@ -1692,6 +1687,13 @@ impl WithdrawalsProvider for StaticFileProvider { } } +impl> OmmersProvider for StaticFileProvider { + fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { + // Required data not present in static_files + Err(ProviderError::UnsupportedProvider) + } +} + impl StatsReader for StaticFileProvider { fn count_entries(&self) -> ProviderResult { match T::NAME { diff --git a/crates/storage/provider/src/test_utils/mock.rs b/crates/storage/provider/src/test_utils/mock.rs index 76a584e6d..7958c4a2d 100644 --- a/crates/storage/provider/src/test_utils/mock.rs +++ b/crates/storage/provider/src/test_utils/mock.rs @@ -29,7 +29,7 @@ use reth_primitives::{ use reth_primitives_traits::SignedTransaction; use reth_stages_types::{StageCheckpoint, StageId}; use reth_storage_api::{ - DatabaseProviderFactory, HashedPostStateProvider, StageCheckpointReader, + DatabaseProviderFactory, HashedPostStateProvider, OmmersProvider, StageCheckpointReader, StateCommitmentProvider, StateProofProvider, StorageRootProvider, }; use reth_storage_errors::provider::{ConsistentViewError, ProviderError, ProviderResult}; @@ -510,10 +510,6 @@ impl BlockReader for MockEthProvider { Ok(None) } - fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { - Ok(None) - } - fn block_body_indices(&self, _num: u64) -> ProviderResult> { Ok(None) } @@ -794,6 +790,12 @@ impl WithdrawalsProvider for MockEthProvider { } } +impl OmmersProvider for MockEthProvider { + fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { + Ok(None) + } +} + impl ChangeSetReader for MockEthProvider { fn account_block_changeset( &self, diff --git a/crates/storage/provider/src/test_utils/noop.rs b/crates/storage/provider/src/test_utils/noop.rs index 065730c9c..5fdc37be6 100644 --- a/crates/storage/provider/src/test_utils/noop.rs +++ b/crates/storage/provider/src/test_utils/noop.rs @@ -28,7 +28,8 @@ use reth_primitives::{ use reth_prune_types::{PruneCheckpoint, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; use reth_storage_api::{ - HashedPostStateProvider, NodePrimitivesProvider, StateProofProvider, StorageRootProvider, + HashedPostStateProvider, NodePrimitivesProvider, OmmersProvider, StateProofProvider, + StorageRootProvider, }; use reth_storage_errors::provider::ProviderResult; use reth_trie::{ @@ -121,10 +122,6 @@ impl BlockReader for NoopProvider { Ok(None) } - fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { - Ok(None) - } - fn block_body_indices(&self, _num: u64) -> ProviderResult> { Ok(None) } @@ -528,6 +525,12 @@ impl WithdrawalsProvider for NoopProvider { } } +impl OmmersProvider for NoopProvider { + fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { + Ok(None) + } +} + impl PruneCheckpointReader for NoopProvider { fn get_prune_checkpoint( &self, diff --git a/crates/storage/storage-api/src/block.rs b/crates/storage/storage-api/src/block.rs index 43a86aaf7..794e399ca 100644 --- a/crates/storage/storage-api/src/block.rs +++ b/crates/storage/storage-api/src/block.rs @@ -1,6 +1,6 @@ use crate::{ - BlockNumReader, HeaderProvider, ReceiptProvider, ReceiptProviderIdExt, TransactionVariant, - TransactionsProvider, WithdrawalsProvider, + BlockNumReader, HeaderProvider, OmmersProvider, ReceiptProvider, ReceiptProviderIdExt, + TransactionVariant, TransactionsProvider, WithdrawalsProvider, }; use alloy_eips::{BlockHashOrNumber, BlockId, BlockNumberOrTag}; use alloy_primitives::{BlockNumber, B256}; @@ -53,6 +53,7 @@ pub trait BlockReader: + TransactionsProvider + ReceiptProvider + WithdrawalsProvider + + OmmersProvider + Send + Sync { @@ -98,11 +99,6 @@ pub trait BlockReader: &self, ) -> ProviderResult, Vec)>>; - /// 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>>; - /// Returns the block with matching hash from the database. /// /// Returns `None` if block is not found. @@ -190,9 +186,6 @@ impl BlockReader for std::sync::Arc { ) -> ProviderResult, Vec)>> { T::pending_block_and_receipts(self) } - fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { - T::ommers(self, id) - } fn block_by_hash(&self, hash: B256) -> ProviderResult> { T::block_by_hash(self, hash) } @@ -259,9 +252,6 @@ impl BlockReader for &T { ) -> ProviderResult, Vec)>> { T::pending_block_and_receipts(self) } - fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { - T::ommers(self, id) - } fn block_by_hash(&self, hash: B256) -> ProviderResult> { T::block_by_hash(self, hash) } diff --git a/crates/storage/storage-api/src/lib.rs b/crates/storage/storage-api/src/lib.rs index 4c5d2ab02..3432c0d02 100644 --- a/crates/storage/storage-api/src/lib.rs +++ b/crates/storage/storage-api/src/lib.rs @@ -55,6 +55,9 @@ pub use chain_info::*; mod withdrawals; pub use withdrawals::*; +mod ommers; +pub use ommers::*; + mod database_provider; pub use database_provider::*; diff --git a/crates/storage/storage-api/src/noop.rs b/crates/storage/storage-api/src/noop.rs index 27cfc8253..153da578e 100644 --- a/crates/storage/storage-api/src/noop.rs +++ b/crates/storage/storage-api/src/noop.rs @@ -3,9 +3,10 @@ use crate::{ AccountReader, BlockHashReader, BlockIdReader, BlockNumReader, BlockReader, BlockReaderIdExt, BlockSource, ChangeSetReader, HashedPostStateProvider, HeaderProvider, NodePrimitivesProvider, - PruneCheckpointReader, ReceiptProvider, ReceiptProviderIdExt, StageCheckpointReader, - StateProofProvider, StateProvider, StateProviderBox, StateProviderFactory, StateRootProvider, - StorageRootProvider, TransactionVariant, TransactionsProvider, WithdrawalsProvider, + OmmersProvider, PruneCheckpointReader, ReceiptProvider, ReceiptProviderIdExt, + StageCheckpointReader, StateProofProvider, StateProvider, StateProviderBox, + StateProviderFactory, StateRootProvider, StorageRootProvider, TransactionVariant, + TransactionsProvider, WithdrawalsProvider, }; use alloy_eips::{ eip4895::{Withdrawal, Withdrawals}, @@ -184,10 +185,6 @@ impl BlockReader for NoopProvider { Ok(None) } - fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { - Ok(None) - } - fn block_body_indices(&self, _num: u64) -> ProviderResult> { Ok(None) } @@ -608,6 +605,12 @@ impl WithdrawalsProvider for NoopProvider OmmersProvider for NoopProvider { + fn ommers(&self, _id: BlockHashOrNumber) -> ProviderResult>> { + Ok(None) + } +} + impl PruneCheckpointReader for NoopProvider { fn get_prune_checkpoint( &self, diff --git a/crates/storage/storage-api/src/ommers.rs b/crates/storage/storage-api/src/ommers.rs new file mode 100644 index 000000000..52c54104e --- /dev/null +++ b/crates/storage/storage-api/src/ommers.rs @@ -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>>; +} + +impl OmmersProvider for std::sync::Arc { + fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { + T::ommers(self, id) + } +} + +impl OmmersProvider for &T { + fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult>> { + T::ommers(self, id) + } +}