mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-01-29 00:58:11 -05:00
feat: add sealed headers range (#2769)
This commit is contained in:
@@ -467,6 +467,13 @@ mod tests {
|
||||
fn headers_range(&self, _range: impl RangeBounds<BlockNumber>) -> Result<Vec<Header>> {
|
||||
Ok(vec![])
|
||||
}
|
||||
|
||||
fn sealed_headers_range(
|
||||
&self,
|
||||
_range: impl RangeBounds<BlockNumber>,
|
||||
) -> Result<Vec<SealedHeader>> {
|
||||
Ok(vec![])
|
||||
}
|
||||
}
|
||||
|
||||
impl WithdrawalsProvider for Provider {
|
||||
|
||||
@@ -8,8 +8,8 @@ use reth_db::{cursor::DbCursorRO, database::Database, tables, transaction::DbTx}
|
||||
use reth_interfaces::Result;
|
||||
use reth_primitives::{
|
||||
Block, BlockHash, BlockHashOrNumber, BlockNumber, ChainInfo, ChainSpec, Hardfork, Head, Header,
|
||||
Receipt, SealedBlock, TransactionMeta, TransactionSigned, TxHash, TxNumber, Withdrawal, H256,
|
||||
U256,
|
||||
Receipt, SealedBlock, SealedHeader, TransactionMeta, TransactionSigned, TxHash, TxNumber,
|
||||
Withdrawal, H256, U256,
|
||||
};
|
||||
use reth_revm_primitives::{
|
||||
config::revm_spec,
|
||||
@@ -129,6 +129,23 @@ impl<DB: Database> HeaderProvider for ShareableDatabase<DB> {
|
||||
})?
|
||||
.map_err(Into::into)
|
||||
}
|
||||
|
||||
fn sealed_headers_range(
|
||||
&self,
|
||||
range: impl RangeBounds<BlockNumber>,
|
||||
) -> Result<Vec<SealedHeader>> {
|
||||
self.db
|
||||
.view(|tx| -> Result<_> {
|
||||
let mut headers = vec![];
|
||||
for entry in tx.cursor_read::<tables::Headers>()?.walk_range(range)? {
|
||||
let (num, header) = entry?;
|
||||
let hash = read_header_hash(tx, num)?;
|
||||
headers.push(header.seal(hash));
|
||||
}
|
||||
Ok(headers)
|
||||
})?
|
||||
.map_err(Into::into)
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB: Database> BlockHashProvider for ShareableDatabase<DB> {
|
||||
@@ -481,6 +498,23 @@ impl<DB: Database> EvmEnvProvider for ShareableDatabase<DB> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Reads the hash for the given block number
|
||||
///
|
||||
/// Returns an error if no matching entry is found.
|
||||
#[inline]
|
||||
fn read_header_hash<'a, TX>(
|
||||
tx: &TX,
|
||||
number: u64,
|
||||
) -> std::result::Result<BlockHash, reth_interfaces::Error>
|
||||
where
|
||||
TX: DbTx<'a> + Send + Sync,
|
||||
{
|
||||
match tx.get::<tables::CanonicalHeaders>(number)? {
|
||||
Some(hash) => Ok(hash),
|
||||
None => Err(ProviderError::HeaderNotFound(number.into()).into()),
|
||||
}
|
||||
}
|
||||
|
||||
/// Fetches Header and its hash
|
||||
#[inline]
|
||||
fn read_sealed_header<'a, TX>(
|
||||
|
||||
@@ -99,6 +99,13 @@ where
|
||||
fn headers_range(&self, range: impl RangeBounds<BlockNumber>) -> Result<Vec<Header>> {
|
||||
self.database.headers_range(range)
|
||||
}
|
||||
|
||||
fn sealed_headers_range(
|
||||
&self,
|
||||
range: impl RangeBounds<BlockNumber>,
|
||||
) -> Result<Vec<SealedHeader>> {
|
||||
self.database.sealed_headers_range(range)
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockHashProvider for BlockchainProvider<DB, Tree>
|
||||
|
||||
@@ -135,10 +135,7 @@ impl HeaderProvider for MockEthProvider {
|
||||
Ok(Some(sum))
|
||||
}
|
||||
|
||||
fn headers_range(
|
||||
&self,
|
||||
range: impl RangeBounds<reth_primitives::BlockNumber>,
|
||||
) -> Result<Vec<Header>> {
|
||||
fn headers_range(&self, range: impl RangeBounds<BlockNumber>) -> Result<Vec<Header>> {
|
||||
let lock = self.headers.lock();
|
||||
|
||||
let mut headers: Vec<_> =
|
||||
@@ -147,6 +144,13 @@ impl HeaderProvider for MockEthProvider {
|
||||
|
||||
Ok(headers)
|
||||
}
|
||||
|
||||
fn sealed_headers_range(
|
||||
&self,
|
||||
range: impl RangeBounds<BlockNumber>,
|
||||
) -> Result<Vec<SealedHeader>> {
|
||||
Ok(self.headers_range(range)?.into_iter().map(|h| h.seal_slow()).collect())
|
||||
}
|
||||
}
|
||||
|
||||
impl TransactionsProvider for MockEthProvider {
|
||||
|
||||
@@ -166,6 +166,13 @@ impl HeaderProvider for NoopProvider {
|
||||
fn headers_range(&self, _range: impl RangeBounds<BlockNumber>) -> Result<Vec<Header>> {
|
||||
Ok(vec![])
|
||||
}
|
||||
|
||||
fn sealed_headers_range(
|
||||
&self,
|
||||
_range: impl RangeBounds<BlockNumber>,
|
||||
) -> Result<Vec<SealedHeader>> {
|
||||
Ok(vec![])
|
||||
}
|
||||
}
|
||||
|
||||
impl AccountProvider for NoopProvider {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
use auto_impl::auto_impl;
|
||||
use reth_interfaces::Result;
|
||||
use reth_primitives::{BlockHash, BlockHashOrNumber, BlockNumber, Header, U256};
|
||||
use reth_primitives::{BlockHash, BlockHashOrNumber, BlockNumber, Header, SealedHeader, U256};
|
||||
use std::ops::RangeBounds;
|
||||
|
||||
/// Client trait for fetching `Header` related data.
|
||||
@@ -33,4 +33,10 @@ pub trait HeaderProvider: Send + Sync {
|
||||
|
||||
/// Get headers in range of block numbers
|
||||
fn headers_range(&self, range: impl RangeBounds<BlockNumber>) -> Result<Vec<Header>>;
|
||||
|
||||
/// Get headers in range of block numbers
|
||||
fn sealed_headers_range(
|
||||
&self,
|
||||
range: impl RangeBounds<BlockNumber>,
|
||||
) -> Result<Vec<SealedHeader>>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user