When a zone node restarts after downtime, the L1Subscriber backfills all missed L1 blocks into the DepositQueue and the ZoneEngine processes them sequentially. During this catch-up phase, every block currently includes pool transactions, which is wrong — they're evaluated against stale state and slow down sync.
Proposal
Add a no_tx_pool: bool field to ZonePayloadAttributes (like OP Stack's noTxPool). The engine sets it based on timestamp drift, and the builder skips pool transactions when the flag is set.
Drift detection: Compare the L1 block's timestamp to wall clock time. If now - l1_block_timestamp > threshold, set no_tx_pool = true. The threshold should be configurable via CLI arg with a sensible default (e.g. ~24s / 2 L1 block times).
When no_tx_pool is true, the zone block contains only system transactions (advanceTempo + finalizeWithdrawalBatch), no pool transactions. Once the zone catches up and the L1 block timestamp is within the threshold of wall clock time, pool transactions resume.
Files to modify
payload.rs — add no_tx_pool: bool to ZonePayloadAttributes and ZonePayloadBuilderAttributes
builder.rs — guard pool tx inclusion with if !attributes.no_tx_pool()
engine.rs — compute no_tx_pool from timestamp drift in advance()
- CLI args — add
--no-tx-pool-drift-threshold flag
When a zone node restarts after downtime, the L1Subscriber backfills all missed L1 blocks into the DepositQueue and the ZoneEngine processes them sequentially. During this catch-up phase, every block currently includes pool transactions, which is wrong — they're evaluated against stale state and slow down sync.
Proposal
Add a
no_tx_pool: boolfield toZonePayloadAttributes(like OP Stack'snoTxPool). The engine sets it based on timestamp drift, and the builder skips pool transactions when the flag is set.Drift detection: Compare the L1 block's timestamp to wall clock time. If
now - l1_block_timestamp > threshold, setno_tx_pool = true. The threshold should be configurable via CLI arg with a sensible default (e.g. ~24s / 2 L1 block times).When
no_tx_poolis true, the zone block contains only system transactions (advanceTempo+finalizeWithdrawalBatch), no pool transactions. Once the zone catches up and the L1 block timestamp is within the threshold of wall clock time, pool transactions resume.Files to modify
payload.rs— addno_tx_pool: booltoZonePayloadAttributesandZonePayloadBuilderAttributesbuilder.rs— guard pool tx inclusion withif !attributes.no_tx_pool()engine.rs— computeno_tx_poolfrom timestamp drift inadvance()--no-tx-pool-drift-thresholdflag