op-supernode is in active development.
This page tracks the op-supernode/v0.2.2-rc.8 release candidate and the procedure may evolve before the stable release.
For background on what op-supernode is and why it exists, see the supernode explainer.
Before you start
You need:- One execution client per chain. Each chain in the dependency set needs its own execution client with the engine API (authrpc) enabled; one execution client cannot back two chains. See the execution client configuration guide for client options, and the run a node from source tutorial for a full execution-client walkthrough.
- L1 endpoints. An L1 JSON-RPC endpoint with the
ethnamespace enabled and an L1 beacon-node HTTP endpoint, shared by every chain. A beacon archiver fallback is strongly recommended — see configuring a blob archiver. - The chain IDs of every chain the supernode will host. For chains in op-node’s built-in network registry (for example
op-sepolia,unichain-sepolia), the network name is enough. For any other chain, you need a rollup configuration JSON file per chain.
Build op-supernode
The binary is built from the Optimism Monorepo. The build environment is managed through mise, which installs the toolchains needed to build the monorepo — seemise.toml at the monorepo root.
1
Clone the monorepo and check out the release tag
2
Build the binary
op-supernode/bin/op-supernode.3
Confirm the build
The flag set is generated dynamically from the
--chains list, so to inspect the full help output for your chains, run ./bin/op-supernode --chains=<chainIDs> --help.Create the JWT secret and wire the engine API
Each chain’s virtual node authenticates to that chain’s execution client over the engine API using a shared JWT secret.1
Generate the secret
2
Start each execution client with the secret
Start every chain’s execution client with its authrpc listening and pointed at the same secret file — for op-reth,
--authrpc.jwtsecret=<path>.
Start the execution clients before the supernode; they simply won’t receive blocks until the supernode connects.3
Note the engine-API endpoint of each execution client
You will pass each chain’s engine-API endpoint (port
8551 by convention) to the supernode as --vn.<chainID>.l2 in the next section.
The supernode side of the secret is a single --vn.all.l2.jwt-secret=<path> flag when every execution client shares one secret; use the per-chain --vn.<chainID>.l2.jwt-secret form only when a client needs its own.Start op-supernode
Start the supernode with the list of chain IDs, the shared L1 endpoints, and each chain’s network identity and engine-API endpoint. The example below hosts OP Sepolia (chain ID11155420) and Unichain Sepolia (chain ID 1301) with op-reth execution clients.
Fill in the placeholders, and add or remove the per-chain --vn.<chainID>.* groups to match your dependency set.
- For a chain that is not in op-node’s built-in network registry, replace
--vn.<chainID>.networkwith--vn.<chainID>.rollup.config=<path-to-rollup-config.json>. - The
--vn.<chainID>.l2.enginekind=rethlines tell the supernode the execution client is op-reth; the default isgeth, so drop them if you run op-geth. - P2P is enabled by default, with each virtual node’s listen port chosen dynamically to avoid collisions. Set
--disable-p2p=truewhen other nodes in your topology handle unsafe-head gossip — see pair op-supernode with a Light CL fleet. - The JSON-RPC server listens on
0.0.0.0:8545by default (--rpc.addr/--rpc.port). Like the op-node RPC, it is not meant to be exposed to the public internet. - Every flag has an environment-variable equivalent (
OP_SUPERNODE_*) — the configuration guide’s example configuration shows the same kind of setup in environment-variable form, and the configuration reference lists the exact name for every flag.
Verify the supernode is working
1
Watch the logs
The heartbeat activity logs a
heartbeat message every 10 seconds as a basic sign that the process is alive and its activities are running.2
Check liveness over RPC
The
heartbeat_check method at the RPC root returns a random hex value as a sign of life:3
Check aggregate sync status
The Confirm that every chain ID you configured appears in the response and that the reported heads advance between calls.
supernode_syncStatus method at the RPC root returns the per-chain op-node sync status for every hosted chain, plus dependency-set-wide fields: the chain IDs, the highest fully derived and verified L1 block, and the safe, local-safe, and finalized L2 timestamps across the set.4
Check an individual chain
Each chain’s full op-node RPC surface is mounted under a A chain’s endpoint becomes available once its chain container has started; requests to a chain ID that is not configured return
/<chainID>/ path prefix on the same server, so any op-node JSON-RPC method works per chain:404 Not Found.5
Check metrics
With
--metrics.enabled=true, every chain’s metrics are fanned into a single Prometheus endpoint at /metrics on the metrics port (default 7300), labeled per chain:Next steps
- Harden the deployment with the supernode configuration guide — beacon archiver fallbacks, execution-client retention for backfill, Light CL fleets, and HA pools behind a consensus-aware proxyd.
- Look up any flag in the op-supernode configuration reference.
- Read the supernode explainer for what op-supernode is and why it exists.
- Read the interop prep notice for the node-operator action checklist for the OP Sepolia and Unichain Sepolia activation.