From 36d74400e692c5570fc17f6c9da0295608d6a0e4 Mon Sep 17 00:00:00 2001 From: Roman Krasiuk Date: Fri, 5 Jul 2024 03:45:08 -0700 Subject: [PATCH] feat(trie): pass state reference to `StateProofProvider::proof` (#9308) --- crates/engine/tree/src/tree/memory_overlay.rs | 7 ++++++- crates/revm/src/test_utils.rs | 7 ++++++- crates/rpc/rpc-eth-api/src/helpers/state.rs | 3 ++- crates/rpc/rpc-eth-types/src/cache/db.rs | 3 ++- .../provider/src/providers/bundle_state_provider.rs | 7 ++++++- .../provider/src/providers/state/historical.rs | 7 ++++++- .../storage/provider/src/providers/state/latest.rs | 13 +++++++++---- .../storage/provider/src/providers/state/macros.rs | 2 +- crates/storage/provider/src/test_utils/mock.rs | 7 ++++++- crates/storage/provider/src/test_utils/noop.rs | 7 ++++++- crates/storage/storage-api/src/trie.rs | 10 ++++++++-- 11 files changed, 58 insertions(+), 15 deletions(-) diff --git a/crates/engine/tree/src/tree/memory_overlay.rs b/crates/engine/tree/src/tree/memory_overlay.rs index 06bfc4186383..f11eece8e7d0 100644 --- a/crates/engine/tree/src/tree/memory_overlay.rs +++ b/crates/engine/tree/src/tree/memory_overlay.rs @@ -95,7 +95,12 @@ impl StateProofProvider for MemoryOverlayStateProvider where H: StateProofProvider + Send, { - fn proof(&self, address: Address, slots: &[B256]) -> ProviderResult { + fn proof( + &self, + state: &BundleState, + address: Address, + slots: &[B256], + ) -> ProviderResult { todo!() } } diff --git a/crates/revm/src/test_utils.rs b/crates/revm/src/test_utils.rs index e3cf0cedd6cf..0459cf679ec0 100644 --- a/crates/revm/src/test_utils.rs +++ b/crates/revm/src/test_utils.rs @@ -79,7 +79,12 @@ impl StateRootProvider for StateProviderTest { } impl StateProofProvider for StateProviderTest { - fn proof(&self, _address: Address, _slots: &[B256]) -> ProviderResult { + fn proof( + &self, + _state: &BundleState, + _address: Address, + _slots: &[B256], + ) -> ProviderResult { unimplemented!("proof generation is not supported") } } diff --git a/crates/rpc/rpc-eth-api/src/helpers/state.rs b/crates/rpc/rpc-eth-api/src/helpers/state.rs index 107d4a1c0c6a..05af8f547acf 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/state.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/state.rs @@ -11,6 +11,7 @@ use reth_rpc_eth_types::{ use reth_rpc_types::{serde_helpers::JsonStorageKey, EIP1186AccountProofResponse}; use reth_rpc_types_compat::proof::from_primitive_account_proof; use reth_transaction_pool::{PoolTransaction, TransactionPool}; +use revm::db::BundleState; use revm_primitives::{BlockEnv, CfgEnvWithHandlerCfg, SpecId}; use super::{EthApiSpec, LoadPendingBlock, SpawnBlocking}; @@ -104,7 +105,7 @@ pub trait EthState: LoadState + SpawnBlocking { Ok(self.spawn_blocking_io(move |this| { let state = this.state_at_block_id(block_id)?; let storage_keys = keys.iter().map(|key| key.0).collect::>(); - let proof = state.proof(address, &storage_keys)?; + let proof = state.proof(&BundleState::default(), address, &storage_keys)?; Ok(from_primitive_account_proof(proof)) })) } diff --git a/crates/rpc/rpc-eth-types/src/cache/db.rs b/crates/rpc/rpc-eth-types/src/cache/db.rs index 82713147c1ba..2bd93daf748b 100644 --- a/crates/rpc/rpc-eth-types/src/cache/db.rs +++ b/crates/rpc/rpc-eth-types/src/cache/db.rs @@ -34,10 +34,11 @@ impl<'a> reth_provider::StateRootProvider for StateProviderTraitObjWrapper<'a> { impl<'a> reth_provider::StateProofProvider for StateProviderTraitObjWrapper<'a> { fn proof( &self, + state: &revm::db::BundleState, address: revm_primitives::Address, slots: &[B256], ) -> reth_errors::ProviderResult { - self.0.proof(address, slots) + self.0.proof(state, address, slots) } } diff --git a/crates/storage/provider/src/providers/bundle_state_provider.rs b/crates/storage/provider/src/providers/bundle_state_provider.rs index 19dbff3862ac..09a6de864763 100644 --- a/crates/storage/provider/src/providers/bundle_state_provider.rs +++ b/crates/storage/provider/src/providers/bundle_state_provider.rs @@ -84,7 +84,12 @@ impl StateRootProvider impl StateProofProvider for BundleStateProvider { - fn proof(&self, _address: Address, _slots: &[B256]) -> ProviderResult { + fn proof( + &self, + _bundle: &BundleState, + _address: Address, + _slots: &[B256], + ) -> ProviderResult { Err(ProviderError::StateRootNotAvailableForHistoricalBlock) } } diff --git a/crates/storage/provider/src/providers/state/historical.rs b/crates/storage/provider/src/providers/state/historical.rs index eaf134beba17..87de4102fd10 100644 --- a/crates/storage/provider/src/providers/state/historical.rs +++ b/crates/storage/provider/src/providers/state/historical.rs @@ -274,7 +274,12 @@ impl<'b, TX: DbTx> StateRootProvider for HistoricalStateProviderRef<'b, TX> { impl<'b, TX: DbTx> StateProofProvider for HistoricalStateProviderRef<'b, TX> { /// Get account and storage proofs. - fn proof(&self, _address: Address, _slots: &[B256]) -> ProviderResult { + fn proof( + &self, + _state: &BundleState, + _address: Address, + _slots: &[B256], + ) -> ProviderResult { Err(ProviderError::StateRootNotAvailableForHistoricalBlock) } } diff --git a/crates/storage/provider/src/providers/state/latest.rs b/crates/storage/provider/src/providers/state/latest.rs index a1e8256cf17c..bfc2f16ad500 100644 --- a/crates/storage/provider/src/providers/state/latest.rs +++ b/crates/storage/provider/src/providers/state/latest.rs @@ -12,7 +12,7 @@ use reth_primitives::{ }; use reth_storage_api::StateProofProvider; use reth_storage_errors::provider::{ProviderError, ProviderResult}; -use reth_trie::{proof::Proof, updates::TrieUpdates, AccountProof, HashedPostState}; +use reth_trie::{updates::TrieUpdates, AccountProof, HashedPostState}; use revm::db::BundleState; /// State provider over latest state that takes tx reference. @@ -92,9 +92,14 @@ impl<'b, TX: DbTx> StateRootProvider for LatestStateProviderRef<'b, TX> { } impl<'b, TX: DbTx> StateProofProvider for LatestStateProviderRef<'b, TX> { - fn proof(&self, address: Address, slots: &[B256]) -> ProviderResult { - Ok(Proof::from_tx(self.tx) - .account_proof(address, slots) + fn proof( + &self, + bundle_state: &BundleState, + address: Address, + slots: &[B256], + ) -> ProviderResult { + Ok(HashedPostState::from_bundle_state(&bundle_state.state) + .account_proof(self.tx, address, slots) .map_err(Into::::into)?) } } diff --git a/crates/storage/provider/src/providers/state/macros.rs b/crates/storage/provider/src/providers/state/macros.rs index 2b4638894e2e..344a21101f43 100644 --- a/crates/storage/provider/src/providers/state/macros.rs +++ b/crates/storage/provider/src/providers/state/macros.rs @@ -46,7 +46,7 @@ macro_rules! delegate_provider_impls { fn state_root_with_updates(&self, state: &revm::db::BundleState) -> reth_storage_errors::provider::ProviderResult<(reth_primitives::B256, reth_trie::updates::TrieUpdates)>; } StateProofProvider $(where [$($generics)*])? { - fn proof(&self, address: reth_primitives::Address, slots: &[reth_primitives::B256]) -> reth_storage_errors::provider::ProviderResult; + fn proof(&self, state: &revm::db::BundleState, address: reth_primitives::Address, slots: &[reth_primitives::B256]) -> reth_storage_errors::provider::ProviderResult; } ); } diff --git a/crates/storage/provider/src/test_utils/mock.rs b/crates/storage/provider/src/test_utils/mock.rs index 75543462d341..8a9916d09c34 100644 --- a/crates/storage/provider/src/test_utils/mock.rs +++ b/crates/storage/provider/src/test_utils/mock.rs @@ -555,7 +555,12 @@ impl StateRootProvider for MockEthProvider { } impl StateProofProvider for MockEthProvider { - fn proof(&self, address: Address, _slots: &[B256]) -> ProviderResult { + fn proof( + &self, + _state: &BundleState, + address: Address, + _slots: &[B256], + ) -> ProviderResult { Ok(AccountProof::new(address)) } } diff --git a/crates/storage/provider/src/test_utils/noop.rs b/crates/storage/provider/src/test_utils/noop.rs index fcfdb826152f..445d5666ac61 100644 --- a/crates/storage/provider/src/test_utils/noop.rs +++ b/crates/storage/provider/src/test_utils/noop.rs @@ -328,7 +328,12 @@ impl StateRootProvider for NoopProvider { } impl StateProofProvider for NoopProvider { - fn proof(&self, address: Address, _slots: &[B256]) -> ProviderResult { + fn proof( + &self, + _state: &BundleState, + address: Address, + _slots: &[B256], + ) -> ProviderResult { Ok(AccountProof::new(address)) } } diff --git a/crates/storage/storage-api/src/trie.rs b/crates/storage/storage-api/src/trie.rs index e833234c89e4..0ab25d18ad8d 100644 --- a/crates/storage/storage-api/src/trie.rs +++ b/crates/storage/storage-api/src/trie.rs @@ -26,6 +26,12 @@ pub trait StateRootProvider: Send + Sync { /// A type that can generate state proof on top of a given post state. #[auto_impl::auto_impl(&, Box, Arc)] pub trait StateProofProvider: Send + Sync { - /// Get account and storage proofs. - fn proof(&self, address: Address, slots: &[B256]) -> ProviderResult; + /// Get account and storage proofs of target keys in the `BundleState` + /// on top of the current state. + fn proof( + &self, + state: &BundleState, + address: Address, + slots: &[B256], + ) -> ProviderResult; }