From 2d221dbf49b89eb0145e2ccb811b218829306e0b Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 1 Oct 2024 20:34:14 +0200 Subject: [PATCH] fix: use pending state if available (#11391) --- .../src/providers/blockchain_provider.rs | 26 +++++++------------ 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/crates/storage/provider/src/providers/blockchain_provider.rs b/crates/storage/provider/src/providers/blockchain_provider.rs index 2f906f5f8..491a66d2f 100644 --- a/crates/storage/provider/src/providers/blockchain_provider.rs +++ b/crates/storage/provider/src/providers/blockchain_provider.rs @@ -233,9 +233,8 @@ impl BlockchainProvider2 { /// This uses a given [`BlockState`] to initialize a state provider for that block. fn block_state_provider( &self, - state: impl AsRef, + state: &BlockState, ) -> ProviderResult { - let state = state.as_ref(); let anchor_hash = state.anchor().hash; let latest_historical = self.database.history_by_block_hash(anchor_hash)?; Ok(self.canonical_in_memory_state.state_provider_from_state(state, latest_historical)) @@ -1077,7 +1076,7 @@ impl StateProviderFactory for BlockchainProvider2 { // use latest state provider if the head state exists if let Some(state) = self.canonical_in_memory_state.head_state() { trace!(target: "providers::blockchain", "Using head state for latest state provider"); - Ok(self.block_state_provider(state)?.boxed()) + Ok(self.block_state_provider(&state)?.boxed()) } else { trace!(target: "providers::blockchain", "Using database state for latest state provider"); self.database.latest() @@ -1103,7 +1102,7 @@ impl StateProviderFactory for BlockchainProvider2 { Ok(state) } else if let Some(state) = self.canonical_in_memory_state.state_by_hash(block_hash) { // ... or this could be tracked by the in memory state - let state_provider = self.block_state_provider(state)?; + let state_provider = self.block_state_provider(&state)?; Ok(Box::new(state_provider)) } else { // if we couldn't find it anywhere, then we should return an error @@ -1132,12 +1131,9 @@ impl StateProviderFactory for BlockchainProvider2 { fn pending(&self) -> ProviderResult { trace!(target: "providers::blockchain", "Getting provider for pending state"); - if let Some(block) = self.canonical_in_memory_state.pending_block_num_hash() { - let historical = self.database.history_by_block_hash(block.hash)?; - let pending_provider = - self.canonical_in_memory_state.state_provider(block.hash, historical); - - return Ok(Box::new(pending_provider)); + if let Some(pending) = self.canonical_in_memory_state.pending_state() { + // we have a pending block + return Ok(Box::new(self.block_state_provider(&pending)?)); } // fallback to latest state if the pending block is not available @@ -1145,13 +1141,9 @@ impl StateProviderFactory for BlockchainProvider2 { } fn pending_state_by_hash(&self, block_hash: B256) -> ProviderResult> { - let historical = self.database.history_by_block_hash(block_hash)?; - if let Some(block) = self.canonical_in_memory_state.pending_block_num_hash() { - if block.hash == block_hash { - let pending_provider = - self.canonical_in_memory_state.state_provider(block_hash, historical); - - return Ok(Some(Box::new(pending_provider))) + if let Some(pending) = self.canonical_in_memory_state.pending_state() { + if pending.hash() == block_hash { + return Ok(Some(Box::new(self.block_state_provider(&pending)?))); } } Ok(None)