From b95fdd0c8e7719e6ddd2ef8c8141cd245534fc9e Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Mon, 16 Mar 2026 14:57:32 -0400 Subject: [PATCH 01/11] txn trace flags Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/context.rs | 30 +++++++++++++++++++++++ crates/op-rbuilder/src/builder/payload.rs | 18 ++++++++++++++ crates/op-rbuilder/src/monitor_tx_pool.rs | 14 ++++++++++- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/crates/op-rbuilder/src/builder/context.rs b/crates/op-rbuilder/src/builder/context.rs index 1119b050..6a7b5135 100644 --- a/crates/op-rbuilder/src/builder/context.rs +++ b/crates/op-rbuilder/src/builder/context.rs @@ -452,6 +452,15 @@ impl OpPayloadBuilderCtx { let tx_hash = tx.tx_hash(); let tx_uncompressed_size = tx.encode_2718_len() as u64; + info!( + target: "tx_trace", + tx_hash = ?tx_hash, + block_number = self.block_number(), + flashblock_index, + stage = "builder_popped", + "[TX_TRACE]" + ); + // exclude reverting transaction if: // - the transaction comes from a bundle (is_some) and the hash **is not** in reverted hashes // Note that we need to use the Option to signal whether the transaction comes from a bundle, @@ -563,6 +572,17 @@ impl OpPayloadBuilderCtx { // reverted or not, as this is a check against maliciously searchers // sending txs that are expensive to compute but always revert. let gas_used = result.gas_used(); + info!( + target: "tx_trace", + tx_hash = ?tx_hash, + block_number = self.block_number(), + flashblock_index, + gas_used, + success = result.is_success(), + evm_duration_us = tx_simulation_start_time.elapsed().as_micros() as u64, + stage = "evm_executed", + "[TX_TRACE]" + ); if self .address_gas_limiter .consume_gas(tx.signer(), gas_used) @@ -637,6 +657,16 @@ impl OpPayloadBuilderCtx { info.executed_senders.push(tx.signer()); info.executed_transactions.push(tx.into_inner()); + info!( + target: "tx_trace", + tx_hash = ?target_hash, + block_number = self.block_number(), + flashblock_index, + cumulative_gas = info.cumulative_gas_used, + stage = "builder_committed", + "[TX_TRACE]" + ); + let can_backrun = self.backrun_ctx.args.backruns_enabled && tx_succeeded && !self.backrun_ctx.args.is_limit_reached( diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 26e8b27b..61975e17 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -498,6 +498,15 @@ where .ws_pub .publish(&fb_payload) .map_err(PayloadBuilderError::other)?; + info!( + target: "tx_trace", + block_number = ctx.block_number(), + flashblock_index = 0u64, + byte_size = flashblock_byte_size, + total_txs = info.executed_transactions.len(), + stage = "fb_published", + "[TX_TRACE]" + ); ctx.metrics .flashblock_byte_size_histogram .record(flashblock_byte_size as f64); @@ -874,6 +883,15 @@ where .ws_pub .publish(&fb_payload) .wrap_err("failed to publish flashblock via websocket")?; + info!( + target: "tx_trace", + block_number = ctx.block_number(), + flashblock_index, + byte_size = flashblock_byte_size, + total_txs = info.executed_transactions.len(), + stage = "fb_published", + "[TX_TRACE]" + ); self.built_fb_payload_tx .try_send(new_payload.clone()) .wrap_err("failed to send built payload to handler")?; diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 8500aef0..7c33a3aa 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -3,7 +3,7 @@ use alloy_primitives::B256; use futures_util::StreamExt; use moka::future::Cache; use reth_transaction_pool::{AllTransactionsEvents, FullTransactionEvent}; -use tracing::debug; +use tracing::{debug, info}; pub(crate) async fn monitor_tx_pool( mut new_transactions: AllTransactionsEvents, @@ -20,6 +20,12 @@ async fn transaction_event_log( ) { match event { FullTransactionEvent::Pending(hash) => { + info!( + target: "tx_trace", + tx_hash = %hash, + stage = "pool_pending", + "[TX_TRACE]" + ); debug!( target = "monitoring", tx_hash = hash.to_string(), @@ -28,6 +34,12 @@ async fn transaction_event_log( ) } FullTransactionEvent::Queued(hash, _) => { + info!( + target: "tx_trace", + tx_hash = %hash, + stage = "pool_queued", + "[TX_TRACE]" + ); debug!( target = "monitoring", tx_hash = hash.to_string(), From c5723970980ea9066a84396a56b56272ff945745 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Wed, 18 Mar 2026 11:29:13 -0400 Subject: [PATCH 02/11] additional txn trace flags Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/payload.rs | 42 +++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 61975e17..859d65e2 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -500,6 +500,7 @@ where .map_err(PayloadBuilderError::other)?; info!( target: "tx_trace", + payload_id = %ctx.payload_id(), block_number = ctx.block_number(), flashblock_index = 0u64, byte_size = flashblock_byte_size, @@ -885,6 +886,7 @@ where .wrap_err("failed to publish flashblock via websocket")?; info!( target: "tx_trace", + payload_id = %ctx.payload_id(), block_number = ctx.block_number(), flashblock_index, byte_size = flashblock_byte_size, @@ -1070,6 +1072,14 @@ where .state_transition_merge_gauge .set(state_transition_merge_time); + info!( + target: "tx_trace", + block_number = ctx.block_number(), + duration_us = state_transition_merge_time.as_micros() as u64, + stage = "state_merge", + "[TX_TRACE]" + ); + let block_number = ctx.block_number(); let expected = ctx.parent().number + 1; if block_number != expected { @@ -1097,6 +1107,11 @@ where let mut hashed_state = HashedPostState::default(); let mut trie_updates_to_cache: Option> = None; + let flashblock_index_for_trace = fb_state + .as_deref() + .map(|s| s.flashblock_index()) + .unwrap_or(0); + if calculate_state_root { let state_provider = state.database.as_ref(); @@ -1169,6 +1184,18 @@ where duration_ms = state_root_calculation_time.as_millis(), "State root calculation completed" ); + + info!( + target: "tx_trace", + block_number = ctx.block_number(), + flashblock_index = flashblock_index_for_trace, + duration_ms = state_root_calculation_time.as_millis() as u64, + incremental = fb_state.as_deref().and_then(|s| s.prev_trie_updates.as_ref()).is_some(), + cumulative_gas = info.cumulative_gas_used, + num_txs = info.executed_transactions.len(), + stage = "state_root_computed", + "[TX_TRACE]" + ); } let mut requests_hash = None; @@ -1273,7 +1300,9 @@ where "Executed block created" ); + let seal_start = Instant::now(); let sealed_block = Arc::new(block.seal_slow()); + let seal_duration = seal_start.elapsed(); debug!( target: "payload_builder", id = %ctx.payload_id(), @@ -1283,6 +1312,19 @@ where let block_hash = sealed_block.hash(); + info!( + target: "tx_trace", + block_number = ctx.block_number(), + flashblock_index = flashblock_index_for_trace, + block_hash = ?block_hash, + seal_duration_us = seal_duration.as_micros() as u64, + build_block_total_time_since_state_root_start_us = state_root_start_time.elapsed().as_micros() as u64, + cumulative_gas = info.cumulative_gas_used, + num_txs = info.executed_transactions.len(), + stage = "block_sealed", + "[TX_TRACE]" + ); + // pick the new transactions from the info field and update the last flashblock index let (new_transactions, new_receipts) = if let Some(fb_state) = fb_state { if let Some(updates) = trie_updates_to_cache.take() { From c1ba5783c5ac1ba4ef30372116b35b904ff04069 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Wed, 18 Mar 2026 12:03:52 -0400 Subject: [PATCH 03/11] shift the log level to trace Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/context.rs | 6 +++--- crates/op-rbuilder/src/builder/payload.rs | 12 ++++++------ crates/op-rbuilder/src/monitor_tx_pool.rs | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/crates/op-rbuilder/src/builder/context.rs b/crates/op-rbuilder/src/builder/context.rs index 6a7b5135..9962d536 100644 --- a/crates/op-rbuilder/src/builder/context.rs +++ b/crates/op-rbuilder/src/builder/context.rs @@ -452,7 +452,7 @@ impl OpPayloadBuilderCtx { let tx_hash = tx.tx_hash(); let tx_uncompressed_size = tx.encode_2718_len() as u64; - info!( + trace!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -572,7 +572,7 @@ impl OpPayloadBuilderCtx { // reverted or not, as this is a check against maliciously searchers // sending txs that are expensive to compute but always revert. let gas_used = result.gas_used(); - info!( + trace!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -657,7 +657,7 @@ impl OpPayloadBuilderCtx { info.executed_senders.push(tx.signer()); info.executed_transactions.push(tx.into_inner()); - info!( + trace!( target: "tx_trace", tx_hash = ?target_hash, block_number = self.block_number(), diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 859d65e2..74861203 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -51,7 +51,7 @@ use revm::Database; use std::{collections::BTreeMap, sync::Arc, time::Instant}; use tokio::sync::mpsc; use tokio_util::sync::CancellationToken; -use tracing::{debug, error, info, metadata::Level, span, warn}; +use tracing::{debug, error, info, trace, metadata::Level, span, warn}; /// Converts a reth OpReceipt to an op-alloy OpReceipt /// TODO: remove this once reth updates to use the op-alloy defined type as well. @@ -498,7 +498,7 @@ where .ws_pub .publish(&fb_payload) .map_err(PayloadBuilderError::other)?; - info!( + trace!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -884,7 +884,7 @@ where .ws_pub .publish(&fb_payload) .wrap_err("failed to publish flashblock via websocket")?; - info!( + trace!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -1072,7 +1072,7 @@ where .state_transition_merge_gauge .set(state_transition_merge_time); - info!( + trace!( target: "tx_trace", block_number = ctx.block_number(), duration_us = state_transition_merge_time.as_micros() as u64, @@ -1185,7 +1185,7 @@ where "State root calculation completed" ); - info!( + trace!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, @@ -1312,7 +1312,7 @@ where let block_hash = sealed_block.hash(); - info!( + trace!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 7c33a3aa..14fae686 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -3,7 +3,7 @@ use alloy_primitives::B256; use futures_util::StreamExt; use moka::future::Cache; use reth_transaction_pool::{AllTransactionsEvents, FullTransactionEvent}; -use tracing::{debug, info}; +use tracing::{debug, trace}; pub(crate) async fn monitor_tx_pool( mut new_transactions: AllTransactionsEvents, @@ -20,7 +20,7 @@ async fn transaction_event_log( ) { match event { FullTransactionEvent::Pending(hash) => { - info!( + trace!( target: "tx_trace", tx_hash = %hash, stage = "pool_pending", @@ -34,7 +34,7 @@ async fn transaction_event_log( ) } FullTransactionEvent::Queued(hash, _) => { - info!( + trace!( target: "tx_trace", tx_hash = %hash, stage = "pool_queued", From fa51ac4e257a334d3187aaef159c817c1365e505 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Wed, 18 Mar 2026 14:17:01 -0400 Subject: [PATCH 04/11] shift the log level to debug Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/context.rs | 6 +++--- crates/op-rbuilder/src/builder/payload.rs | 10 +++++----- crates/op-rbuilder/src/monitor_tx_pool.rs | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/op-rbuilder/src/builder/context.rs b/crates/op-rbuilder/src/builder/context.rs index 9962d536..9f14770a 100644 --- a/crates/op-rbuilder/src/builder/context.rs +++ b/crates/op-rbuilder/src/builder/context.rs @@ -452,7 +452,7 @@ impl OpPayloadBuilderCtx { let tx_hash = tx.tx_hash(); let tx_uncompressed_size = tx.encode_2718_len() as u64; - trace!( + debug!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -572,7 +572,7 @@ impl OpPayloadBuilderCtx { // reverted or not, as this is a check against maliciously searchers // sending txs that are expensive to compute but always revert. let gas_used = result.gas_used(); - trace!( + debug!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -657,7 +657,7 @@ impl OpPayloadBuilderCtx { info.executed_senders.push(tx.signer()); info.executed_transactions.push(tx.into_inner()); - trace!( + debug!( target: "tx_trace", tx_hash = ?target_hash, block_number = self.block_number(), diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 74861203..75f773a5 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -498,7 +498,7 @@ where .ws_pub .publish(&fb_payload) .map_err(PayloadBuilderError::other)?; - trace!( + debug!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -884,7 +884,7 @@ where .ws_pub .publish(&fb_payload) .wrap_err("failed to publish flashblock via websocket")?; - trace!( + debug!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -1072,7 +1072,7 @@ where .state_transition_merge_gauge .set(state_transition_merge_time); - trace!( + debug!( target: "tx_trace", block_number = ctx.block_number(), duration_us = state_transition_merge_time.as_micros() as u64, @@ -1185,7 +1185,7 @@ where "State root calculation completed" ); - trace!( + debug!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, @@ -1312,7 +1312,7 @@ where let block_hash = sealed_block.hash(); - trace!( + debug!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 14fae686..9e9772f2 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -20,7 +20,7 @@ async fn transaction_event_log( ) { match event { FullTransactionEvent::Pending(hash) => { - trace!( + debug!( target: "tx_trace", tx_hash = %hash, stage = "pool_pending", @@ -34,7 +34,7 @@ async fn transaction_event_log( ) } FullTransactionEvent::Queued(hash, _) => { - trace!( + debug!( target: "tx_trace", tx_hash = %hash, stage = "pool_queued", From 2b2744b0146065ef2283122aefb918832416a427 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Thu, 19 Mar 2026 11:02:55 -0400 Subject: [PATCH 05/11] remove redundant TX_TRACE Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/context.rs | 9 +++------ crates/op-rbuilder/src/builder/payload.rs | 15 +++++---------- crates/op-rbuilder/src/builder/wspub.rs | 1 + crates/op-rbuilder/src/monitor_tx_pool.rs | 6 ++---- 4 files changed, 11 insertions(+), 20 deletions(-) diff --git a/crates/op-rbuilder/src/builder/context.rs b/crates/op-rbuilder/src/builder/context.rs index 9f14770a..6073b4e1 100644 --- a/crates/op-rbuilder/src/builder/context.rs +++ b/crates/op-rbuilder/src/builder/context.rs @@ -457,8 +457,7 @@ impl OpPayloadBuilderCtx { tx_hash = ?tx_hash, block_number = self.block_number(), flashblock_index, - stage = "builder_popped", - "[TX_TRACE]" + stage = "builder_popped" ); // exclude reverting transaction if: @@ -580,8 +579,7 @@ impl OpPayloadBuilderCtx { gas_used, success = result.is_success(), evm_duration_us = tx_simulation_start_time.elapsed().as_micros() as u64, - stage = "evm_executed", - "[TX_TRACE]" + stage = "evm_executed" ); if self .address_gas_limiter @@ -663,8 +661,7 @@ impl OpPayloadBuilderCtx { block_number = self.block_number(), flashblock_index, cumulative_gas = info.cumulative_gas_used, - stage = "builder_committed", - "[TX_TRACE]" + stage = "builder_committed" ); let can_backrun = self.backrun_ctx.args.backruns_enabled diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 75f773a5..8a46cd72 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -505,8 +505,7 @@ where flashblock_index = 0u64, byte_size = flashblock_byte_size, total_txs = info.executed_transactions.len(), - stage = "fb_published", - "[TX_TRACE]" + stage = "fb_published" ); ctx.metrics .flashblock_byte_size_histogram @@ -891,8 +890,7 @@ where flashblock_index, byte_size = flashblock_byte_size, total_txs = info.executed_transactions.len(), - stage = "fb_published", - "[TX_TRACE]" + stage = "fb_published" ); self.built_fb_payload_tx .try_send(new_payload.clone()) @@ -1076,8 +1074,7 @@ where target: "tx_trace", block_number = ctx.block_number(), duration_us = state_transition_merge_time.as_micros() as u64, - stage = "state_merge", - "[TX_TRACE]" + stage = "state_merge" ); let block_number = ctx.block_number(); @@ -1193,8 +1190,7 @@ where incremental = fb_state.as_deref().and_then(|s| s.prev_trie_updates.as_ref()).is_some(), cumulative_gas = info.cumulative_gas_used, num_txs = info.executed_transactions.len(), - stage = "state_root_computed", - "[TX_TRACE]" + stage = "state_root_computed" ); } @@ -1321,8 +1317,7 @@ where build_block_total_time_since_state_root_start_us = state_root_start_time.elapsed().as_micros() as u64, cumulative_gas = info.cumulative_gas_used, num_txs = info.executed_transactions.len(), - stage = "block_sealed", - "[TX_TRACE]" + stage = "block_sealed" ); // pick the new transactions from the info field and update the last flashblock index diff --git a/crates/op-rbuilder/src/builder/wspub.rs b/crates/op-rbuilder/src/builder/wspub.rs index eb120edc..fd6374fd 100644 --- a/crates/op-rbuilder/src/builder/wspub.rs +++ b/crates/op-rbuilder/src/builder/wspub.rs @@ -80,6 +80,7 @@ impl WebSocketPublisher { message = "Sending flashblock to rollup-boost", id = %payload.payload_id, index = payload.index, + block_number = payload.metadata.block_number, base = payload.base.is_some(), ); diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 9e9772f2..65c6f930 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -23,8 +23,7 @@ async fn transaction_event_log( debug!( target: "tx_trace", tx_hash = %hash, - stage = "pool_pending", - "[TX_TRACE]" + stage = "pool_pending" ); debug!( target = "monitoring", @@ -37,8 +36,7 @@ async fn transaction_event_log( debug!( target: "tx_trace", tx_hash = %hash, - stage = "pool_queued", - "[TX_TRACE]" + stage = "pool_queued" ); debug!( target = "monitoring", From 74dbef49615ad36f3a9f30944dd47b8eaf646273 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Thu, 19 Mar 2026 19:02:10 -0400 Subject: [PATCH 06/11] fix flashblock index when no txpool Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/payload.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 8a46cd72..e3d49413 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -502,7 +502,7 @@ where target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), - flashblock_index = 0u64, + flashblock_index = fb_payload.index, byte_size = flashblock_byte_size, total_txs = info.executed_transactions.len(), stage = "fb_published" From cfff83daf07233f22e30c58849ad69ededf4693c Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Thu, 19 Mar 2026 19:10:55 -0400 Subject: [PATCH 07/11] shift monitoring logs to tx_trace Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/monitor_tx_pool.rs | 32 ++++++++--------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 65c6f930..455b125e 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -3,7 +3,7 @@ use alloy_primitives::B256; use futures_util::StreamExt; use moka::future::Cache; use reth_transaction_pool::{AllTransactionsEvents, FullTransactionEvent}; -use tracing::{debug, trace}; +use tracing::{debug}; pub(crate) async fn monitor_tx_pool( mut new_transactions: AllTransactionsEvents, @@ -23,12 +23,7 @@ async fn transaction_event_log( debug!( target: "tx_trace", tx_hash = %hash, - stage = "pool_pending" - ); - debug!( - target = "monitoring", - tx_hash = hash.to_string(), - kind = "pending", + stage = "pool_pending", "Transaction event received" ) } @@ -36,12 +31,7 @@ async fn transaction_event_log( debug!( target: "tx_trace", tx_hash = %hash, - stage = "pool_queued" - ); - debug!( - target = "monitoring", - tx_hash = hash.to_string(), - kind = "queued", + stage = "pool_queued", "Transaction event received" ) } @@ -49,9 +39,9 @@ async fn transaction_event_log( tx_hash, block_hash, } => debug!( - target = "monitoring", + target = "tx_trace", tx_hash = tx_hash.to_string(), - kind = "mined", + stage = "mined_in_block", block_hash = block_hash.to_string(), "Transaction event received" ), @@ -59,9 +49,9 @@ async fn transaction_event_log( transaction, replaced_by, } => debug!( - target = "monitoring", + target = "tx_trace", tx_hash = transaction.hash().to_string(), - kind = "replaced", + stage = "replaced", replaced_by = replaced_by.to_string(), "Transaction event received" ), @@ -71,17 +61,17 @@ async fn transaction_event_log( reverted_cache.insert(hash, ()).await; debug!( - target = "monitoring", + target = "tx_trace", tx_hash = hash.to_string(), - kind = "discarded", + stage = "discarded", "Transaction event received" ) } FullTransactionEvent::Invalid(hash) => { debug!( - target = "monitoring", + target = "tx_trace", tx_hash = hash.to_string(), - kind = "invalid", + stage = "marked_invalid", "Transaction event received" ) } From dfc77739f10684b8999116cf2cc015d27145b5aa Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Fri, 20 Mar 2026 08:42:15 -0400 Subject: [PATCH 08/11] shift monitoring logs to trace level Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/context.rs | 6 +++--- crates/op-rbuilder/src/builder/payload.rs | 10 +++++----- crates/op-rbuilder/src/monitor_tx_pool.rs | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/crates/op-rbuilder/src/builder/context.rs b/crates/op-rbuilder/src/builder/context.rs index 6073b4e1..34e9262f 100644 --- a/crates/op-rbuilder/src/builder/context.rs +++ b/crates/op-rbuilder/src/builder/context.rs @@ -452,7 +452,7 @@ impl OpPayloadBuilderCtx { let tx_hash = tx.tx_hash(); let tx_uncompressed_size = tx.encode_2718_len() as u64; - debug!( + trace!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -571,7 +571,7 @@ impl OpPayloadBuilderCtx { // reverted or not, as this is a check against maliciously searchers // sending txs that are expensive to compute but always revert. let gas_used = result.gas_used(); - debug!( + trace!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -655,7 +655,7 @@ impl OpPayloadBuilderCtx { info.executed_senders.push(tx.signer()); info.executed_transactions.push(tx.into_inner()); - debug!( + trace!( target: "tx_trace", tx_hash = ?target_hash, block_number = self.block_number(), diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index e3d49413..97c214ca 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -498,7 +498,7 @@ where .ws_pub .publish(&fb_payload) .map_err(PayloadBuilderError::other)?; - debug!( + trace!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -883,7 +883,7 @@ where .ws_pub .publish(&fb_payload) .wrap_err("failed to publish flashblock via websocket")?; - debug!( + trace!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -1070,7 +1070,7 @@ where .state_transition_merge_gauge .set(state_transition_merge_time); - debug!( + trace!( target: "tx_trace", block_number = ctx.block_number(), duration_us = state_transition_merge_time.as_micros() as u64, @@ -1182,7 +1182,7 @@ where "State root calculation completed" ); - debug!( + trace!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, @@ -1308,7 +1308,7 @@ where let block_hash = sealed_block.hash(); - debug!( + trace!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 455b125e..ae4c4bf1 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -3,7 +3,7 @@ use alloy_primitives::B256; use futures_util::StreamExt; use moka::future::Cache; use reth_transaction_pool::{AllTransactionsEvents, FullTransactionEvent}; -use tracing::{debug}; +use tracing::{trace}; pub(crate) async fn monitor_tx_pool( mut new_transactions: AllTransactionsEvents, @@ -20,7 +20,7 @@ async fn transaction_event_log( ) { match event { FullTransactionEvent::Pending(hash) => { - debug!( + trace!( target: "tx_trace", tx_hash = %hash, stage = "pool_pending", @@ -28,7 +28,7 @@ async fn transaction_event_log( ) } FullTransactionEvent::Queued(hash, _) => { - debug!( + trace!( target: "tx_trace", tx_hash = %hash, stage = "pool_queued", @@ -38,7 +38,7 @@ async fn transaction_event_log( FullTransactionEvent::Mined { tx_hash, block_hash, - } => debug!( + } => trace!( target = "tx_trace", tx_hash = tx_hash.to_string(), stage = "mined_in_block", @@ -48,7 +48,7 @@ async fn transaction_event_log( FullTransactionEvent::Replaced { transaction, replaced_by, - } => debug!( + } => trace!( target = "tx_trace", tx_hash = transaction.hash().to_string(), stage = "replaced", @@ -60,7 +60,7 @@ async fn transaction_event_log( // eth get transaction receipt method reverted_cache.insert(hash, ()).await; - debug!( + trace!( target = "tx_trace", tx_hash = hash.to_string(), stage = "discarded", @@ -68,7 +68,7 @@ async fn transaction_event_log( ) } FullTransactionEvent::Invalid(hash) => { - debug!( + trace!( target = "tx_trace", tx_hash = hash.to_string(), stage = "marked_invalid", From d17a13c67f66bb176d5fb38358d5dc32650efc59 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Mon, 23 Mar 2026 18:01:01 -0400 Subject: [PATCH 09/11] shift to debug level Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/context.rs | 6 +++--- crates/op-rbuilder/src/builder/payload.rs | 12 ++++++------ crates/op-rbuilder/src/monitor_tx_pool.rs | 14 +++++++------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/crates/op-rbuilder/src/builder/context.rs b/crates/op-rbuilder/src/builder/context.rs index 34e9262f..6073b4e1 100644 --- a/crates/op-rbuilder/src/builder/context.rs +++ b/crates/op-rbuilder/src/builder/context.rs @@ -452,7 +452,7 @@ impl OpPayloadBuilderCtx { let tx_hash = tx.tx_hash(); let tx_uncompressed_size = tx.encode_2718_len() as u64; - trace!( + debug!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -571,7 +571,7 @@ impl OpPayloadBuilderCtx { // reverted or not, as this is a check against maliciously searchers // sending txs that are expensive to compute but always revert. let gas_used = result.gas_used(); - trace!( + debug!( target: "tx_trace", tx_hash = ?tx_hash, block_number = self.block_number(), @@ -655,7 +655,7 @@ impl OpPayloadBuilderCtx { info.executed_senders.push(tx.signer()); info.executed_transactions.push(tx.into_inner()); - trace!( + debug!( target: "tx_trace", tx_hash = ?target_hash, block_number = self.block_number(), diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 97c214ca..0fe0d38e 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -51,7 +51,7 @@ use revm::Database; use std::{collections::BTreeMap, sync::Arc, time::Instant}; use tokio::sync::mpsc; use tokio_util::sync::CancellationToken; -use tracing::{debug, error, info, trace, metadata::Level, span, warn}; +use tracing::{debug, error, info, metadata::Level, span, warn}; /// Converts a reth OpReceipt to an op-alloy OpReceipt /// TODO: remove this once reth updates to use the op-alloy defined type as well. @@ -498,7 +498,7 @@ where .ws_pub .publish(&fb_payload) .map_err(PayloadBuilderError::other)?; - trace!( + debug!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -883,7 +883,7 @@ where .ws_pub .publish(&fb_payload) .wrap_err("failed to publish flashblock via websocket")?; - trace!( + debug!( target: "tx_trace", payload_id = %ctx.payload_id(), block_number = ctx.block_number(), @@ -1070,7 +1070,7 @@ where .state_transition_merge_gauge .set(state_transition_merge_time); - trace!( + debug!( target: "tx_trace", block_number = ctx.block_number(), duration_us = state_transition_merge_time.as_micros() as u64, @@ -1182,7 +1182,7 @@ where "State root calculation completed" ); - trace!( + debug!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, @@ -1308,7 +1308,7 @@ where let block_hash = sealed_block.hash(); - trace!( + debug!( target: "tx_trace", block_number = ctx.block_number(), flashblock_index = flashblock_index_for_trace, diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index ae4c4bf1..455b125e 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -3,7 +3,7 @@ use alloy_primitives::B256; use futures_util::StreamExt; use moka::future::Cache; use reth_transaction_pool::{AllTransactionsEvents, FullTransactionEvent}; -use tracing::{trace}; +use tracing::{debug}; pub(crate) async fn monitor_tx_pool( mut new_transactions: AllTransactionsEvents, @@ -20,7 +20,7 @@ async fn transaction_event_log( ) { match event { FullTransactionEvent::Pending(hash) => { - trace!( + debug!( target: "tx_trace", tx_hash = %hash, stage = "pool_pending", @@ -28,7 +28,7 @@ async fn transaction_event_log( ) } FullTransactionEvent::Queued(hash, _) => { - trace!( + debug!( target: "tx_trace", tx_hash = %hash, stage = "pool_queued", @@ -38,7 +38,7 @@ async fn transaction_event_log( FullTransactionEvent::Mined { tx_hash, block_hash, - } => trace!( + } => debug!( target = "tx_trace", tx_hash = tx_hash.to_string(), stage = "mined_in_block", @@ -48,7 +48,7 @@ async fn transaction_event_log( FullTransactionEvent::Replaced { transaction, replaced_by, - } => trace!( + } => debug!( target = "tx_trace", tx_hash = transaction.hash().to_string(), stage = "replaced", @@ -60,7 +60,7 @@ async fn transaction_event_log( // eth get transaction receipt method reverted_cache.insert(hash, ()).await; - trace!( + debug!( target = "tx_trace", tx_hash = hash.to_string(), stage = "discarded", @@ -68,7 +68,7 @@ async fn transaction_event_log( ) } FullTransactionEvent::Invalid(hash) => { - trace!( + debug!( target = "tx_trace", tx_hash = hash.to_string(), stage = "marked_invalid", From def8bb6e20d6748c60df20c7dc7d8695266a2c45 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Wed, 25 Mar 2026 15:19:19 -0400 Subject: [PATCH 10/11] env var guard rail to tx_trace logs Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/builder/context.rs | 65 ++++++++----- crates/op-rbuilder/src/builder/payload.rs | 109 +++++++++++++--------- crates/op-rbuilder/src/monitor_tx_pool.rs | 6 ++ 3 files changed, 110 insertions(+), 70 deletions(-) diff --git a/crates/op-rbuilder/src/builder/context.rs b/crates/op-rbuilder/src/builder/context.rs index 6073b4e1..fd20a591 100644 --- a/crates/op-rbuilder/src/builder/context.rs +++ b/crates/op-rbuilder/src/builder/context.rs @@ -452,13 +452,18 @@ impl OpPayloadBuilderCtx { let tx_hash = tx.tx_hash(); let tx_uncompressed_size = tx.encode_2718_len() as u64; - debug!( - target: "tx_trace", - tx_hash = ?tx_hash, - block_number = self.block_number(), - flashblock_index, - stage = "builder_popped" - ); + if std::env::var("ENABLE_TX_TRACKING_DEBUG_LOGS") + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or(false) + { + debug!( + target: "tx_trace", + tx_hash = ?tx_hash, + block_number = self.block_number(), + flashblock_index, + stage = "builder_popped" + ); + } // exclude reverting transaction if: // - the transaction comes from a bundle (is_some) and the hash **is not** in reverted hashes @@ -571,16 +576,21 @@ impl OpPayloadBuilderCtx { // reverted or not, as this is a check against maliciously searchers // sending txs that are expensive to compute but always revert. let gas_used = result.gas_used(); - debug!( - target: "tx_trace", - tx_hash = ?tx_hash, - block_number = self.block_number(), - flashblock_index, - gas_used, - success = result.is_success(), - evm_duration_us = tx_simulation_start_time.elapsed().as_micros() as u64, - stage = "evm_executed" - ); + if std::env::var("ENABLE_TX_TRACKING_DEBUG_LOGS") + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or(false) + { + debug!( + target: "tx_trace", + tx_hash = ?tx_hash, + block_number = self.block_number(), + flashblock_index, + gas_used, + success = result.is_success(), + evm_duration_us = tx_simulation_start_time.elapsed().as_micros() as u64, + stage = "evm_executed" + ); + } if self .address_gas_limiter .consume_gas(tx.signer(), gas_used) @@ -655,14 +665,19 @@ impl OpPayloadBuilderCtx { info.executed_senders.push(tx.signer()); info.executed_transactions.push(tx.into_inner()); - debug!( - target: "tx_trace", - tx_hash = ?target_hash, - block_number = self.block_number(), - flashblock_index, - cumulative_gas = info.cumulative_gas_used, - stage = "builder_committed" - ); + if std::env::var("ENABLE_TX_TRACKING_DEBUG_LOGS") + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or(false) + { + debug!( + target: "tx_trace", + tx_hash = ?target_hash, + block_number = self.block_number(), + flashblock_index, + cumulative_gas = info.cumulative_gas_used, + stage = "builder_committed" + ); + } let can_backrun = self.backrun_ctx.args.backruns_enabled && tx_succeeded diff --git a/crates/op-rbuilder/src/builder/payload.rs b/crates/op-rbuilder/src/builder/payload.rs index 0fe0d38e..e5179ae3 100644 --- a/crates/op-rbuilder/src/builder/payload.rs +++ b/crates/op-rbuilder/src/builder/payload.rs @@ -498,15 +498,20 @@ where .ws_pub .publish(&fb_payload) .map_err(PayloadBuilderError::other)?; - debug!( - target: "tx_trace", - payload_id = %ctx.payload_id(), - block_number = ctx.block_number(), - flashblock_index = fb_payload.index, - byte_size = flashblock_byte_size, - total_txs = info.executed_transactions.len(), - stage = "fb_published" - ); + if std::env::var("ENABLE_TX_TRACKING_DEBUG_LOGS") + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or(false) + { + debug!( + target: "tx_trace", + payload_id = %ctx.payload_id(), + block_number = ctx.block_number(), + flashblock_index = fb_payload.index, + byte_size = flashblock_byte_size, + total_txs = info.executed_transactions.len(), + stage = "fb_published" + ); + } ctx.metrics .flashblock_byte_size_histogram .record(flashblock_byte_size as f64); @@ -883,15 +888,20 @@ where .ws_pub .publish(&fb_payload) .wrap_err("failed to publish flashblock via websocket")?; - debug!( - target: "tx_trace", - payload_id = %ctx.payload_id(), - block_number = ctx.block_number(), - flashblock_index, - byte_size = flashblock_byte_size, - total_txs = info.executed_transactions.len(), - stage = "fb_published" - ); + if std::env::var("ENABLE_TX_TRACKING_DEBUG_LOGS") + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or(false) + { + debug!( + target: "tx_trace", + payload_id = %ctx.payload_id(), + block_number = ctx.block_number(), + flashblock_index, + byte_size = flashblock_byte_size, + total_txs = info.executed_transactions.len(), + stage = "fb_published" + ); + } self.built_fb_payload_tx .try_send(new_payload.clone()) .wrap_err("failed to send built payload to handler")?; @@ -1058,6 +1068,9 @@ where DB: Database + AsRef

, P: StateRootProvider + HashedPostStateProvider + StorageRootProvider, { + let enable_tx_trace_logs = std::env::var("ENABLE_TX_TRACKING_DEBUG_LOGS") + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or(false); // We use it to preserve state, so we run merge_transitions on transition state at most once let untouched_transition_state = state.transition_state.clone(); let state_merge_start_time = Instant::now(); @@ -1070,12 +1083,14 @@ where .state_transition_merge_gauge .set(state_transition_merge_time); - debug!( - target: "tx_trace", - block_number = ctx.block_number(), - duration_us = state_transition_merge_time.as_micros() as u64, - stage = "state_merge" - ); + if enable_tx_trace_logs { + debug!( + target: "tx_trace", + block_number = ctx.block_number(), + duration_us = state_transition_merge_time.as_micros() as u64, + stage = "state_merge" + ); + } let block_number = ctx.block_number(); let expected = ctx.parent().number + 1; @@ -1182,16 +1197,18 @@ where "State root calculation completed" ); - debug!( - target: "tx_trace", - block_number = ctx.block_number(), - flashblock_index = flashblock_index_for_trace, - duration_ms = state_root_calculation_time.as_millis() as u64, - incremental = fb_state.as_deref().and_then(|s| s.prev_trie_updates.as_ref()).is_some(), - cumulative_gas = info.cumulative_gas_used, - num_txs = info.executed_transactions.len(), - stage = "state_root_computed" - ); + if enable_tx_trace_logs { + debug!( + target: "tx_trace", + block_number = ctx.block_number(), + flashblock_index = flashblock_index_for_trace, + duration_ms = state_root_calculation_time.as_millis() as u64, + incremental = fb_state.as_deref().and_then(|s| s.prev_trie_updates.as_ref()).is_some(), + cumulative_gas = info.cumulative_gas_used, + num_txs = info.executed_transactions.len(), + stage = "state_root_computed" + ); + } } let mut requests_hash = None; @@ -1308,17 +1325,19 @@ where let block_hash = sealed_block.hash(); - debug!( - target: "tx_trace", - block_number = ctx.block_number(), - flashblock_index = flashblock_index_for_trace, - block_hash = ?block_hash, - seal_duration_us = seal_duration.as_micros() as u64, - build_block_total_time_since_state_root_start_us = state_root_start_time.elapsed().as_micros() as u64, - cumulative_gas = info.cumulative_gas_used, - num_txs = info.executed_transactions.len(), - stage = "block_sealed" - ); + if enable_tx_trace_logs { + debug!( + target: "tx_trace", + block_number = ctx.block_number(), + flashblock_index = flashblock_index_for_trace, + block_hash = ?block_hash, + seal_duration_us = seal_duration.as_micros() as u64, + build_block_total_time_since_state_root_start_us = state_root_start_time.elapsed().as_micros() as u64, + cumulative_gas = info.cumulative_gas_used, + num_txs = info.executed_transactions.len(), + stage = "block_sealed" + ); + } // pick the new transactions from the info field and update the last flashblock index let (new_transactions, new_receipts) = if let Some(fb_state) = fb_state { diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 455b125e..98cb5eec 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -18,6 +18,12 @@ async fn transaction_event_log( event: FullTransactionEvent, reverted_cache: &Cache, ) { + if !std::env::var("ENABLE_TX_TRACKING_DEBUG_LOGS") + .map(|v| v.eq_ignore_ascii_case("true")) + .unwrap_or(false) + { + return; + } match event { FullTransactionEvent::Pending(hash) => { debug!( From 6079c39f5d0f37e9237f7ff1ed37b7e7a36c3879 Mon Sep 17 00:00:00 2001 From: Yashvardhan Kukreja Date: Thu, 26 Mar 2026 12:37:19 -0400 Subject: [PATCH 11/11] nit: lint Signed-off-by: Yashvardhan Kukreja --- crates/op-rbuilder/src/monitor_tx_pool.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/op-rbuilder/src/monitor_tx_pool.rs b/crates/op-rbuilder/src/monitor_tx_pool.rs index 98cb5eec..e87a18cd 100644 --- a/crates/op-rbuilder/src/monitor_tx_pool.rs +++ b/crates/op-rbuilder/src/monitor_tx_pool.rs @@ -3,7 +3,7 @@ use alloy_primitives::B256; use futures_util::StreamExt; use moka::future::Cache; use reth_transaction_pool::{AllTransactionsEvents, FullTransactionEvent}; -use tracing::{debug}; +use tracing::debug; pub(crate) async fn monitor_tx_pool( mut new_transactions: AllTransactionsEvents,