reth_storage_api/
header.rs

1use alloc::vec::Vec;
2use alloy_eips::BlockHashOrNumber;
3use alloy_primitives::{BlockHash, BlockNumber};
4use core::ops::RangeBounds;
5use reth_primitives_traits::{BlockHeader, SealedHeader};
6use reth_storage_errors::provider::ProviderResult;
7
8/// A helper type alias to access [`HeaderProvider::Header`].
9pub type ProviderHeader<P> = <P as HeaderProvider>::Header;
10
11/// Client trait for fetching `Header` related data.
12#[auto_impl::auto_impl(&, Arc)]
13pub trait HeaderProvider: Send + Sync {
14    /// The header type this provider supports.
15    type Header: BlockHeader;
16
17    /// Check if block is known
18    fn is_known(&self, block_hash: BlockHash) -> ProviderResult<bool> {
19        self.header(block_hash).map(|header| header.is_some())
20    }
21
22    /// Get header by block hash
23    fn header(&self, block_hash: BlockHash) -> ProviderResult<Option<Self::Header>>;
24
25    /// Retrieves the header sealed by the given block hash.
26    fn sealed_header_by_hash(
27        &self,
28        block_hash: BlockHash,
29    ) -> ProviderResult<Option<SealedHeader<Self::Header>>> {
30        Ok(self.header(block_hash)?.map(|header| SealedHeader::new(header, block_hash)))
31    }
32
33    /// Get header by block number
34    fn header_by_number(&self, num: u64) -> ProviderResult<Option<Self::Header>>;
35
36    /// Get header by block number or hash
37    fn header_by_hash_or_number(
38        &self,
39        hash_or_num: BlockHashOrNumber,
40    ) -> ProviderResult<Option<Self::Header>> {
41        match hash_or_num {
42            BlockHashOrNumber::Hash(hash) => self.header(hash),
43            BlockHashOrNumber::Number(num) => self.header_by_number(num),
44        }
45    }
46
47    /// Get headers in range of block numbers
48    fn headers_range(
49        &self,
50        range: impl RangeBounds<BlockNumber>,
51    ) -> ProviderResult<Vec<Self::Header>>;
52
53    /// Get a single sealed header by block number.
54    fn sealed_header(
55        &self,
56        number: BlockNumber,
57    ) -> ProviderResult<Option<SealedHeader<Self::Header>>>;
58
59    /// Get headers in range of block numbers.
60    fn sealed_headers_range(
61        &self,
62        range: impl RangeBounds<BlockNumber>,
63    ) -> ProviderResult<Vec<SealedHeader<Self::Header>>> {
64        self.sealed_headers_while(range, |_| true)
65    }
66
67    /// Get sealed headers while `predicate` returns `true` or the range is exhausted.
68    fn sealed_headers_while(
69        &self,
70        range: impl RangeBounds<BlockNumber>,
71        predicate: impl FnMut(&SealedHeader<Self::Header>) -> bool,
72    ) -> ProviderResult<Vec<SealedHeader<Self::Header>>>;
73}