diff --git a/crates/consensus/src/verification.rs b/crates/consensus/src/verification.rs index 855e6cf0fa..2cec15a28e 100644 --- a/crates/consensus/src/verification.rs +++ b/crates/consensus/src/verification.rs @@ -417,6 +417,10 @@ mod tests { fn header(&self, _block_number: &BlockHash) -> Result> { Ok(self.parent.clone()) } + + fn header_by_number(&self, _num: u64) -> Result> { + Ok(self.parent.clone()) + } } /// got test block fn mock_block() -> (BlockLocked, Header) { diff --git a/crates/interfaces/src/provider/block.rs b/crates/interfaces/src/provider/block.rs index 4710a22c76..e3e422c7b4 100644 --- a/crates/interfaces/src/provider/block.rs +++ b/crates/interfaces/src/provider/block.rs @@ -2,7 +2,7 @@ use crate::Result; use auto_impl::auto_impl; use reth_primitives::{ rpc::{BlockId, BlockNumber}, - Block, BlockHash, Header, H256, U256, + Block, BlockHash, BlockHashOrNumber, Header, H256, U256, }; /// Client trait for fetching `Header` related data. @@ -15,6 +15,17 @@ pub trait HeaderProvider: Send + Sync { /// Get header by block hash fn header(&self, block_hash: &BlockHash) -> Result>; + + /// Get header by block number + fn header_by_number(&self, num: u64) -> Result>; + + /// Get header by block number or hash + fn header_by_hash_or_number(&self, hash_or_num: BlockHashOrNumber) -> Result> { + match hash_or_num { + BlockHashOrNumber::Hash(hash) => self.header(&hash), + BlockHashOrNumber::Number(num) => self.header_by_number(num), + } + } } /// Api trait for fetching `Block` related data. diff --git a/crates/interfaces/src/provider/db_provider/block.rs b/crates/interfaces/src/provider/db_provider/block.rs index 035858e27a..9290e71364 100644 --- a/crates/interfaces/src/provider/db_provider/block.rs +++ b/crates/interfaces/src/provider/db_provider/block.rs @@ -2,16 +2,18 @@ use crate::{ db::{tables, Database, DbTx}, provider::{HeaderProvider, ProviderImpl}, }; +use reth_primitives::{BlockNumber, Header}; impl HeaderProvider for ProviderImpl { - fn header( - &self, - block_hash: &reth_primitives::BlockHash, - ) -> crate::Result> { + fn header(&self, block_hash: &reth_primitives::BlockHash) -> crate::Result> { self.db.view(|tx| tx.get::((0, *block_hash).into()))?.map_err(Into::into) } - fn is_known(&self, block_hash: &reth_primitives::BlockHash) -> crate::Result { - self.header(block_hash).map(|header| header.is_some()) + fn header_by_number(&self, num: BlockNumber) -> crate::Result> { + if let Some(hash) = self.db.view(|tx| tx.get::(num))?? { + self.header(&hash) + } else { + Ok(None) + } } }