Run a Node
OP Stack Nodes

Run an OP Stack Node

Software requirements

Hardware requirements

We recommend you have this configuration to run a node:

  • at least 16 GB RAM
  • an SSD drive with at least 200 GB free


If you encounter problems with your node, please open a GitHub issue (opens in a new tab) or reach out on our Discord (opens in a new tab).

Featured networks

Zora Sepoliazora-sepolia-0thyhxtf5e
Zora Mainnetzora-mainnet-0
PGN Sepoliapgn-sepolia-i4td3ji6i0
Mode Sepoliamode-sepolia-vtnhnpim72
Mode Mainnetmode-mainnet-0
Ancient8 Sepoliaancient-8-celestia-wib77nnwsq
Ancient8 Mainnetancient8-mainnet-0
BOB Mainnetbob-mainnet-0
Gold Mainnetgold-mainnet-0


  1. Select the network you want to run and set CONDUIT_NETWORK env variable. You will need to know the slug of the network, which you can find in the Conduit app by going to the Browse rollups page (opens in a new tab) and clicking Run a node for the network you want to run.


# for Zora Mainnet
export CONDUIT_NETWORK=zora-mainnet-0

The external nodes feature must be enabled on the network for this to work. If you are the owner of a network, you can enable this feature from your deployment settings in the Conduit app.

  1. Download the required network configuration with:
  1. Ensure you have an Ethereum L1 full node RPC available (not Conduit), and copy .env.example to .env setting OP_NODE_L1_ETH_RPC. If running your own L1 node, it needs to be synced before the specific Conduit network will be able to fully sync. Example:
# .env file
# [recommended] replace with your preferred L1 (Ethereum, not Conduit) node RPC URL:
  1. Start the node!
docker compose up --build
  1. You should now be able to curl your Conduit node:
curl -d '{"id":0,"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false]}' \
  -H "Content-Type: application/json" http://localhost:8545

Note: Some L1 nodes (e.g. Erigon) do not support fetching storage proofs. You can work around this by specifying --l1.trustrpc when starting op-node (add it in op-node-entrypoint and rebuild the docker image with docker compose build.) Do not do this unless you fully trust the L1 node provider.

You can map a local data directory for op-geth by adding a volume mapping to the docker-compose.yaml:

  geth: # this is Optimism's geth client
      - ./geth-data:/data


Not yet available. We're working on it 🏗️


Sync speed depends on your L1 node, as the majority of the chain is derived from data submitted to the L1. You can check your syncing status using the optimism_syncStatus RPC on the op-node container. Example:

command -v jq  &> /dev/null || { echo "jq is not installed" 1>&2 ; }
echo Latest synced block behind by: \
$((($( date +%s )-\
$( curl -s -d '{"id":0,"jsonrpc":"2.0","method":"optimism_syncStatus"}' -H "Content-Type: application/json" http://localhost:7545 |
   jq -r .result.unsafe_l2.timestamp))/60)) minutes

Network Stats

You can see how many nodes you are connected with the following command:

curl -d '{"id":0,"jsonrpc":"2.0","method":"opp2p_peerStats","params":[]}' \
  -H "Content-Type: application/json" http://localhost:7545