The term 'flash block' is overloaded: it can mean a browser extension that suppresses Adobe Flash content, a cached-attention technique in diffusion models, a masonry flashing product, or — most relevant to blockchain engineers — a sub-second preconfirmation stream called a flashblock. This article disambiguates those meanings, then focuses on the blockchain flashblock: how it is produced, how it differs from a canonical block, and how to measure its latency reproducibly. You will get runnable curl and Python diagnostics, a results-table procedure you can fill with your own numbers, and troubleshooting guidance for common failure modes. Concrete endpoint choices are deferred to the RPC Assistant so this page stays methodology-focused.
Scope: which 'flash block' this article covers
Search interest in 'flash block' spans at least four unrelated topics: the discontinued Flashblock Firefox extension (and its successor Flash Block Plus) that replaced Adobe Flash embeds with click-to-load placeholders; FlashBlock, a 2026 arXiv technique for caching block-external attention in diffusion models; BlockFlash, a masonry flashing pan product; and flashblocks, the sub-second preconfirmation stream used by some Ethereum rollups. If you arrived looking for the browser extension, the mechanism is simple: an XBL/CSS or content-script layer hides object/embed elements and substitutes a placeholder, and clicking the placeholder restores the element. It never prevented the underlying bytes from downloading.
The rest of this article treats the blockchain meaning, because that is where engineers need reproducible measurement rather than a one-line definition. A flashblock is an early, frequently emitted view of pending execution — typically every few hundred milliseconds — that lets wallets and frontends show a near-instant confirmation before the canonical block is sealed. It is a preview, not finality.
Assumptions: you have an RPC endpoint that exposes flashblock data (often via a WebSocket subscription or a rollup-specific method), a shell with curl and jq, and Python 3.9+ if you want to run the timing harness. If your provider does not expose flashblocks, the diagnostics below will fail cleanly rather than silently mislead you.
- Browser Flashblock: presentation-layer filtering, no execution prevention.
- FlashBlock (arXiv 2602.05305): attention-output reuse across diffusion steps; orthogonal to sparse attention.
- BlockFlash: construction product; out of scope here.
- Flashblocks (rollups): early execution previews emitted between canonical blocks.
Mental model: flashblock versus canonical block
A canonical block has a fixed number, a parent hash, a state root, and a receipt root. A flashblock typically carries a monotonically increasing index, a reference to the parent canonical block, and a partial diff of state or receipts. Because it is provisional, a flashblock can be superseded: two flashblocks at the same index may describe different transaction sets if the sequencer reorders or drops transactions before sealing.
The practical consequence is that you must never treat a flashblock as final. Use it to update UI optimism (balance previews, pending nonces, 'likely included' badges) and reconcile against the canonical block once it lands. The reconciliation step is where most integration bugs appear, so build it before you build the fast path.
Latency has two components worth separating: emission cadence (how often the sequencer emits) and transport delay (how long your client takes to receive and decode). Measuring only the first hides your own infrastructure cost. The harness below measures end-to-end receipt time so both are visible.
Prerequisites and endpoint assumptions
You need an RPC URL with flashblock support and, for the WebSocket variant, a wss:// URL. Keep credentials in environment variables. The examples use RPC_URL and WS_URL placeholders deliberately — do not hardcode provider URLs into scripts you commit.
Confirm basic connectivity and chain identity first. If the standard JSON-RPC calls fail, flashblock-specific methods will fail too, and you will waste time debugging the wrong layer. For a broader refresher on endpoint structure, see the RPC endpoints guide and the multi-chain RPC endpoints guide.
export RPC_URL="https://your-endpoint.example/v1/KEY"
export WS_URL="wss://your-endpoint.example/v1/KEY"
curl -s "$RPC_URL" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' | jq .Diagnostic procedure: probe for flashblock support
Flashblock methods are rollup-specific and not part of core JSON-RPC, so the first step is a capability probe. Send the method you intend to use and inspect the error code. A -32601 (method not found) means the endpoint does not expose it; a -32602 means the method exists but your parameters are wrong — that is a good sign. Record which outcome you get before writing any timing code.
Expected verification result: eth_chainId returns the chain ID you expect, and your flashblock probe returns either data or a parameter error rather than a method-not-found error. If you get method-not-found everywhere, switch endpoints or ask your provider; the API service overview describes how managed endpoints are scoped.
curl -s "$RPC_URL" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"eth_subscribe","params":["newFlashblock"]}' | jq .
# Expected shapes:
# {"result":"0x..."} -> subscription accepted (WS-only in practice)
# {"error":{"code":-32601,...}} -> method not exposed here
# {"error":{"code":-32602,...}} -> method exists, params wrongRunnable timing harness in Python
The harness below subscribes over WebSocket, timestamps each flashblock on arrival, and prints inter-arrival deltas. It does not invent numbers; it reports whatever your endpoint produces. Run it for at least a few minutes so you capture steady-state cadence rather than a cold-start burst.
Note the time.monotonic() choice: wall-clock time can jump under NTP correction, which corrupts latency statistics. Monotonic time is the correct basis for interval measurement.
import asyncio, json, os, time
import websockets
WS_URL = os.environ["WS_URL"]
async def main():
async with websockets.connect(WS_URL) as ws:
await ws.send(json.dumps({
"jsonrpc": "2.0", "id": 1,
"method": "eth_subscribe", "params": ["newFlashblock"]
}))
sub = json.loads(await ws.recv())
print("subscribe ->", sub)
last = None
for _ in range(50):
msg = json.loads(await ws.recv())
now = time.monotonic()
delta = None if last is None else now - last
last = now
idx = msg.get("params", {}).get("result", {}).get("index")
print(f"index={idx} delta_s={delta}")
asyncio.run(main())Results table procedure
Populate the table below with your own measurements. Run the harness three times at different times of day, discard the first ten samples of each run as warm-up, and report median and p95 inter-arrival time. Do not compare across providers unless you used the same client, the same region, and the same run length — otherwise you are measuring geography, not infrastructure.
| Run | Samples (post warm-up) | Median delta (ms) | p95 delta (ms) | Method-not-found? | Notes |
|---|---|---|---|---|---|
| A | fill | fill | fill | fill | fill |
| B | fill | fill | fill | fill | fill |
| C | fill | fill | fill | fill | fill |
Expected verification result: deltas cluster around the sequencer's emission cadence with a long tail. A bimodal distribution usually means your client is buffering or the connection is reconnecting mid-run.
Reconciling flashblocks against canonical blocks
After timing, verify correctness. For each flashblock index, fetch the canonical block that eventually contains the referenced transactions and confirm the transaction hashes match. A simple approach: collect flashblock transaction hashes into a set, then poll eth_getBlockByNumber for the sealing block and diff the sets. Mismatches are expected occasionally (reordering, dropped transactions) but should be rare and explainable.
If you see systematic mismatches — every flashblock disagrees — you are probably reading a different chain or a stale subscription. Re-run the chain-ID probe. For teams running their own infrastructure, the dedicated node model removes shared-endpoint variability from this comparison.
curl -s "$RPC_URL" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":3,"method":"eth_getBlockByNumber","params":["latest",false]}' \
| jq '.result.number, (.result.transactions | length)'Troubleshooting common flashblock failures
Most failures fall into four buckets. Work through them in order; each has a distinct signature.
If none of these resolve the issue, the endpoint likely does not support flashblocks at all. That is a provider-selection problem, not a code problem — see the next section.
- Method not found (-32601): endpoint lacks flashblock support; switch endpoints or confirm scope with your provider.
- Silent stream (no messages): subscription accepted but no data — check that you are on the correct chain and that the sequencer is producing blocks.
- Duplicate or out-of-order indices: client-side buffering or reconnect replay; deduplicate by index and drop indices below your last-seen canonical block.
- High p95 with low median: network jitter or shared-endpoint contention; test from a different region before blaming the sequencer.
Limitations and tradeoffs
Flashblocks trade certainty for speed. Any UI built on them must handle supersession gracefully, and any backend that persists flashblock state must be able to roll it back. The emission cadence is a sequencer policy, not a protocol guarantee, so hardcoding assumptions about interval length will break when the operator tunes it.
There is also a measurement caveat: your observed latency includes your own network path. A provider with excellent infrastructure but a distant PoP can look worse than a mediocre provider nearby. Always report region and client version alongside numbers. For capacity planning, the RPC pricing page explains how request volume and subscription usage are metered, and the networks directory lists which chains are available.
Next steps
Once you have a stable timing baseline and a reconciliation check, the remaining work is operational: alert on p95 regression, log supersession rates, and re-run the harness after any provider or region change. If you need a concrete endpoint recommendation rather than methodology, the RPC Assistant covers that separately — start with the best Ethereum RPC API comparison for EVM chains, or the blockchain node hosting guide if you intend to run your own sequencer-adjacent infrastructure.
For teams standardizing across chains, the Arbitrum RPC endpoints and Optimism RPC provider pages cover rollup-specific endpoint behavior that affects flashblock availability.