Run a Full Node
There is no protocol level incentive to run a BOB full node. If you're interested in accessing the BOB chain, but you don't want to set up your own node, see our Node Providers to get RPC access to fully-managed nodes hosted by a third-party provider.
To stay updated on node upgrades and announcements, join our Telegram channel.
Requirementsโ
As of September 2026 we recommend you have at least the following hardware configuration to run a node:
- at least 8 GB RAM
- an SSD, preferably NVME drive with at least 100 GB free; an archive node restored from the snapshot below needs at least 250 GB (the mainnet snapshot alone is ~106 GiB and the database keeps growing)
Software stack:
BOB Mainnet activates the Karst hard fork (OP Contracts v7.0.0) at Wed Sep 23 2026 16:00:01 UTC (timestamp 1790179201). The fork is consensus-breaking: every node must run op-node v1.19.3 or later and a Karst-capable op-reth (v2.4.3 or later), with the Karst override enabled, before the activation time. op-geth has reached end of support and cannot be used for Karst โ an op-reth execution client is required.
op-reth v2.4.3 additionally fixes a transaction-decoding vulnerability: without the fix, a malformed deposit transaction (missing its 0x7E EIP-2718 type prefix) can push a node onto a non-canonical chain. Do not run earlier versions; the upgrade is an in-place image bump and requires no resync.
The upgrade also includes EIPs that affect gas pricing and may be relevant to application and smart contract developers โ see the breaking changes in Optimism Upgrade 19.
Configurationโ
We provide a simple Docker Compose configuration to get you started. This guide assumes all data will be stored under /opt/.
1. Create data directoriesโ
mkdir -p /opt/op-reth /opt/op-node
2. Generate a JWT secretโ
The JWT secret authenticates the connection between op-node and op-reth.
openssl rand -hex 32 > /opt/op-reth/jwt.hex
3. Download the BOB genesis fileโ
The built-in bob chain spec in op-reth does not yet include the Karst hardfork timestamp. You must download the genesis file from Conduit and pass it to op-reth via --chain.
curl -o /opt/op-reth/genesis.json \
https://api.conduit.xyz/file/v1/optimism/genesis/bob-mainnet-0
Verify the genesis file includes the Jovian and Karst fork times:
jq '.config | {jovianTime, karstTime}' /opt/op-reth/genesis.json
# Expected:
# {
# "jovianTime": 1773325801,
# "karstTime": 1790179201
# }
4. Configure a trusted execution-layer peer for op-rethโ
op-node v1.19.1 removed the consensus-layer request/response sync client. If your node stops or falls behind, it catches up through the execution layer: op-reth fetches the missing range from a trusted EL peer. Conduit publishes one for BOB Mainnet:
curl -sf https://api.conduit.xyz/public/network/elPeers/bob-mainnet-0
Write the returned enode to /opt/op-reth/reth.toml:
[peers]
trusted_nodes = [
"enode://5186f8355abafe7bd900259ffe4c913c1d5e94faa53410018aab26fae911849dc87a9604dd0d849255adae1bc554d51958a122bb6631a8954540b61c33319522@35.252.247.209:30303",
]
Without this peer, a node that falls behind can only re-derive the gap from L1, which is slow. The peer retains a rolling window of recent blocks โ it closes gaps, it does not bootstrap a node from genesis, so start fresh nodes from a snapshot (see Running an Archive Node below).
5. Create the op-node environment fileโ
Ensure you have an Ethereum L1 full node RPC available and set OP_NODE_L1_ETH_RPC and OP_NODE_L1_BEACON to the respective RPC endpoints.
OP_NODE_P2P_STATIC is the node's only consensus-layer connectivity: external nodes do not use P2P discovery, so the bootnode settings found in older guides are obsolete as of op-node v1.19.1. Fetch the current static peer from Conduit's API and update it if it changes:
curl -sf https://api.conduit.xyz/public/network/staticPeers/bob-mainnet-0
OP_NODE_L1_ETH_RPC=.....
OP_NODE_L1_BEACON=......
OP_NODE_L1_TRUST_RPC=true
OP_NODE_LOG_LEVEL=WARN
OP_NODE_P2P_STATIC=/ip4/35.252.247.209/tcp/9222/p2p/16Uiu2HAm1cWcrbn5RGL1tnQojsJp9z1VRDqPtJy26m26qUBr5Kx8
OP_NODE_L2_ENGINE_RPC=http://localhost:9551
OP_NODE_L2_ENGINE_KIND=reth
OP_NODE_L2_ENGINE_AUTH=/reth/jwt.hex
OP_NODE_NETWORK=bob-mainnet
OP_NODE_SYNCMODE=execution-layer
OP_NODE_OVERRIDE_JOVIAN=1773325801
OP_NODE_OVERRIDE_KARST=1790179201
OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS=true
OP_NODE_RPC_ENABLE_ADMIN=true
OP_NODE_SAFEDB_PATH=/data
OP_NODE_METRICS_ENABLED=true
OP_NODE_METRICS_ADDR=127.0.0.1
6. Create the Docker Compose fileโ
services:
op-reth:
image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-reth:v2.4.4
command:
- node
- --chain=/data/genesis.json
- --config=/data/reth.toml
- --full
- --storage.v2
- --datadir=/data
- --rollup.sequencer-http=https://rpc-bob-mainnet-0.t.conduit.xyz
- --rollup.historicalrpc=https://rpc-bob-mainnet-0.t.conduit.xyz
- --rollup.disable-tx-pool-gossip
- --http
- --http.api=web3,debug,eth,txpool,net
- --ws
- --ws.api=web3,debug,eth,txpool,net
- --authrpc.port=9551
- --authrpc.jwtsecret=/data/jwt.hex
- --metrics=127.0.0.1:9001
volumes:
- /opt/op-reth:/data
network_mode: host
restart: unless-stopped
op-node:
image: us-docker.pkg.dev/oplabs-tools-artifacts/images/op-node:v1.19.7
command:
- op-node
env_file: op-node.env
volumes:
- /opt/op-node:/data
- /opt/op-reth:/reth
network_mode: host
restart: unless-stopped
depends_on:
op-reth:
condition: service_started
7. Start the nodeโ
docker compose up -d
Running an Archive Nodeโ
The full node configuration above runs op-reth with --full, which prunes historical state: it serves the current chain but cannot answer queries against arbitrary past blocks (historical eth_call, eth_getProof, tracing). An archive node keeps all state and history from genesis. The simplest way to run one is to restore Conduit's archive-mode snapshot, which also skips the initial sync entirely.
Conduit publishes a regularly refreshed op-reth snapshot for BOB Mainnet in a requester-pays Google Cloud Storage bucket:
| Network | Object | Size |
|---|---|---|
| BOB Mainnet | gs://conduit-networks-snapshots/bob-mainnet-0/latest.tar | ~106 GiB |
The snapshot is a complete archive-mode op-reth data directory: the execution database, static files with all headers, transactions, and receipts back to genesis, and a proofs-history store (see the note below). The archive is not compressed, so the extracted datadir is about the same size as the download. The restore streams and extracts in a single pass, so no extra disk space for the archive itself is required.
Prepare the configurationโ
Follow steps 1โ6 of the full node guide above: the data directories, JWT secret, genesis file, trusted EL peer (reth.toml), op-node.env, and the Docker Compose file are identical for an archive node.
Restore the snapshotโ
Prerequisites:
- The Google Cloud CLI (
gcloud). - A Google Cloud project with billing enabled. The bucket is requester-pays: download egress is charged to this project (pass it via
--billing-project, or setCLOUDSDK_BILLING_QUOTA_PROJECT). - The authenticated account needs the
roles/serviceusage.serviceUsageConsumerrole on the billing project (requester-pays requirements).
Check the size and freshness of the snapshot:
gcloud --billing-project=<GCP_PROJECT_ID> storage objects describe \
gs://conduit-networks-snapshots/bob-mainnet-0/latest.tar --format="value(size,updated)"
With the containers stopped and /opt/op-reth containing only jwt.hex, genesis.json, and reth.toml, restore the snapshot (expect several hours for ~106 GiB):
gcloud --billing-project=<GCP_PROJECT_ID> storage cat \
gs://conduit-networks-snapshots/bob-mainnet-0/latest.tar |
tar --no-same-owner --no-same-permissions -xf - -C /opt/op-reth --strip-components=1
This extracts db/, static_files/, blobstore/, and proofs-history/ directly into the datadir; it does not touch the configuration files already in place.
Adjust the execution client flagsโ
Remove --full and --storage.v2 from the op-reth command in the Docker Compose file from step 6.
The snapshot is an unpruned, archive-mode database. --full is a pruning preset, and running a restored archive database under prune flags is unsupported: reth can enter a prune-stage retry loop (paradigmxyz/reth#21791) or panic on static-file consistency checks (paradigmxyz/reth#23463). --storage.v2 only applies to newly created databases and has no effect on the restored one.
The snapshot includes a proofs-history/ database โ versioned trie data that serves eth_getProof efficiently for blocks within its retention window. To use it, add --proofs-history --proofs-history.storage-version=v2 to the op-reth command. The restored data is usually older than the retention window; if op-reth refuses to start with an error about more than 1,000 blocks to prune, run once before starting the node:
docker compose run --rm --no-deps op-reth proofs prune --chain=/data/genesis.json --datadir=/data
If you don't need historical eth_getProof, leave the flag off โ the restored directory is simply ignored.
Start the nodeโ
docker compose up -d
The node starts from the snapshot tip and follows the chain; verify progress as described in Verifying Sync Progress.
Verifying Sync Progressโ
Sync proceeds in pipeline stages. You can monitor progress with:
curl -s -X POST http://localhost:8545 \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","method":"eth_syncing","params":[],"id":1}' | jq .
While syncing, eth_syncing returns a status object with per-stage block checkpoints (Headers โ Bodies โ Execution). Once all stages are complete, it returns false and eth_blockNumber will reflect the live chain head.
Expected sync time from scratch is several hours depending on hardware and network. A node restored from the snapshot starts near the current tip and typically catches up within minutes to a few hours, depending on the age of the snapshot.
Rollup Configuration and Genesisโ
The genesis and rollup configuration files for BOB Mainnet are available from Conduit:
The published contracts.json is republished after the Karst activation in a new format aligned with op-contracts/v7.0.0 and OPCMv2. If you rely on the currently published copy, treat its addresses as potentially stale, and re-download the file after activation โ updating any hardcoded addresses and parsing logic that assumes the old structure.
BOB Sepolia (Testnet)โ
You can also run a full node for BOB Sepolia. Configuration information can be found on Conduit's BOB Sepolia hub page.
We do not provide support for running a full node on the testnet. If you have any issues, please refer to the Conduit's node documentation for more information.
Resourcesโ
Additional information on how to self-host a node for an OP Stack rollup is available on Conduit's node documentation. Full details on the rollup configuration are available on the Conduit BOB Mainnet hub page.