pending block tag.
Subblocks were previously called Flashblocks. Subblocks replaced Flashblocks on Optimism Mainnet on August 31, 2026, which shortened the interval from 250 ms to 200 ms and kept the JSON-RPC interface the same.
How Subblocks work on Optimism
Subblocks on Optimism have two parts:- Sequencer side — the Optimism sequencer’s execution client produces a subblock as it builds each block and publishes the subblocks over a WebSocket stream.
- Node side — the Reth-based execution client running on Chainstack follows the stream, executes the transactions in each subblock, and serves the result under the
pendingblock tag.
- The Optimism sequencer creates regular 2-second blocks and, while building each block, publishes a subblock about every 200 ms.
- Each subblock appends transactions to the block in progress. The transaction list only grows until the block is sealed.
- Apps retrieve the preconfirmed state over the standard Optimism RPC endpoints and methods:
eth_getBlockByNumberwith thependingtageth_callwith thependingtageth_getBalancewith thependingtageth_getTransactionCountwith thependingtageth_getCodewith thependingtageth_getStorageAtwith thependingtageth_estimateGaswith thependingtageth_getTransactionReceipt— returns the preconfirmed receipt as soon as the transaction is included in a subblocketh_getTransactionByHash— returns the preconfirmed transaction as soon as it is included in a subblocketh_sendRawTransactionSync— submit a signed transaction and receive the preconfirmed receipt in the same response
Unlike Base, Optimism does not expose preconfirmations as dedicated WebSocket subscriptions like
eth_subscribe newFlashblocks. The customer-facing interface on Optimism is the standard JSON-RPC interface with the pending block tag, as defined in the Optimism Subblocks specification.Compare preconfirmed subblocks with the sealed block
Call eth_getBlockByNumber with thepending tag on an Optimism endpoint while a 2-second canonical block is forming. The response changes with each subblock: the block number stays the same, the transaction list grows, and the block hash changes.
The same canonical block number sampled about 500 ms apart while the block was being built on Chainstack, and then after it was sealed:
- Preconfirmed subblock (early)
- Preconfirmed subblock (later)
- Sealed 2-second block
pending response, stateRoot is all zeros, because the state root is exact only once the block is sealed. The pending hash is not the hash of the sealed block either. Read the final hash and stateRoot from the block after it is sealed, and track transactions by their own hash.
Verify Subblocks on your endpoint
You can verify Subblocks on your Optimism endpoint by pollingeth_getBlockByNumber with the pending tag and watching the response change within a single block number. Replace YOUR_OPTIMISM_ENDPOINT with your Chainstack Optimism node HTTPS endpoint:
Performance expectations
Subblocks on Optimism are produced about every 200 ms, so apending read reflects a transaction long before the 2-second block that includes it is sealed. A latest read reflects the transaction only after the block is sealed.
The actual preconfirmation time depends on:
- Network latency to and from the Optimism node.
- Transaction processing time at the sequencer.
- Time until the next subblock (up to about 200 ms).
- Gas available in the next subblock. The sequencer divides a block’s gas capacity across the block-building window, so a transaction with a large gas limit can wait for a later subblock or the next block.
- Network travel time for the confirmation response.
Optimism Subblocks vs. Base Flashblocks at a glance
Additional resources
- Flashblocks on Base — the Base implementation, including dedicated WebSocket subscription methods
- Optimism documentation: Subblocks overview
- Optimism documentation: Integrate Subblocks in your app
- Optimism documentation: Subblocks notice — the move from 250 ms to 200 ms and the zeroed stream fields
- Optimism specification: Subblocks
