1
+ use super :: super :: context:: OpPayloadBuilderCtx ;
1
2
use crate :: {
2
3
builders:: { generator:: BuildArguments , BuilderConfig , BuilderTransactions } ,
3
4
metrics:: OpRBuilderMetrics ,
@@ -21,10 +22,7 @@ use reth_optimism_node::{OpBuiltPayload, OpPayloadBuilderAttributes};
21
22
use reth_optimism_primitives:: { OpPrimitives , OpTransactionSigned } ;
22
23
use reth_payload_util:: { BestPayloadTransactions , NoopPayloadTransactions , PayloadTransactions } ;
23
24
use reth_primitives:: RecoveredBlock ;
24
- use reth_provider:: {
25
- ExecutionOutcome , HashedPostStateProvider , ProviderError , StateRootProvider ,
26
- StorageRootProvider ,
27
- } ;
25
+ use reth_provider:: { ExecutionOutcome , ProviderError , StateProvider } ;
28
26
use reth_revm:: {
29
27
database:: StateProviderDatabase , db:: states:: bundle_state:: BundleRetention , State ,
30
28
} ;
@@ -34,8 +32,6 @@ use std::{sync::Arc, time::Instant};
34
32
use tokio_util:: sync:: CancellationToken ;
35
33
use tracing:: { error, info, warn} ;
36
34
37
- use super :: super :: context:: OpPayloadBuilderCtx ;
38
-
39
35
/// Optimism's payload builder
40
36
#[ derive( Debug , Clone ) ]
41
37
pub struct StandardOpPayloadBuilder < Pool , Client , BuilderTx , Txs = ( ) > {
@@ -233,22 +229,18 @@ where
233
229
let builder = OpBuilder :: new ( best) ;
234
230
235
231
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) ;
237
233
let metrics = ctx. metrics . clone ( ) ;
238
-
239
234
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 ( ) )
245
236
} else {
246
237
// 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
+ )
252
244
}
253
245
. map ( |out| {
254
246
metrics
@@ -298,30 +290,29 @@ pub struct ExecutedPayload {
298
290
299
291
impl < Txs : PayloadTxsBounds > OpBuilder < ' _ , Txs > {
300
292
/// Executes the payload and returns the outcome.
301
- pub fn execute < DB , P , BuilderTx > (
293
+ pub fn execute < BuilderTx > (
302
294
self ,
303
- state : & mut State < DB > ,
295
+ state_provider : impl StateProvider ,
296
+ db : & mut State < impl Database < Error = ProviderError > > ,
304
297
ctx : & OpPayloadBuilderCtx ,
305
298
builder_tx : BuilderTx ,
306
299
) -> Result < BuildOutcomeKind < ExecutedPayload > , PayloadBuilderError >
307
300
where
308
- DB : Database < Error = ProviderError > + AsRef < P > ,
309
- P : StorageRootProvider ,
310
301
BuilderTx : BuilderTransactions ,
311
302
{
312
303
let Self { best } = self ;
313
304
info ! ( target: "payload_builder" , id=%ctx. payload_id( ) , parent_header = ?ctx. parent( ) . hash( ) , parent_number = ctx. parent( ) . number, "building new payload" ) ;
314
305
315
306
// 1. apply pre-execution changes
316
307
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 ( ) )
318
309
. map_err ( PayloadBuilderError :: other) ?
319
310
. apply_pre_execution_changes ( ) ?;
320
311
321
312
let sequencer_tx_start_time = Instant :: now ( ) ;
322
313
323
314
// 3. execute sequencer transactions
324
- let mut info = ctx. execute_sequencer_transactions ( state ) ?;
315
+ let mut info = ctx. execute_sequencer_transactions ( db ) ?;
325
316
326
317
ctx. metrics
327
318
. sequencer_tx_duration
@@ -330,7 +321,7 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
330
321
// 4. if mem pool transactions are requested we execute them
331
322
332
323
// 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 ) ?;
334
325
let builder_tx_gas = builder_txs. iter ( ) . fold ( 0 , |acc, tx| acc + tx. gas_used ) ;
335
326
let block_gas_limit = ctx. block_gas_limit ( ) . saturating_sub ( builder_tx_gas) ;
336
327
if block_gas_limit == 0 {
@@ -358,7 +349,7 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
358
349
if ctx
359
350
. execute_best_transactions (
360
351
& mut info,
361
- state ,
352
+ db ,
362
353
best_txs,
363
354
block_gas_limit,
364
355
block_da_limit,
@@ -370,13 +361,13 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
370
361
}
371
362
372
363
// 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 ) ?;
374
365
375
366
let state_merge_start_time = Instant :: now ( ) ;
376
367
377
368
// merge all transitions into bundle state, this would apply the withdrawal balance changes
378
369
// and 4788 contract call
379
- state . merge_transitions ( BundleRetention :: Reverts ) ;
370
+ db . merge_transitions ( BundleRetention :: Reverts ) ;
380
371
381
372
ctx. metrics
382
373
. state_transition_merge_duration
@@ -392,26 +383,32 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
392
383
}
393
384
394
385
/// Builds the payload on top of the state.
395
- pub fn build < DB , P , BuilderTx > (
386
+ pub fn build < BuilderTx > (
396
387
self ,
397
- mut state : State < DB > ,
388
+ state : impl Database < Error = ProviderError > ,
389
+ state_provider : impl StateProvider ,
398
390
ctx : OpPayloadBuilderCtx ,
399
391
builder_tx : BuilderTx ,
400
392
) -> Result < BuildOutcomeKind < OpBuiltPayload > , PayloadBuilderError >
401
393
where
402
- DB : Database < Error = ProviderError > + AsRef < P > ,
403
- P : StateRootProvider + HashedPostStateProvider + StorageRootProvider ,
404
394
BuilderTx : BuilderTransactions ,
405
395
{
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
+ } ;
411
408
412
409
let block_number = ctx. block_number ( ) ;
413
410
let execution_outcome = ExecutionOutcome :: new (
414
- state . take_bundle ( ) ,
411
+ db . take_bundle ( ) ,
415
412
vec ! [ info. receipts] ,
416
413
block_number,
417
414
Vec :: new ( ) ,
@@ -432,12 +429,9 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
432
429
// calculate the state root
433
430
let state_root_start_time = Instant :: now ( ) ;
434
431
435
- let state_provider = state. database . as_ref ( ) ;
436
432
let hashed_state = state_provider. hashed_post_state ( execution_outcome. state ( ) ) ;
437
433
let ( state_root, trie_output) = {
438
- state
439
- . database
440
- . as_ref ( )
434
+ state_provider
441
435
. state_root_with_updates ( hashed_state. clone ( ) )
442
436
. inspect_err ( |err| {
443
437
warn ! ( target: "payload_builder" ,
@@ -457,7 +451,7 @@ impl<Txs: PayloadTxsBounds> OpBuilder<'_, Txs> {
457
451
// `l2tol1-message-passer`
458
452
(
459
453
Some (
460
- isthmus:: withdrawals_root ( execution_outcome. state ( ) , state . database . as_ref ( ) )
454
+ isthmus:: withdrawals_root ( execution_outcome. state ( ) , state_provider )
461
455
. map_err ( PayloadBuilderError :: other) ?,
462
456
) ,
463
457
Some ( EMPTY_REQUESTS_HASH ) ,
0 commit comments