op-reth + op-node pair that follows the canonical L2 chain and exposes JSON-RPC and WebSocket endpoints.
Available on Testnet today; Mainnet at launch.
Prerequisites
Hardware
Disk usage grows with the chain. Restoring a snapshot saves the initial sync time but does not change steady-state growth.
Software
- A Linux server with a public IP.
- Docker with Compose v2.
make,git,openssl,curl,jq.zstdandtarif you restore from a snapshot.
L1 RPC and Beacon
You need your own Ethereum L1 RPC and Beacon endpoints.op-node reads L1 batches through the RPC. It reads blob data through the Beacon API, since Whitechain batches are posted to L1 as EIP-4844 blobs, and blobs are only retrievable through the Beacon API, not the execution RPC. A regular execution-only endpoint is not enough; whatever you use must expose both.
Run your own L1 node, or use a provider that offers a matching pair of endpoints for the network below. Not every provider exposes a Beacon API on its free tier, so confirm both endpoints respond before filling in .env.
Files from the Whitechain team
genesis.json(L2 execution genesis) androllup.json(OP rollup configuration) for your network. Both are published, with checksums and a regeneration recipe, in the whitechain-bootstrap repository. See Network artifacts.WHITECHAIN_PUBLIC_RPC: the public Whitechain RPC URL, used as the transaction-forwarding target.WHITECHAIN_RETH_TRUSTED_PEERS: a trusted reth enode to snap-sync from (required forfull-snap-node).WHITECHAIN_PUBLIC_OP_NODE_P2P(optional): a static op-node peer.- An
op-rethdatabase snapshot URL (optional, recommended forfull-nodeandarchive-node).
For testnet, the
artifacts/testnet/ files and .env.testnet.example already ship with working values for all of these, byte for byte identical to the published artifacts. You only need to request values from the Whitechain team for mainnet, or if you need a fresh snapshot URL.Set up the node
-
Get the
public-rpc-nodemanifests onto your server, from the whitechain-labs/node repository. -
Place the network artifacts under
artifacts/<network>/. The folder name must matchWHITECHAIN_NETWORKin.env. See Network artifacts for where to download them and how to verify them. -
Create your
.envfrom the example and fill in the required values.For the full list of variables, see Node configuration. -
To skip the long initial sync on
full-nodeorarchive-node, restore a snapshot first. See Restore from a snapshot.full-snap-nodeskips this step. It snap-syncs directly fromWHITECHAIN_RETH_TRUSTED_PEERS. -
Start the profile you chose.
make upvalidates.envand the artifacts, generateskeys/jwt.txtif missing, then runsdocker compose --profile <profile> up -d. -
Confirm the node responds on the profile’s HTTP port.
Verify the sync
Watch the logs withmake logs-full-snap-node (or logs-full-node / logs-archive-node). In op-node you should see Connected to L1 Beacon API and started p2p host with your local peerID early on. What follows depends on the profile’s sync method:
full-snap-node(execution-layer / snap):Starting EL sync, then repeatingInserting unsafe L2 execution payload to drive EL syncandInserted new L2 unsafe blocklines. These appear as blocks are pulled from the trusted peer and applied toop-reth.full-node/archive-node(consensus-layer): repeatingAdvancing bq originlines (L1 batch derivation), thenInserted new L2 unsafe blocklines asop-rethre-executes each block.
Underneath this,
op-reth runs its own staged sync pipeline (14 stages) independently of what op-node reports. The RPC keeps reporting block 0 until the pipeline finishes, which is expected, not a hang. Watch the op-reth container logs directly: docker logs -f whitechain-<profile>-op-reth 2>&1 | grep --line-buffered -iE "stage=|received headers|finished stage". Header download logs Received headers ... to_block=N; later stages log checkpoint=X target=Y.In the first few minutes after start, the node may report no peers ready to handle block requests until the static peer handshake completes. Wait for a connected peer to appear before treating this as an error.
op-node RPC on 9545 is bound to loopback (127.0.0.1) only, on every profile. Query it from the host the node runs on, not over the network.
