1+ use super :: super :: context:: OpPayloadBuilderCtx ;
12use crate :: {
23 builders:: { generator:: BuildArguments , BuilderConfig , BuilderTransactions } ,
34 metrics:: OpRBuilderMetrics ,
@@ -21,10 +22,7 @@ use reth_optimism_node::{OpBuiltPayload, OpPayloadBuilderAttributes};
2122use reth_optimism_primitives:: { OpPrimitives , OpTransactionSigned } ;
2223use reth_payload_util:: { BestPayloadTransactions , NoopPayloadTransactions , PayloadTransactions } ;
2324use reth_primitives:: RecoveredBlock ;
24- use reth_provider:: {
25- ExecutionOutcome , HashedPostStateProvider , ProviderError , StateRootProvider ,
26- StorageRootProvider ,
27- } ;
25+ use reth_provider:: { ExecutionOutcome , ProviderError , StateProvider } ;
2826use reth_revm:: {
2927 database:: StateProviderDatabase , db:: states:: bundle_state:: BundleRetention , State ,
3028} ;
@@ -34,8 +32,6 @@ use std::{sync::Arc, time::Instant};
3432use tokio_util:: sync:: CancellationToken ;
3533use tracing:: { error, info, warn} ;
3634
37- use super :: super :: context:: OpPayloadBuilderCtx ;
38-
3935/// Optimism's payload builder
4036#[ derive( Debug , Clone ) ]
4137pub struct StandardOpPayloadBuilder < Pool , Client , BuilderTx , Txs = ( ) > {
@@ -233,22 +229,18 @@ where
233229 let builder = OpBuilder :: new ( best) ;
234230
235231 let state_provider = self . client . state_by_block_hash ( ctx. parent ( ) . hash ( ) ) ?;
236- let state = StateProviderDatabase :: new ( state_provider) ;
232+ let state = StateProviderDatabase :: new ( & state_provider) ;
237233 let metrics = ctx. metrics . clone ( ) ;
238-
239234 if ctx. attributes ( ) . no_tx_pool {
240- let db = State :: builder ( )
241- . with_database ( state)
242- . with_bundle_update ( )
243- . build ( ) ;
244- builder. build ( db, ctx, self . builder_tx . clone ( ) )
235+ builder. build ( state, & state_provider, ctx, self . builder_tx . clone ( ) )
245236 } else {
246237 // sequencer mode we can reuse cachedreads from previous runs
247- let db = State :: builder ( )
248- . with_database ( cached_reads. as_db_mut ( state) )
249- . with_bundle_update ( )
250- . build ( ) ;
251- builder. build ( db, ctx, self . builder_tx . clone ( ) )
238+ builder. build (
239+ cached_reads. as_db_mut ( state) ,
240+ & state_provider,
241+ ctx,
242+ self . builder_tx . clone ( ) ,
243+ )
252244 }
253245 . map ( |out| {
254246 metrics
@@ -298,30 +290,29 @@ pub struct ExecutedPayload {
298290
299291impl < Txs : PayloadTxsBounds > OpBuilder < ' _ , Txs > {
300292 /// Executes the payload and returns the outcome.
301- pub fn execute < DB , P , BuilderTx > (
293+ pub fn execute < BuilderTx > (
302294 self ,
303- state : & mut State < DB > ,
295+ state_provider : impl StateProvider ,
296+ db : & mut State < impl Database < Error = ProviderError > > ,
304297 ctx : & OpPayloadBuilderCtx ,
305298 builder_tx : BuilderTx ,
306299 ) -> Result < BuildOutcomeKind < ExecutedPayload > , PayloadBuilderError >
307300 where
308- DB : Database < Error = ProviderError > + AsRef < P > ,
309- P : StorageRootProvider ,
310301 BuilderTx : BuilderTransactions ,
311302 {
312303 let Self { best } = self ;
313304 info ! ( target: "payload_builder" , id=%ctx. payload_id( ) , parent_header = ?ctx. parent( ) . hash( ) , parent_number = ctx. parent( ) . number, "building new payload" ) ;
314305
315306 // 1. apply pre-execution changes
316307 ctx. evm_config
317- . builder_for_next_block ( state , ctx. parent ( ) , ctx. block_env_attributes . clone ( ) )
308+ . builder_for_next_block ( db , ctx. parent ( ) , ctx. block_env_attributes . clone ( ) )
318309 . map_err ( PayloadBuilderError :: other) ?
319310 . apply_pre_execution_changes ( ) ?;
320311
321312 let sequencer_tx_start_time = Instant :: now ( ) ;
322313
323314 // 3. execute sequencer transactions
324- let mut info = ctx. execute_sequencer_transactions ( state ) ?;
315+ let mut info = ctx. execute_sequencer_transactions ( db ) ?;
325316
326317 ctx. metrics
327318 . sequencer_tx_duration
@@ -330,7 +321,7 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
330321 // 4. if mem pool transactions are requested we execute them
331322
332323 // gas reserved for builder tx
333- let builder_txs = builder_tx. simulate_builder_txs ( & mut info, ctx, state ) ?;
324+ let builder_txs = builder_tx. simulate_builder_txs ( & state_provider , & mut info, ctx, db ) ?;
334325 let builder_tx_gas = builder_txs. iter ( ) . fold ( 0 , |acc, tx| acc + tx. gas_used ) ;
335326 let block_gas_limit = ctx. block_gas_limit ( ) . saturating_sub ( builder_tx_gas) ;
336327 if block_gas_limit == 0 {
@@ -358,7 +349,7 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
358349 if ctx
359350 . execute_best_transactions (
360351 & mut info,
361- state ,
352+ db ,
362353 best_txs,
363354 block_gas_limit,
364355 block_da_limit,
@@ -370,13 +361,13 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
370361 }
371362
372363 // Add builder tx to the block
373- builder_tx. add_builder_txs ( & mut info, ctx, state ) ?;
364+ builder_tx. add_builder_txs ( & state_provider , & mut info, ctx, db ) ?;
374365
375366 let state_merge_start_time = Instant :: now ( ) ;
376367
377368 // merge all transitions into bundle state, this would apply the withdrawal balance changes
378369 // and 4788 contract call
379- state . merge_transitions ( BundleRetention :: Reverts ) ;
370+ db . merge_transitions ( BundleRetention :: Reverts ) ;
380371
381372 ctx. metrics
382373 . state_transition_merge_duration
@@ -392,26 +383,32 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
392383 }
393384
394385 /// Builds the payload on top of the state.
395- pub fn build < DB , P , BuilderTx > (
386+ pub fn build < BuilderTx > (
396387 self ,
397- mut state : State < DB > ,
388+ state : impl Database < Error = ProviderError > ,
389+ state_provider : impl StateProvider ,
398390 ctx : OpPayloadBuilderCtx ,
399391 builder_tx : BuilderTx ,
400392 ) -> Result < BuildOutcomeKind < OpBuiltPayload > , PayloadBuilderError >
401393 where
402- DB : Database < Error = ProviderError > + AsRef < P > ,
403- P : StateRootProvider + HashedPostStateProvider + StorageRootProvider ,
404394 BuilderTx : BuilderTransactions ,
405395 {
406- let ExecutedPayload { info } = match self . execute ( & mut state, & ctx, builder_tx) ? {
407- BuildOutcomeKind :: Better { payload } | BuildOutcomeKind :: Freeze ( payload) => payload,
408- BuildOutcomeKind :: Cancelled => return Ok ( BuildOutcomeKind :: Cancelled ) ,
409- BuildOutcomeKind :: Aborted { fees } => return Ok ( BuildOutcomeKind :: Aborted { fees } ) ,
410- } ;
396+ let mut db = State :: builder ( )
397+ . with_database ( state)
398+ . with_bundle_update ( )
399+ . build ( ) ;
400+ let ExecutedPayload { info } =
401+ match self . execute ( & state_provider, & mut db, & ctx, builder_tx) ? {
402+ BuildOutcomeKind :: Better { payload } | BuildOutcomeKind :: Freeze ( payload) => payload,
403+ BuildOutcomeKind :: Cancelled => return Ok ( BuildOutcomeKind :: Cancelled ) ,
404+ BuildOutcomeKind :: Aborted { fees } => {
405+ return Ok ( BuildOutcomeKind :: Aborted { fees } )
406+ }
407+ } ;
411408
412409 let block_number = ctx. block_number ( ) ;
413410 let execution_outcome = ExecutionOutcome :: new (
414- state . take_bundle ( ) ,
411+ db . take_bundle ( ) ,
415412 vec ! [ info. receipts] ,
416413 block_number,
417414 Vec :: new ( ) ,
@@ -432,12 +429,9 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
432429 // calculate the state root
433430 let state_root_start_time = Instant :: now ( ) ;
434431
435- let state_provider = state. database . as_ref ( ) ;
436432 let hashed_state = state_provider. hashed_post_state ( execution_outcome. state ( ) ) ;
437433 let ( state_root, trie_output) = {
438- state
439- . database
440- . as_ref ( )
434+ state_provider
441435 . state_root_with_updates ( hashed_state. clone ( ) )
442436 . inspect_err ( |err| {
443437 warn ! ( target: "payload_builder" ,
@@ -457,7 +451,7 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
457451 // `l2tol1-message-passer`
458452 (
459453 Some (
460- isthmus:: withdrawals_root ( execution_outcome. state ( ) , state . database . as_ref ( ) )
454+ isthmus:: withdrawals_root ( execution_outcome. state ( ) , state_provider )
461455 . map_err ( PayloadBuilderError :: other) ?,
462456 ) ,
463457 Some ( EMPTY_REQUESTS_HASH ) ,
0 commit comments