feat: add sealed headers range (#2769)

This commit is contained in:
Matthias Seitz
2023-05-22 15:30:00 +02:00
committed by GitHub
parent 8ada7fd2ec
commit 337579176d
6 changed files with 72 additions and 7 deletions

View File

@@ -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 {

View File

@@ -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>(

View File

@@ -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>

View File

@@ -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 {

View File

@@ -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 {

View File

@@ -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>>;
}