This page lists common troubleshooting scenarios and solutions for node operators.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.
401 Unauthorized: Signature Invalid
If you see a log that looks like this inop-node:
op-node is unable to authenticate with execution client’s authenticated RPC using the JWT secret.
Solution
- Check that the JWT secret is correct in both services.
- Check that
execution client’s authenticated RPC is enabled, and that the URL is correct.
403 Forbidden: Invalid Host Specified
If you see a log that looks like this inop-node:
op-node’s host with execution client.
Solution
- Make sure that the
--authrpc.vhostsparameter inexecution clientis either set to the correct host, or*. - Check that
execution client’s authenticated RPC is enabled, and that the URL is correct.
Failed to Load P2P Config
If you see a log that looks like this inop-node:
op-node lacks write access to the P2P discovery or peerstore directories.
Solution
- Make sure that the
op-nodehas write access to the P2P directory. By default, this is/p2p. - Set the P2P directory to somewhere the
op-nodecan access via the--p2p.discovery.pathand--p2p.peerstore.pathparameters. - Set the discovery path to
memoryto disable persistence via the--p2p.discovery.pathand--p2p.peerstore.pathparameters.
Wrong Chain
If you see a log that looks like this inop-node:
op-node is pointing to the wrong chain.
Solution
- Verify that the
op-node’s L1 URL is pointing to the correct L1 for the given network. - Verify that the
op-node’s rollup config/--networkparameter is set to the correct network. - Verify that the
op-node’s L2 URL is pointing to the correct instance ofexecution client, and thatexecution clientis properly initialized for the given network.
Error: eth_sendRawTransaction Does Not Exist
If an RPC call to your execution client (op-geth, Nethermind, etc.) returns a response like:
-32601 JSON-RPC error means the sequencer endpoint you configured does not expose eth_sendRawTransaction. The request path looks like:
op-node only exposes rollup-specific RPC methods—there is no eth_* namespace—it cannot accept raw transaction submissions. When op-geth forwards the transaction to an op-node URL it immediately fails with -32601.
This situation almost always happens when:
--rollup.sequencerhttp(orROLLUP_SEQUENCER_HTTP) is pointed to your ownop-nodeinstead of the hosted public sequencer.- The sequencer container was launched with that flag by mistake, so your node tries to submit transactions to itself.
--rollup.sequencerhttp at the public sequencer endpoint published in the network config. For user-deployed L2s that host their own sequencer, do not set this option at all so the execution client talks directly to your local sequencer and never forwards to an op-node.
Solution
- Confirm your execution client exposes the
ethnamespace on its HTTP API (--http.api eth,net,engine,...for geth/op-geth). Ifethis disabled, raw transactions will be rejected before they reach the sequencer. - Inspect the environment/CLI flags of every component that speaks to the sequencer (
op-node,execution client,op-batcher,op-proposer, scripts). The--rollup.sequencerhttpflag must point to the public sequencer URL for the chain (for example,https://mainnet-sequencer.optimism.io), not to your ownop-node. - For user-deployed L2s where you run the sequencer yourself, leave
--rollup.sequencerhttpunset so the client forwards locally and never falls back to anop-nodeendpoint. - If you templated docker-compose or systemd files, make sure
ROLLUP_SEQUENCER_HTTPis not being overwritten by another.envfile or compose override. Remove any accidental references to your local node. - Restart the affected services after correcting the flag so they pick up the new endpoint. The error should disappear as soon as they can reach the proper sequencer RPC.
Unclean Shutdowns
If you see a log that looks like this inexecution client:
execution client has experienced an unclean shutdown. The geth docs
say if Geth stops unexpectedly, the database can be corrupted. This is known as an
“unclean shutdown” and it can lead to a variety of problems for the node when
it is restarted.
For op-geth
It is always best to shut down Geth gracefully, i.e. using a shutdown command such asctrl-c, docker stop -t 300 <container ID> or
systemctl stop (although please note that systemctl stop has a default timeout
of 90s - if Geth takes longer than this to gracefully shut down it will quit
forcefully. Update the TimeoutSecs variable in systemd.service to override this
value to something larger, at least 300s).
This way, Geth knows to write all relevant information into the database to
allow the node to restart properly later. This can involve >1GB of information
being written to the LevelDB database which can take several minutes.
Solution
In most cases, op-geth can recover automatically from an unclean shutdown when you restart it. The warning message is informational and doesn’t necessarily indicate a problem.
However, if op-geth fails to restart properly after an unclean shutdown, you can use the removedb subcommand as a last resort:
For Nethermind
Unclean shutdowns inNethermind can lead to database corruption. This typically happens when:
- The node experiences hardware failures (disk failures, memory errors, overheating)
- Power cuts cause abrupt shutdowns
- The process is terminated without proper cleanup
-
Lock File Issues
If
Nethermindcomplains about lock files after an unclean shutdown, run: -
Block Checksum Mismatch
If you encounter block checksum mismatch errors, you can enable direct I/O:
Note: This may impact performance.
-
Complete Resync
In cases of severe corruption, a full resync is recommended: