diff --git a/crates/op-rbuilder/src/args/op.rs b/crates/op-rbuilder/src/args/op.rs index 784aeb7c7..afd0443bd 100644 --- a/crates/op-rbuilder/src/args/op.rs +++ b/crates/op-rbuilder/src/args/op.rs @@ -137,6 +137,14 @@ pub struct FlashblocksArgs { env = "FLASHBLOCK_LEEWAY_TIME" )] pub flashblocks_leeway_time: u64, + + /// Should we calculate state root for each flashblock + #[arg( + long = "flashblocks.calculate-state-root", + default_value = "true", + env = "FLASHBLOCKS_CALCULATE_STATE_ROOT" + )] + pub calculate_state_root: bool, } impl Default for FlashblocksArgs { diff --git a/crates/op-rbuilder/src/builders/flashblocks/config.rs b/crates/op-rbuilder/src/builders/flashblocks/config.rs index 0229a2b32..6d6174231 100644 --- a/crates/op-rbuilder/src/builders/flashblocks/config.rs +++ b/crates/op-rbuilder/src/builders/flashblocks/config.rs @@ -22,6 +22,9 @@ pub struct FlashblocksConfig { /// Enables dynamic flashblocks number based on FCU arrival time pub dynamic_adjustment: bool, + + /// Should we calculate state root for each flashblock + pub calculate_state_root: bool, } impl Default for FlashblocksConfig { @@ -31,6 +34,7 @@ impl Default for FlashblocksConfig { interval: Duration::from_millis(250), leeway_time: Duration::from_millis(50), dynamic_adjustment: false, + calculate_state_root: true, } } } @@ -55,6 +59,7 @@ impl TryFrom for FlashblocksConfig { interval, leeway_time, dynamic_adjustment, + calculate_state_root: args.flashblocks.calculate_state_root, }) } } diff --git a/crates/op-rbuilder/src/builders/flashblocks/payload.rs b/crates/op-rbuilder/src/builders/flashblocks/payload.rs index 56c1cb184..a358f27a3 100644 --- a/crates/op-rbuilder/src/builders/flashblocks/payload.rs +++ b/crates/op-rbuilder/src/builders/flashblocks/payload.rs @@ -255,7 +255,12 @@ where .sequencer_tx_duration .record(sequencer_tx_start_time.elapsed()); - let (payload, fb_payload, mut bundle_state) = build_block(db, &ctx, &mut info)?; + let (payload, fb_payload, mut bundle_state) = build_block( + db, + &ctx, + &mut info, + self.config.specific.calculate_state_root, + )?; best_payload.set(payload.clone()); self.ws_pub @@ -496,7 +501,12 @@ where }); let total_block_built_duration = Instant::now(); - let build_result = build_block(db, &ctx, &mut info); + let build_result = build_block( + db, + &ctx, + &mut info, + self.config.specific.calculate_state_root, + ); ctx.metrics .total_block_built_duration .record(total_block_built_duration.elapsed()); @@ -645,6 +655,7 @@ fn build_block( mut state: State, ctx: &OpPayloadBuilderCtx, info: &mut ExecutionInfo, + calculate_state_root: bool, ) -> Result<(OpBuiltPayload, FlashblocksPayloadV1, BundleState), PayloadBuilderError> where DB: Database + AsRef

, @@ -684,23 +695,29 @@ where .block_logs_bloom(block_number) .expect("Number is in range"); - // // calculate the state root + // calculate the state root + let mut state_root = B256::ZERO; + let state_root_start_time = Instant::now(); - let state_provider = state.database.as_ref(); - let hashed_state = state_provider.hashed_post_state(execution_outcome.state()); - let (state_root, _trie_output) = { - state - .database - .as_ref() - .state_root_with_updates(hashed_state.clone()) - .inspect_err(|err| { - warn!(target: "payload_builder", - parent_header=%ctx.parent().hash(), - %err, - "failed to calculate state root for payload" - ); - })? - }; + if calculate_state_root { + let state_provider = state.database.as_ref(); + let hashed_state = state_provider.hashed_post_state(execution_outcome.state()); + let (_state_root, _trie_output) = { + state + .database + .as_ref() + .state_root_with_updates(hashed_state.clone()) + .inspect_err(|err| { + warn!( + target: "payload_builder", + parent_header=%ctx.parent().hash(), + %err, + "failed to calculate state root for payload" + ); + })? + }; + state_root = _state_root; + } ctx.metrics .state_root_calculation_duration .record(state_root_start_time.elapsed()); diff --git a/crates/op-rbuilder/src/tests/flashblocks.rs b/crates/op-rbuilder/src/tests/flashblocks.rs index 44d8df21b..797702cb8 100644 --- a/crates/op-rbuilder/src/tests/flashblocks.rs +++ b/crates/op-rbuilder/src/tests/flashblocks.rs @@ -21,6 +21,7 @@ use crate::{ flashblocks_block_time: 200, flashblocks_leeway_time: 0, flashblocks_dynamic: false, + calculate_state_root: true, }, ..Default::default() })] diff --git a/crates/op-rbuilder/src/tests/framework/macros/src/lib.rs b/crates/op-rbuilder/src/tests/framework/macros/src/lib.rs index 64cb940ab..697380903 100644 --- a/crates/op-rbuilder/src/tests/framework/macros/src/lib.rs +++ b/crates/op-rbuilder/src/tests/framework/macros/src/lib.rs @@ -29,6 +29,7 @@ const BUILDER_VARIANTS: &[VariantInfo] = &[ let mut args = #args; args.flashblocks.enabled = true; args.flashblocks.flashblocks_port = 0; + args.flashblocks.calculate_state_root = true; args } } @@ -39,6 +40,7 @@ const BUILDER_VARIANTS: &[VariantInfo] = &[ let mut args = crate::args::OpRbuilderArgs::default(); args.flashblocks.enabled = true; args.flashblocks.flashblocks_port = 0; + args.flashblocks.calculate_state_root = true; args } }