feat: impl StateReader for BlockchainProvider2 (#10618)

This commit is contained in:
Dan Cline
2024-09-03 11:24:02 -04:00
committed by GitHub
parent 9d46b06420
commit 5744ad1fa0
4 changed files with 48 additions and 13 deletions

View File

@ -11,8 +11,8 @@ use crate::{
FinalizedBlockWriter, HashingWriter, HeaderProvider, HeaderSyncGap, HeaderSyncGapProvider,
HistoricalStateProvider, HistoryWriter, LatestStateProvider, OriginalValuesKnown,
ProviderError, PruneCheckpointReader, PruneCheckpointWriter, RequestsProvider, RevertsInit,
StageCheckpointReader, StateChangeWriter, StateProviderBox, StateWriter, StatsReader,
StorageReader, StorageTrieWriter, TransactionVariant, TransactionsProvider,
StageCheckpointReader, StateChangeWriter, StateProviderBox, StateReader, StateWriter,
StatsReader, StorageReader, StorageTrieWriter, TransactionVariant, TransactionsProvider,
TransactionsProviderExt, TrieWriter, WithdrawalsProvider,
};
use itertools::{izip, Itertools};
@ -777,12 +777,14 @@ impl<TX: DbTx> DatabaseProvider<TX> {
/// 1. Take the old value from the changeset
/// 2. Take the new value from the local state
/// 3. Set the local state to the value in the changeset
///
/// If the range is empty, or there are no blocks for the given range, then this returns `None`.
pub fn get_state(
&self,
range: RangeInclusive<BlockNumber>,
) -> ProviderResult<ExecutionOutcome> {
) -> ProviderResult<Option<ExecutionOutcome>> {
if range.is_empty() {
return Ok(ExecutionOutcome::default())
return Ok(None)
}
let start_block_number = *range.start();
@ -790,10 +792,14 @@ impl<TX: DbTx> DatabaseProvider<TX> {
let block_bodies = self.get::<tables::BlockBodyIndices>(range.clone())?;
// get transaction receipts
let from_transaction_num =
block_bodies.first().expect("already checked if there are blocks").1.first_tx_num();
let to_transaction_num =
block_bodies.last().expect("already checked if there are blocks").1.last_tx_num();
let Some(from_transaction_num) = block_bodies.first().map(|bodies| bodies.1.first_tx_num())
else {
return Ok(None)
};
let Some(to_transaction_num) = block_bodies.last().map(|bodies| bodies.1.last_tx_num())
else {
return Ok(None)
};
let storage_range = BlockNumberAddress::range(range.clone());
@ -830,14 +836,14 @@ impl<TX: DbTx> DatabaseProvider<TX> {
receipts.push(block_receipts);
}
Ok(ExecutionOutcome::new_init(
Ok(Some(ExecutionOutcome::new_init(
state,
reverts,
Vec::new(),
receipts.into(),
start_block_number,
Vec::new(),
))
)))
}
/// Populate a [`BundleStateInit`] and [`RevertsInit`] using cursors over the
@ -3223,12 +3229,18 @@ impl<TX: DbTx> BlockExecutionReader for DatabaseProvider<TX> {
let blocks = self.get_block_range(range.clone())?;
// get execution res
let execution_state = self.get_state(range)?;
let execution_state = self.get_state(range)?.unwrap_or_default();
Ok(Chain::new(blocks, execution_state, None))
}
}
impl<TX: DbTx> StateReader for DatabaseProvider<TX> {
fn get_state(&self, block: BlockNumber) -> ProviderResult<Option<ExecutionOutcome>> {
self.get_state(block..=block)
}
}
impl<TX: DbTxMut + DbTx> BlockExecutionWriter for DatabaseProvider<TX> {
fn take_block_and_execution_range(
&self,