This tutorial walks through the full process of building and running an OP Stack node from source — op-node plus an execution client. Building from source is a flexible alternative to using pre-built Docker images and is useful if you need a specific architecture or want to inspect what you’re running. For permissionless chains setting up historical proofs for withdrawal proving, follow this tutorial first to get a working node, then continue with Running op-reth with Historical Proofs.Documentation Index
Fetch the complete documentation index at: https://docs.optimism.io/llms.txt
Use this file to discover all available pages before exploring further.
Hardware requirements
Hardware requirements for OP Mainnet nodes can vary depending on the type of node you plan to run. Archive nodes generally require significantly more resources than full nodes. Below are suggested minimum hardware requirements for each type of node.- 16GB RAM
- Reasonably modern CPU
SSD capacity requirements
Given the growing size of the blockchain state, choosing the right SSD size is important. Below are the storage needs as of June 2025:- Full Node: The snapshot size for a full node is approximately 700GB, with the data directory’s capacity increasing by about 100GB every six months.
- Archive Node: The snapshot size for an archive node is approximately 14TB, with the data directory’s capacity increasing by about 3.5TB every six months. A local SSD with a NVME interface is recommended for archive nodes.
Software dependencies
The build environment is managed through mise, which installs and manages the toolchains (Rust, Go) needed to build the monorepo. The mise configuration lives inmise.toml at the monorepo root.
Build op-node and the execution client
The Optimism Monorepo does coordinated releases — each release commit is tagged simultaneously across components (op-node, op-reth, kona-node, etc.). Pinning to one release tag gives you a known-good combination of all of them built from the same source state. Look up the latest tags on the Optimism releases page.Pin to a release commit
Check out a recent op-node release tag — the same commit carries the matching op-reth tag. For example,
op-node/v1.18.2 is co-tagged with op-reth/v2.2.4:op-reth/v2.2.3 or later is required to enable the historical proof store v2 (--proofs-history.storage-version=v2). The op-node/v1.18.x release line carries op-reth ≥ v2.2.3, so any of those tags satisfies that requirement.Build the execution client
- op-reth
- Nethermind
op-reth lives inside the monorepo at Binary:
rust/op-reth/ — no second git clone needed.rust/target/release/op-reth (relative to the monorepo root). rust/ is a Cargo workspace, so the target/ directory lives at the workspace root, not inside the individual crate. Build outputs are gitignored, so they persist across any future git checkout.Assess blob archiver
Assess if you need to configure a blob archiver service by reading Configure a Blob Archiver.Create a JWT secret
The execution client andop-node communicate over the engine API authrpc, secured with a shared 32-byte hex secret. Both binaries must read the same secret file. The commands below use a relative path (./jwt.txt) for each binary, so the same content must exist at both launch directories.
The two copies must remain identical — if you regenerate one side, copy it over to the other before restarting.
Start the execution client
It’s generally easier to start the execution client beforeop-node. The EL will simply not receive any blocks until op-node is started.
- op-reth
- Nethermind
Navigate to the rust workspace directory
op-reth is built into the workspace target dir, so launch from The binary is then at
optimism/rust/:./target/release/op-reth.Start op-reth
For archive-node configuration (historical state for withdrawal proving), see the OP Mainnet archive nodes section.
--chain=optimism and --rollup.sequencer=https://mainnet-sequencer.optimism.io.Start op-node
Once your execution client is running, startop-node. It will connect to the EL and begin synchronizing the chain.
Navigate to the op-node directory
op-node is built into its own crate directory, so launch from The binary is then at
optimism/op-node/:./bin/op-node.Start op-node
The
op-node RPC should not be exposed publicly. If left exposed, it could accidentally expose admin controls to the public internet.--syncmode=execution-layer enables snap sync, which works for both op-reth and Nethermind and removes the need to initialize the node with a data directory.--l2.enginekind=reth is required when pairing with op-reth. The binary still defaults to geth for backward compatibility — set --l2.enginekind=geth if you are still running op-geth.Some L1 nodes (e.g. Erigon) do not support
eth_getProof. Add --l1.trustrpc if your L1 doesn’t support it — this means op-node trusts the L1 node to provide correct data.Synchronization verification
Once the EL and op-node are running, you should see them begin to communicate and synchronize.Snap sync (default)
Initial synchronization can take several hours. At the start of snap sync,op-node will log:
Starting EL sync is shown once and the sync-progress / inserting logs repeat until done. op-node will log the following when finished:
- op-reth
- Nethermind
op-reth logs sync stages (headers, bodies, execution, state root) with periodic progress lines. Monitor the op-reth logs to confirm it is advancing through stages alongside the op-node Sync progress lines.Full sync
Full sync rebuilds the chain from genesis and can take days to weeks on mature networks. Most operators should use snap sync (above) or bootstrap from a pre-synced snapshot. Full-sync configuration is client-specific:- op-reth
- Nethermind
op-reth’s snap sync is the recommended initialization path. For alternative sync configurations, see the op-reth configuration reference.
op-node derives L1 batches into L2 blocks and feeds them to the execution client. You’ll see logs like:
OP Mainnet archive nodes
You only need an archive node if you need historical state. Most node operators should default to full nodes.
--rpc.eth-proof-window (no separate proofs database; size to your dispute-game cadence) or --proofs-history (bounded memory, larger storage). See:
- Running op-reth with Historical Proofs — full setup for
--proofs-history(v2) on op-reth v2.2.3+. - Archive node guide — flag overview for both paths.
- OP Mainnet snapshots — pre-synced op-reth datadirs to bootstrap from.
Legacy Geth (pre-Bedrock, optional)
Blocks and transactions included in OP Mainnet before the Bedrock Upgrade cannot be executed by modern OP Mainnet nodes. Modern nodes serve these blocks but cannot run stateful queries likeeth_call against them. For complete archive coverage of pre-Bedrock OP Mainnet state, run a Legacy Geth (l2geth) node alongside your modern node. This is only relevant to OP Mainnet archive nodes; skip if running a full node or OP Sepolia.
Download the legacy Geth data directory
op-geth (legacy — end of support 2026-05-31)
Build and run op-geth (legacy)
Build and run op-geth (legacy)
Pair op-geth with op-node by setting See the op-geth configuration reference for the full flag set.Once synced, op-geth logs block imports as op-node feeds payloads:
--l2.enginekind=geth (the binary default) instead of reth in the op-node command above.Build op-geth
Check out the required release branch
Check the op-geth releases page for the correct branch.
Start op-geth
For an archive node, also set--gcmode=archive.op-geth snap-sync stages
op-geth’s snap sync runs in two stages — header download then state download:Next steps
- If your node is up and running, check the Node Metrics and Monitoring Guide to keep tabs on it.
- If you run into problems, see the Node Troubleshooting Guide.
- For permissionless chains setting up withdrawal proving, continue with Running op-reth with Historical Proofs.