chore: replace generic state provider with boxed trait (#9780)

This commit is contained in:
Federico Gimenez
2024-07-24 21:02:37 +02:00
committed by GitHub
parent 42a92eef07
commit bd7004a06a
2 changed files with 11 additions and 31 deletions

View File

@ -8,19 +8,18 @@ use reth_trie::{updates::TrieUpdates, AccountProof, HashedPostState};
/// A state provider that stores references to in-memory blocks along with their state as well as
/// the historical state provider for fallback lookups.
#[derive(Debug)]
pub struct MemoryOverlayStateProvider<H> {
pub struct MemoryOverlayStateProvider {
/// The collection of executed parent blocks.
in_memory: Vec<ExecutedBlock>,
/// The collection of hashed state from in-memory blocks.
hashed_post_state: HashedPostState,
/// Historical state provider for state lookups that are not found in in-memory blocks.
historical: H,
historical: Box<dyn StateProvider>,
}
impl<H> MemoryOverlayStateProvider<H> {
impl MemoryOverlayStateProvider {
/// Create new memory overlay state provider.
pub fn new(in_memory: Vec<ExecutedBlock>, historical: H) -> Self {
pub fn new(in_memory: Vec<ExecutedBlock>, historical: Box<dyn StateProvider>) -> Self {
let mut hashed_post_state = HashedPostState::default();
for block in &in_memory {
hashed_post_state.extend(block.hashed_state.as_ref().clone());
@ -29,10 +28,7 @@ impl<H> MemoryOverlayStateProvider<H> {
}
}
impl<H> BlockHashReader for MemoryOverlayStateProvider<H>
where
H: BlockHashReader,
{
impl BlockHashReader for MemoryOverlayStateProvider {
fn block_hash(&self, number: BlockNumber) -> ProviderResult<Option<B256>> {
for block in self.in_memory.iter().rev() {
if block.block.number == number {
@ -65,10 +61,7 @@ where
}
}
impl<H> AccountReader for MemoryOverlayStateProvider<H>
where
H: AccountReader + Send,
{
impl AccountReader for MemoryOverlayStateProvider {
fn basic_account(&self, address: Address) -> ProviderResult<Option<Account>> {
for block in self.in_memory.iter().rev() {
if let Some(account) = block.execution_output.account(&address) {
@ -80,10 +73,7 @@ where
}
}
impl<H> StateRootProvider for MemoryOverlayStateProvider<H>
where
H: StateRootProvider + Send,
{
impl StateRootProvider for MemoryOverlayStateProvider {
// TODO: Currently this does not reuse available in-memory trie nodes.
fn hashed_state_root(&self, hashed_state: &HashedPostState) -> ProviderResult<B256> {
let mut state = self.hashed_post_state.clone();
@ -102,10 +92,7 @@ where
}
}
impl<H> StateProofProvider for MemoryOverlayStateProvider<H>
where
H: StateProofProvider + Send,
{
impl StateProofProvider for MemoryOverlayStateProvider {
// TODO: Currently this does not reuse available in-memory trie nodes.
fn hashed_proof(
&self,
@ -119,10 +106,7 @@ where
}
}
impl<H> StateProvider for MemoryOverlayStateProvider<H>
where
H: StateProvider + Send,
{
impl StateProvider for MemoryOverlayStateProvider {
fn storage(
&self,
address: Address,

View File

@ -26,8 +26,7 @@ use reth_primitives::{
SealedBlockWithSenders, SealedHeader, B256, U256,
};
use reth_provider::{
BlockReader, ExecutionOutcome, ProviderError, StateProvider, StateProviderFactory,
StateRootProvider,
BlockReader, ExecutionOutcome, ProviderError, StateProviderFactory, StateRootProvider,
};
use reth_revm::database::StateProviderDatabase;
use reth_rpc_types::{
@ -676,10 +675,7 @@ where
/// This merges the state of all blocks that are part of the chain that the requested block is
/// the head of. This includes all blocks that connect back to the canonical block on disk.
// TODO: return error if the chain has gaps
fn state_provider(
&self,
hash: B256,
) -> ProviderResult<MemoryOverlayStateProvider<Box<dyn StateProvider>>> {
fn state_provider(&self, hash: B256) -> ProviderResult<MemoryOverlayStateProvider> {
let mut in_memory = Vec::new();
let mut parent_hash = hash;
while let Some(executed) = self.state.tree_state.blocks_by_hash.get(&parent_hash) {