reth_storage_api/
header.rs

1use alloc::vec::Vec;
2use alloy_eips::BlockHashOrNumber;
3use alloy_primitives::{BlockHash, BlockNumber, U256};
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 total difficulty by block hash.
48    fn header_td(&self, hash: &BlockHash) -> ProviderResult<Option<U256>>;
49
50    /// Get total difficulty by block number.
51    fn header_td_by_number(&self, number: BlockNumber) -> ProviderResult<Option<U256>>;
52
53    /// Get headers in range of block numbers
54    fn headers_range(
55        &self,
56        range: impl RangeBounds<BlockNumber>,
57    ) -> ProviderResult<Vec<Self::Header>>;
58
59    /// Get a single sealed header by block number.
60    fn sealed_header(
61        &self,
62        number: BlockNumber,
63    ) -> ProviderResult<Option<SealedHeader<Self::Header>>>;
64
65    /// Get headers in range of block numbers.
66    fn sealed_headers_range(
67        &self,
68        range: impl RangeBounds<BlockNumber>,
69    ) -> ProviderResult<Vec<SealedHeader<Self::Header>>> {
70        self.sealed_headers_while(range, |_| true)
71    }
72
73    /// Get sealed headers while `predicate` returns `true` or the range is exhausted.
74    fn sealed_headers_while(
75        &self,
76        range: impl RangeBounds<BlockNumber>,
77        predicate: impl FnMut(&SealedHeader<Self::Header>) -> bool,
78    ) -> ProviderResult<Vec<SealedHeader<Self::Header>>>;
79}