---
title: "Azul Node Upgrade Guide"
description: "Migrate a Base node to base-reth-node and base-consensus for the Azul hardfork, including the op-node to base-consensus environment variable mapping."
source: https://basehub.org/node-operations/azul-node-upgrade/
---
import { Aside } from '@astrojs/starlight/components';

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](/specifications/azul-overview/) carries the full activation-timestamp table.

## Required software

| Layer | Software | Mainnet | Testnet |
|-------|----------|---------|---------|
| Execution (EL) | `base-reth-node` | [v0.9.0+](https://github.com/base/base/releases/tag/v0.9.0) | [v0.7.0+](https://github.com/base/base/releases/tag/v0.7.0) |
| Consensus (CL) | `base-consensus` | [v0.9.0+](https://github.com/base/base/releases/tag/v0.9.0) | [v0.7.0+](https://github.com/base/base/releases/tag/v0.7.0) |

<Aside type="note">
Both clients ship from the [base/node](https://github.com/base/node/releases) repository, where the bulk of the configuration is preset and can be overridden through environment variables — see the `.env.mainnet` and `.env.sepolia` files for every adjustable option.

If you instead build straight from [base/base](https://github.com/base/base/releases), you will need to switch your `base-consensus` configuration over to the new `BASE_NODE_*` environment variables. `base-reth-node` keeps working with all of your existing Reth tooling and configuration unchanged.
</Aside>

## Migrating the execution layer

### Coming from OP Reth

Operators already on OP Reth via [base/node](https://github.com/base/node) 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.

1. Stop your node:

   ```bash
   docker compose down
   ```

2. Update to the latest version of [base/node](https://github.com/base/node):

   ```bash
   git pull origin main
   ```

3. Start your node:

   ```bash
   docker compose up
   ```

4. Confirm the client version: `web3_clientVersion` should now carry `base` in the string (for example `reth/v1.11.3-.../base/v0.9.0`).

### Coming from another client

`op-geth` and `nethermind` are no longer supported, so you will have to start over on `base-reth-node`.

1. Stop your node:

   ```bash
   docker compose down
   ```

2. Update to the latest version of [base/node](https://github.com/base/node):

   ```bash
   git pull origin main
   ```

3. Delete the old data directory (for example `./geth-data` or `./nethermind-data`).

4. Adjust `.env.mainnet` or `.env.sepolia` to your preferences.

5. Bootstrap from a [Reth snapshot](/node-operations/snapshots/) so you can skip a full sync.

6. Start your node:

   ```bash
   docker compose up
   ```

## Migrating the consensus layer

Swap `op-node` for `base-consensus` by updating environment variables.

1. Set `USE_BASE_CONSENSUS=true` in your `.env` file.

2. Add the new `BASE_NODE_*` environment variables (mapping below).

3. Restart your node:

   ```bash
   docker compose up
   ```

4. Verify:
   - Tail the consensus logs: `docker compose logs -f node`
   - Confirm sync status: `optimism_syncStatus` still responds

### Environment variable mapping

On [base/node](https://github.com/base/node) most of these are already populated in `.env.mainnet` and `.env.sepolia`. If you build from [base/base](https://github.com/base/base), use the table below to translate your `op-node` variables to `base-consensus`. Most are optional; run `base-consensus node --help` for the complete list.

| `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` | — |

## FAQ

- **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-geth` or `nethermind`?** Move to `base-reth-node` and bootstrap from a [Reth snapshot](/node-operations/snapshots/).
- **Do the OP namespace RPCs still work?** Yes — every existing RPC remains supported.
