11//! Loads a pending block from database. Helper trait for `eth_` call and trace RPC methods.
22
3- use super :: { Call , LoadBlock , LoadPendingBlock , LoadState , LoadTransaction } ;
3+ use super :: { Call , LoadBlock , LoadState , LoadTransaction } ;
44use crate :: FromEvmError ;
55use alloy_consensus:: { transaction:: TxHashRef , BlockHeader } ;
66use alloy_primitives:: B256 ;
@@ -14,17 +14,14 @@ use reth_evm::{
1414} ;
1515use reth_primitives_traits:: { BlockBody , Recovered , RecoveredBlock } ;
1616use reth_revm:: { database:: StateProviderDatabase , db:: State } ;
17- use reth_rpc_eth_types:: {
18- cache:: db:: { StateCacheDb , StateCacheDbRefMutWrapper , StateProviderTraitObjWrapper } ,
19- EthApiError ,
20- } ;
17+ use reth_rpc_eth_types:: { cache:: db:: StateCacheDb , EthApiError } ;
2118use reth_storage_api:: { ProviderBlock , ProviderTx } ;
2219use revm:: { context:: Block , context_interface:: result:: ResultAndState , DatabaseCommit } ;
2320use revm_inspectors:: tracing:: { TracingInspector , TracingInspectorConfig } ;
2421use std:: sync:: Arc ;
2522
2623/// Executes CPU heavy tasks.
27- pub trait Trace : LoadState < Error : FromEvmError < Self :: Evm > > {
24+ pub trait Trace : LoadState < Error : FromEvmError < Self :: Evm > > + Call {
2825 /// Executes the [`TxEnvFor`] with [`reth_evm::EvmEnv`] against the given [Database] without
2926 /// committing state changes.
3027 fn inspect < DB , I > (
@@ -58,7 +55,6 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
5855 f : F ,
5956 ) -> impl Future < Output = Result < R , Self :: Error > > + Send
6057 where
61- Self : Call ,
6258 R : Send + ' static ,
6359 F : FnOnce (
6460 TracingInspector ,
@@ -91,19 +87,16 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
9187 f : F ,
9288 ) -> impl Future < Output = Result < R , Self :: Error > > + Send
9389 where
94- Self : LoadPendingBlock + Call ,
9590 F : FnOnce (
9691 TracingInspector ,
9792 ResultAndState < HaltReasonFor < Self :: Evm > > ,
98- StateCacheDb < ' _ > ,
93+ StateCacheDb ,
9994 ) -> Result < R , Self :: Error >
10095 + Send
10196 + ' static ,
10297 R : Send + ' static ,
10398 {
104- let this = self . clone ( ) ;
105- self . spawn_with_state_at_block ( at, move |state| {
106- let mut db = State :: builder ( ) . with_database ( StateProviderDatabase :: new ( state) ) . build ( ) ;
99+ self . spawn_with_state_at_block ( at, move |this, mut db| {
107100 let mut inspector = TracingInspector :: new ( config) ;
108101 let res = this. inspect ( & mut db, evm_env, tx_env, & mut inspector) ?;
109102 f ( inspector, res, db)
@@ -126,12 +119,12 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
126119 f : F ,
127120 ) -> impl Future < Output = Result < Option < R > , Self :: Error > > + Send
128121 where
129- Self : LoadPendingBlock + LoadTransaction + Call ,
122+ Self : LoadTransaction ,
130123 F : FnOnce (
131124 TransactionInfo ,
132125 TracingInspector ,
133126 ResultAndState < HaltReasonFor < Self :: Evm > > ,
134- StateCacheDb < ' _ > ,
127+ StateCacheDb ,
135128 ) -> Result < R , Self :: Error >
136129 + Send
137130 + ' static ,
@@ -156,17 +149,16 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
156149 f : F ,
157150 ) -> impl Future < Output = Result < Option < R > , Self :: Error > > + Send
158151 where
159- Self : LoadPendingBlock + LoadTransaction + Call ,
152+ Self : LoadTransaction ,
160153 F : FnOnce (
161154 TransactionInfo ,
162155 Insp ,
163156 ResultAndState < HaltReasonFor < Self :: Evm > > ,
164- StateCacheDb < ' _ > ,
157+ StateCacheDb ,
165158 ) -> Result < R , Self :: Error >
166159 + Send
167160 + ' static ,
168- Insp :
169- for < ' a , ' b > InspectorFor < Self :: Evm , StateCacheDbRefMutWrapper < ' a , ' b > > + Send + ' static ,
161+ Insp : for < ' a > InspectorFor < Self :: Evm , & ' a mut StateCacheDb > + Send + ' static ,
170162 R : Send + ' static ,
171163 {
172164 async move {
@@ -182,10 +174,7 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
182174 // block the transaction is included in
183175 let parent_block = block. parent_hash ( ) ;
184176
185- let this = self . clone ( ) ;
186- self . spawn_with_state_at_block ( parent_block. into ( ) , move |state| {
187- let mut db =
188- State :: builder ( ) . with_database ( StateProviderDatabase :: new ( state) ) . build ( ) ;
177+ self . spawn_with_state_at_block ( parent_block, move |this, mut db| {
189178 let block_txs = block. transactions_recovered ( ) ;
190179
191180 this. apply_pre_execution_changes ( & block, & mut db, & evm_env) ?;
@@ -194,12 +183,7 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
194183 this. replay_transactions_until ( & mut db, evm_env. clone ( ) , block_txs, * tx. tx_hash ( ) ) ?;
195184
196185 let tx_env = this. evm_config ( ) . tx_env ( tx) ;
197- let res = this. inspect (
198- StateCacheDbRefMutWrapper ( & mut db) ,
199- evm_env,
200- tx_env,
201- & mut inspector,
202- ) ?;
186+ let res = this. inspect ( & mut db, evm_env, tx_env, & mut inspector) ?;
203187 f ( tx_info, inspector, res, db)
204188 } )
205189 . await
@@ -228,7 +212,7 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
228212 TracingCtx <
229213 ' _ ,
230214 Recovered < & ProviderTx < Self :: Provider > > ,
231- EvmFor < Self :: Evm , StateCacheDbRefMutWrapper < ' _ , ' _ > , TracingInspector > ,
215+ EvmFor < Self :: Evm , & mut StateCacheDb , TracingInspector > ,
232216 > ,
233217 ) -> Result < R , Self :: Error >
234218 + Send
@@ -269,13 +253,13 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
269253 TracingCtx <
270254 ' _ ,
271255 Recovered < & ProviderTx < Self :: Provider > > ,
272- EvmFor < Self :: Evm , StateCacheDbRefMutWrapper < ' _ , ' _ > , Insp > ,
256+ EvmFor < Self :: Evm , & mut StateCacheDb , Insp > ,
273257 > ,
274258 ) -> Result < R , Self :: Error >
275259 + Send
276260 + ' static ,
277261 Setup : FnMut ( ) -> Insp + Send + ' static ,
278- Insp : Clone + for < ' a , ' b > InspectorFor < Self :: Evm , StateCacheDbRefMutWrapper < ' a , ' b > > ,
262+ Insp : Clone + for < ' a > InspectorFor < Self :: Evm , & ' a mut StateCacheDb > ,
279263 R : Send + ' static ,
280264 {
281265 async move {
@@ -296,21 +280,14 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
296280 }
297281
298282 // replay all transactions of the block
299- self . spawn_blocking_io_fut ( move |this| async move {
300- // we need to get the state of the parent block because we're replaying this block
301- // on top of its parent block's state
302- let state_at = block. parent_hash ( ) ;
283+ // we need to get the state of the parent block because we're replaying this block
284+ // on top of its parent block's state
285+ self . spawn_with_state_at_block ( block. parent_hash ( ) , move |this, mut db| {
303286 let block_hash = block. hash ( ) ;
304287
305288 let block_number = evm_env. block_env . number ( ) . saturating_to ( ) ;
306289 let base_fee = evm_env. block_env . basefee ( ) ;
307290
308- // now get the state
309- let state = this. state_at_block_id ( state_at. into ( ) ) . await ?;
310- let mut db = State :: builder ( )
311- . with_database ( StateProviderDatabase :: new ( StateProviderTraitObjWrapper ( & state) ) )
312- . build ( ) ;
313-
314291 this. apply_pre_execution_changes ( & block, & mut db, & evm_env) ?;
315292
316293 // prepare transactions, we do everything upfront to reduce time spent with open
@@ -328,7 +305,7 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
328305 let results = this
329306 . evm_config ( )
330307 . evm_factory ( )
331- . create_tracer ( StateCacheDbRefMutWrapper ( & mut db) , evm_env, inspector_setup ( ) )
308+ . create_tracer ( & mut db, evm_env, inspector_setup ( ) )
332309 . try_trace_many ( block. transactions_recovered ( ) . take ( max_transactions) , |ctx| {
333310 let tx_info = TransactionInfo {
334311 hash : Some ( * ctx. tx . tx_hash ( ) ) ,
@@ -375,7 +352,7 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
375352 TracingCtx <
376353 ' _ ,
377354 Recovered < & ProviderTx < Self :: Provider > > ,
378- EvmFor < Self :: Evm , StateCacheDbRefMutWrapper < ' _ , ' _ > , TracingInspector > ,
355+ EvmFor < Self :: Evm , & mut StateCacheDb , TracingInspector > ,
379356 > ,
380357 ) -> Result < R , Self :: Error >
381358 + Send
@@ -415,13 +392,13 @@ pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> {
415392 TracingCtx <
416393 ' _ ,
417394 Recovered < & ProviderTx < Self :: Provider > > ,
418- EvmFor < Self :: Evm , StateCacheDbRefMutWrapper < ' _ , ' _ > , Insp > ,
395+ EvmFor < Self :: Evm , & mut StateCacheDb , Insp > ,
419396 > ,
420397 ) -> Result < R , Self :: Error >
421398 + Send
422399 + ' static ,
423400 Setup : FnMut ( ) -> Insp + Send + ' static ,
424- Insp : Clone + for < ' a , ' b > InspectorFor < Self :: Evm , StateCacheDbRefMutWrapper < ' a , ' b > > ,
401+ Insp : Clone + for < ' a > InspectorFor < Self :: Evm , & ' a mut StateCacheDb > ,
425402 R : Send + ' static ,
426403 {
427404 self . trace_block_until_with_inspector ( block_id, block, None , insp_setup, f)
0 commit comments