- Sequencer side — the Rollup-Boost sidecar and the
op-rbuilderReth-based builder run next to the OP Stack sequencer. - Node side — the Flashblocks module is implemented on the Reth-based execution client running on Chainstack.
- The Optimism sequencer creates regular 2-second blocks and additionally creates sub-blocks called Flashblocks every 250ms.
- The sequencer streams these Flashblocks every 250ms over WebSocket to the Reth nodes that have the Flashblocks module enabled.
-
The sequencer-streamed Flashblocks and the preconfirmation state can then be retrieved by apps over the standard Optimism RPC endpoints and methods with the
pendingblock tag:eth_getBlockByNumberwith thependingtageth_callwith thependingtageth_getBalancewith thependingtageth_getTransactionCountwith thependingtageth_getCodewith thependingtag — per the Optimism Flashblocks specificationeth_getStorageAtwith thependingtag — per the Optimism Flashblocks specificationeth_estimateGaswith thependingtageth_getTransactionReceipt— returns the preconfirmed receipt as soon as the transaction is included in a Flashblocketh_getTransactionByHash— returns the preconfirmed transaction as soon as it is included in a Flashblocketh_sendRawTransactionSync— submit a signed transaction and receive the preconfirmed receipt in the same response
- The transaction ordering is done at the Flashblock level instead of the block level.
Unlike Base, Optimism does not expose Flashblocks as dedicated WebSocket subscriptions like
eth_subscribe newFlashblocks. The customer-facing Flashblocks interface on Optimism is the standard JSON-RPC interface with the pending block tag, as defined in the Optimism Flashblocks specification.Quick Flashblock vs. full block data comparison
Call eth_getBlockByNumber with thepending tag on a Flashblocks-enabled Optimism endpoint while a 2-second canonical block is forming. The response evolves every 250ms as new Flashblocks arrive — the same block number, but the transaction list grows append-only and the block hash changes with each Flashblock.
A quick view of the same canonical block number sampled 500ms apart while the block was being assembled on Chainstack:
- Preconfirmed 250ms Flashblock (early)
- Preconfirmed 250ms Flashblock (later)
- Confirmed regular 2s block
Verify Flashblocks behavior
You can verify Flashblocks behavior on your Optimism endpoint by pollingeth_getBlockByNumber with the pending tag and watching the response evolve within a single block number. Replace YOUR_OPTIMISM_ENDPOINT with your Chainstack Optimism node HTTPS endpoint:
Performance expectations
Flashblocks on Optimism are produced at 250ms intervals, but actual end-to-end latency will be higher due to network travel time:- Standard Optimism endpoint — ~2000ms (2-second block time).
- Flashblocks-enabled Optimism endpoint — ~350-550ms (250ms Flashblock interval + network travel time).
- Network latency to and from the Optimism node.
- Transaction processing time at the sequencer.
- Time until the next Flashblock (up to 250ms).
- Network travel time for the confirmation response.
Optimism vs. Base Flashblocks at a glance
| Aspect | Optimism | Base |
|---|---|---|
| Flashblock interval | 250ms | 200ms |
| Canonical block time | 2s | 2s |
| Flashblocks per block | ~8 | ~10 |
| Customer-facing interface | JSON-RPC with pending tag | JSON-RPC with pending tag and dedicated WebSocket subscriptions |
eth_subscribe newFlashblocks etc. | Not exposed | Exposed |
Additional resources
- Flashblocks on Base — the Base implementation, including dedicated WebSocket subscription methods
- Optimism documentation: Flashblocks overview
- Optimism specification: Flashblocks JSON-RPC APIs
- Flashbots blog: Introducing Rollup-Boost
- Original spec for Rollup-Boost: External Block Production
