Azul Node Upgrade Guide
Azul is only supported by base-reth-node (execution) and base-consensus (consensus). Nodes still running op-node, op-geth, op-reth, nethermind, or kona cannot follow the upgrade and have to be migrated.
Azul went live on mainnet at May 28, 2026 18:00 UTC (1779991200). The Azul overview carries the full activation-timestamp table.
Required software
Section titled “Required software”| Layer | Software | Mainnet | Testnet |
|---|---|---|---|
| Execution (EL) | base-reth-node | v0.9.0+ | v0.7.0+ |
| Consensus (CL) | base-consensus | v0.9.0+ | v0.7.0+ |
Migrating the execution layer
Section titled “Migrating the execution layer”Coming from OP Reth
Section titled “Coming from OP Reth”Operators already on OP Reth through the compose setup only need to update — the latest version switches the binary to base-reth-node automatically, and your current ./reth-data directory carries over with no re-sync or snapshot restore required.
-
Stop your node:
Terminal window docker compose down -
Move to base/base, which now publishes the operator node, and update it:
Terminal window # Coming from a base/node clone? Clone base/base next to it and bring your env file across:git clone https://github.com/base/base.gitcp ../node/.env.mainnet ./base/.env.mainnet # or .env.sepolia# Already tracking base/base:git pull origin main -
Start your node:
Terminal window docker compose up -
Confirm the client version:
web3_clientVersionshould now carrybasein the string (for examplereth/v1.11.3-.../base/v0.9.0).
Coming from another client
Section titled “Coming from another client”op-geth and nethermind are no longer supported, so you will have to start over on base-reth-node.
-
Stop your node:
Terminal window docker compose down -
Clone base/base, or update an existing clone:
Terminal window git clone https://github.com/base/base.git# or, where it is already cloned:git pull origin main -
Delete the old data directory (for example
./geth-dataor./nethermind-data). -
Adjust
.env.mainnetor.env.sepoliato your preferences. -
Bootstrap from a Reth snapshot so you can skip a full sync.
-
Start your node:
Terminal window docker compose up
Migrating the consensus layer
Section titled “Migrating the consensus layer”Swap op-node for base-consensus by updating environment variables.
-
Set
USE_BASE_CONSENSUS=truein your.envfile. -
Add the new
BASE_NODE_*environment variables (mapping below). -
Restart your node:
Terminal window docker compose up -
Verify:
- Tail the consensus logs:
docker compose logs -f node - Confirm sync status:
optimism_syncStatusstill responds
- Tail the consensus logs:
Environment variable mapping
Section titled “Environment variable mapping”The .env.mainnet and .env.sepolia templates in base/base already populate most of these. If you build from base/base, translate your op-node variables with the table below. Nearly all of them are optional. base-consensus node --help prints the complete set.
op-node | base-consensus |
|---|---|
OP_NODE_NETWORK | BASE_NODE_NETWORK |
OP_NODE_ROLLUP_CONFIG | BASE_NODE_ROLLUP_CONFIG |
| — | BASE_NODE_LOG_VERBOSITY |
| — | BASE_NODE_LOG_FORMAT |
OP_NODE_L1_ETH_RPC | BASE_NODE_L1_ETH_RPC |
OP_NODE_L1_BEACON | BASE_NODE_L1_BEACON |
OP_NODE_L1_TRUST_RPC | BASE_NODE_L1_TRUST_RPC |
OP_NODE_L2_ENGINE_RPC | BASE_NODE_L2_ENGINE_RPC |
OP_NODE_L2_ENGINE_AUTH | BASE_NODE_L2_ENGINE_AUTH |
| — | BASE_NODE_L2_ENGINE_AUTH_ENCODED |
OP_NODE_P2P_BOOTNODES | BASE_NODE_P2P_BOOTNODES |
OP_NODE_P2P_LISTEN_IP | BASE_NODE_P2P_LISTEN_IP |
OP_NODE_P2P_LISTEN_TCP_PORT | BASE_NODE_P2P_LISTEN_TCP_PORT |
OP_NODE_P2P_LISTEN_UDP_PORT | BASE_NODE_P2P_LISTEN_UDP_PORT |
OP_NODE_P2P_ADVERTISE_IP | BASE_NODE_P2P_ADVERTISE_IP |
OP_NODE_P2P_ADVERTISE_TCP | BASE_NODE_P2P_ADVERTISE_TCP_PORT |
OP_NODE_P2P_ADVERTISE_UDP | BASE_NODE_P2P_ADVERTISE_UDP_PORT |
OP_NODE_P2P_PRIV_PATH | BASE_NODE_P2P_PRIV_PATH |
OP_NODE_P2P_PEER_SCORING | BASE_NODE_P2P_SCORING |
OP_NODE_P2P_PEER_BANNING | BASE_NODE_P2P_BAN_PEERS |
OP_NODE_P2P_PEER_BANNING_THRESHOLD | BASE_NODE_P2P_BAN_THRESHOLD |
OP_NODE_P2P_PEER_BANNING_DURATION | BASE_NODE_P2P_BAN_DURATION |
OP_NODE_METRICS_ENABLED | BASE_NODE_METRICS_ENABLED |
OP_NODE_METRICS_ADDR | BASE_NODE_METRICS_ADDR |
OP_NODE_METRICS_PORT | BASE_NODE_METRICS_PORT |
OP_NODE_RPC_ADDR | BASE_NODE_RPC_ADDR |
OP_NODE_RPC_PORT | BASE_NODE_RPC_PORT |
OP_NODE_RPC_ENABLE_ADMIN | BASE_NODE_RPC_ENABLE_ADMIN |
OP_NODE_RPC_ADMIN_STATE | BASE_NODE_RPC_ADMIN_STATE |
OP_NODE_SAFEDB_PATH | BASE_NODE_SAFEDB_PATH |
OP_NODE_SYNCMODE | — |
OP_NODE_VERIFIER_L1_CONFS | — |
OP_NODE_L2_ENGINE_KIND | — |
OP_NODE_L1_RPC_KIND | — |
OP_NODE_L1_BEACON_FETCH_ALL_SIDECARS | — |
OP_NODE_L1_BEACON_FALLBACKS | — |
OP_NODE_ROLLUP_LOAD_PROTOCOL_VERSIONS | — |
OP_NODE_P2P_STATIC | — |
OP_NODE_P2P_DISABLE | — |
OP_NODE_P2P_NAT | — |
- Do I have to re-sync? No, not if you are already on OP Reth — the existing data directory is compatible.
- What if I run
op-gethornethermind? Move tobase-reth-nodeand bootstrap from a Reth snapshot. - Do the OP namespace RPCs still work? Yes — every existing RPC remains supported.