Skip to content

fix(opstack): subscribe to V4 blocks gossip topic (Base mainnet post-Isthmus)#2

Closed
amunt0 wants to merge 5 commits into
masterfrom
fix/opstack-v4-blocks-topic
Closed

fix(opstack): subscribe to V4 blocks gossip topic (Base mainnet post-Isthmus)#2
amunt0 wants to merge 5 commits into
masterfrom
fix/opstack-v4-blocks-topic

Conversation

@amunt0

@amunt0 amunt0 commented Jun 3, 2026

Copy link
Copy Markdown

Problem

The opstack consensus server is deaf on Base mainnet: it peers fine but never receives a block and never serves a head at /latest.

Root cause (sourced, no guesswork): OP-stack gossips each new block on a versioned topic, and the sequencer publishes to exactly one version — selected by hardfork (op-node p2p/gossip.go):

if p.cfg.IsIsthmus(timestamp) {
    return p.blocksV4.topic.Publish(ctx, out)   // V4 ONLY — no dual-publish
} else if p.cfg.IsEcotone(timestamp) {
    return p.blocksV3.topic.Publish(ctx, out)
} ...
topic payload status on Base mainnet
/optimism/8453/2/blocks (V3) Ecotone-era dead since 2025-05-09 — what helios subscribes to
/optimism/8453/3/blocks (V4) Isthmus (withdrawalsRoot) where every block has been since Superchain Upgrade 15 activated (2025-05-09 16:00:01 UTC)

Upstream a16z master has the same V3-only subscription — this very likely explains why all of a16z's *.operationsolarstorm.org mainnet feeds are down (HTTP 502) while base-sepolia still works.

Fix

7 lines in opstack/src/server/net/block_handler.rs: subscribe to the V4 topic alongside V3 (kept for chains that haven't activated Isthmus). Same sequencer-signed commitment envelope verification on both topics — SequencerCommitment::new + signature check against the network's unsafe_signer are payload-version-agnostic on the server side.

Verification (2026-06-03)

  • Without fix: 19 min on --network base, 80 gossip peers, 0 messages, /latest = null
  • Topic scan (subscribed v0–v5): first message arrived on /optimism/8453/3/blocks (59,502 bytes) — empirically confirms V4 is the only live topic
  • With fix: block received → sequencer signature verified/latest serves a live signed Base mainnet head → a helios opstack client at the production rev consumed it end-to-end (tracked Base mainnet via /latest + execution RPC)

Also in this PR

  • master was fast-forward synced to upstream a16z/helios@1fbb9099 beforehand (standard fork sync, a16z's own code)
  • The fork's 4 pre-existing dep-maintenance commits (libp2p 0.56 ≈ upstream chore: update libp2p to 0.56.0 a16z/helios#786, 2× clippy, jsonrpsee features) are re-applied on top so they land on master properly — they were previously dangling off-branch (the production Cargo pin a4fed54 pointed at them)

After merge

  1. inco-monorepo bumps helios-wrapper/Cargo.toml rev pin to the merge SHA (1-line PR) → rebuilds helios-wrapper + helios-consensus images
  2. This fix should be PR'd upstream to a16z — it fixes their headline opstack use case; once released upstream, this fork can collapse back toward zero delta

@amunt0 amunt0 force-pushed the fix/opstack-v4-blocks-topic branch from 7a82849 to 8084a10 Compare June 3, 2026 16:59
@amunt0 amunt0 changed the title fix(opstack): subscribe to V4 blocks gossip topic + consensus server image sync with upstream + V4 blocks gossip topic fix Jun 3, 2026
Base mainnet's sequencer publishes signed unsafe heads on the V4 topic
(/optimism/<chain_id>/3/blocks) since Isthmus; subscribers listening
only on the V3 topic (/2/blocks) receive nothing and the consensus
server never serves a head. Matches the symptom of the public
operationsolarstorm mainnet feeds (502 / no data) while base-sepolia
still works. Keep V3 subscription for chains that still publish on it;
the handler verifies the same sequencer-signed commitment envelope on
both.
@amunt0 amunt0 force-pushed the fix/opstack-v4-blocks-topic branch from 8084a10 to e6d8281 Compare June 3, 2026 17:04
@amunt0 amunt0 changed the title sync with upstream + V4 blocks gossip topic fix fix(opstack): subscribe to V4 blocks gossip topic (Base mainnet post-Isthmus) Jun 3, 2026
@amunt0

amunt0 commented Jun 4, 2026

Copy link
Copy Markdown
Author

Superseded by the inco integration branch (created at this PR's head, e6d8281 — identical content). New model: master stays a pristine upstream mirror; inco = master + Inco patches (dep maintenance + V4 topic fix) and is what the Docker image builds from; upstream merge of a16z#801 eventually collapses inco back to a mirror.

@amunt0 amunt0 closed this Jun 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants