Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ After switching to MPT storage, pruning is only supported after the node has syn
### zkTrie Nodes (legacy)

:::caution
This section only applies to nodes still running with zkTrie state storage **before** migrating to MPT. Once you switch to an MPT node, the zkTrie prune command is no longer supported. See the [zkTrie -> MPT migration guide](./upgrade-node/0-zktrie-to-mpt-migration.md) for details.
This section only applies to nodes still running with zkTrie state storage **before** migrating to MPT. Once you switch to an MPT node, the zkTrie prune command is no longer supported.
:::

For nodes still running with zkTrie state storage, use the zkTrie-specific prune command:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import TabItem from '@theme/TabItem';

This guide will help you start a full node using [run-morph-node](https://github.com/morph-l2/run-morph-node).

:::tip Already running a node?
If you are upgrading an existing **zkTrie node**, do **not** redeploy from scratch. Follow the [zkTrie -> MPT migration](../upgrade-node/0-zktrie-to-mpt-migration.md) guide instead.
:::info Single node type
There is no longer a separate "validator node" to run. Every node verifies the chain against L1; the verification method is selected by `DERIVATION_VERIFY_MODE`. If you want a node that derives blocks from L1 like the former validator, set it to `layer1` — see [Batch verification mode](#batch-verification-mode) below.
:::
Comment thread
coderabbitai[bot] marked this conversation as resolved.

## Hardware Requirements
Expand Down Expand Up @@ -179,6 +179,25 @@ curl http://localhost:26657/status

When `catching_up` is `false`, the node has finished syncing.

### Batch verification mode

Every node verifies batches against L1. The method is controlled by `DERIVATION_VERIFY_MODE` in `morph-node/.env` / `.env_hoodi`:

| Mode | Behavior |
|------|----------|
| `local` (default) | Rebuilds blob bytes from local L2 blocks and compares versioned hashes against L1. No beacon-blob fetch on the happy path — lighter weight. |
| `layer1` | Pulls the L1 beacon blob, decodes it, and derives blocks via the engine. This is equivalent to the **former validator node** that derives from L1. |

:::tip Want the old validator behavior?
If you want a node that derives from L1 the way the previous validator node did, set `DERIVATION_VERIFY_MODE=layer1` in your env file. The default (`local`) is sufficient for most operators.
:::

If a node detects a mismatch between the sequencer's submission and its own verification, it logs a line such as:

```
root hash or withdrawal hash is not equal originStateRootHash=0x... deriveStateRootHash=0x...
```
Comment thread
coderabbitai[bot] marked this conversation as resolved.

## Advanced Usage

### Customizing the data directory
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
title: Upgrade to the centralized sequencer
lang: en-US
---

Morph has moved node operation to a **centralized sequencer** architecture. This page summarizes what changed for node operators and how to upgrade an existing node.

:::tip
If you are setting up a node from scratch, just follow [Run a full node](../full-node/1-run-in-docker.md) — it already reflects the centralized-sequencer setup. This page is for operators upgrading an existing node.
:::

## What changed

- **Single node type.** There is no longer a separate *validator node* — every node runs the same binary and verifies the chain against L1. Your existing `run-morph-node` validator commands still work unchanged; a validator is now simply the single node running in `layer1` mode.
- **Batch verification is now configurable** via `DERIVATION_VERIFY_MODE` (see below). The previous validator behavior — deriving from L1 — is now an opt-in mode rather than a separate node.
- **Almost no new configuration.** Everything except the L1 beacon RPC endpoint uses per-network defaults baked into the binary, so for most operators upgrading the binary is enough.

## Environment variables

For most operators the **only** variable you may need to add is `L1_BEACON_CHAIN_RPC`. Everything else (rollup / deposit contract addresses, derivation heights) uses per-network defaults selected by the network flag — you don't need to set them.

| Variable | Required? | Notes |
|----------|-----------|-------|
| `L1_BEACON_CHAIN_RPC` | **Yes** | L1 beacon chain RPC endpoint. The node exits at startup without it — add it if your node doesn't already have one. |
| `DERIVATION_VERIFY_MODE` | Optional | Batch verification mode. Default `local` (rebuild blob from local L2 blocks and compare versioned hashes against L1). Set `layer1` to pull the L1 beacon blob and derive via the engine — **equivalent to the former validator node**. |

:::tip Were you running a validator?
If your node already passes the old `--validator` flag, **you don't need to change anything — just upgrade the binary.** `--validator` is now a deprecated alias for `--derivation.verify-mode=layer1`, so it keeps deriving from L1 exactly as before (it only logs a deprecation warning). Migrate to `DERIVATION_VERIFY_MODE=layer1` when convenient, as `--validator` will be removed in a future release.
:::

Do **not** set `L1_SEQUENCER_CONTRACT` or `MORPH_NODE_SEQUENCER_UPGRADE_TIME` — they use per-network hard-coded defaults selected by `--mainnet` / `--hoodi`. Overriding `MORPH_NODE_SEQUENCER_UPGRADE_TIME` moves the consensus-switch activation away from the network default (and a value `<= 0` disables the timestamp-triggered switch entirely).

## Activation schedule

The switch from the Tendermint validator set to the centralized sequencer triggers at a fixed L2 block **timestamp** baked into the release and selected by the network flag — you do **not** need to set it yourself. It is a fixed point in time; these values do not change:

| Network | Activation (UTC) | `MORPH_NODE_SEQUENCER_UPGRADE_TIME` (Unix ms) | Start flag |
|---------|------------------|-----------------------------------------------|------------|
| Mainnet | 2026-07-28 06:00:00 | `1785218400000` | `--mainnet` |
| Hoodi | 2026-07-21 06:00:00 | `1784613600000` | `--hoodi` |

Target versions: node **v0.6.0** · go-ethereum **morph-v2.2.4**. Upgrade to these (or newer) before the activation time for your network.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the target document and related references.
sed -n '1,140p' docs/build-on-morph/developer-resources/node-operation/upgrade-node/0-centralized-sequencer-upgrade.md

printf '\n--- SEARCH: go-ethereum mentions in upgrade docs ---\n'
rg -n "go-ethereum|morph-v2\.2\.4|v0\.6\.0|execution client|docker|build workflow|upgrade" docs/build-on-morph/developer-resources/node-operation/upgrade-node -S

printf '\n--- SEARCH: node v0.6.0 / morph-v2.2.4 references repo-wide ---\n'
rg -n "morph-v2\.2\.4|v0\.6\.0|go-ethereum" docs -S

Repository: morph-l2/morph-doc

Length of output: 16231


🏁 Script executed:

#!/bin/bash
set -euo pipefail

file="docs/build-on-morph/developer-resources/node-operation/upgrade-node/0-centralized-sequencer-upgrade.md"

# Show the full document with line numbers around the cited lines.
nl -ba "$file" | sed -n '1,120p'

printf '\n--- SEARCH IN FILE ---\n'
rg -n "go-ethereum|morph-v2\.2\.4|v0\.6\.0|Docker|image|binary|execution client|version check|check version|upgrade" "$file" -S

printf '\n--- REPO-WIDE RELATED REFERENCES ---\n'
rg -n "morph-v2\.2\.4|go-ethereum|execution client" docs -S

Repository: morph-l2/morph-doc

Length of output: 196


🌐 Web query:

"docs/build-on-morph/developer-resources/node-operation/upgrade-node/0-centralized-sequencer-upgrade.md go-ethereum morph-v2.2.4"

💡 Result:

The file path docs/build-on-morph/developer-resources/node-operation/upgrade-node/0-centralized-sequencer-upgrade.md refers to a documentation guide added to the Morph L2 ecosystem to assist node operators with specific upgrade procedures related to the network's sequencer architecture [1]. Regarding the context of morph-v2.2.4 and go-ethereum: 1. Evolution of the Sequencer: Morph has been actively transitioning from legacy PBFT-based consensus towards a Rollup-style sequencer architecture [2]. This involves moving away from centralized sequencing models [2]. 2. Release Context: The morph-v2.2.x series, specifically starting with the Jade upgrade (v2.2.0), introduced significant changes including the transition from zkTrie to MPT (Merkle Patricia Trie) and mandatory fork activations [3][4][5]. Subsequent patch releases like v2.2.3 focused on upstream synchronization with go-ethereum (v1.16.3 to v1.16.7), bug fixes, and stability improvements [6][4]. 3. Upgrade Guide Purpose: The specific file mentioned (0-centralized-sequencer-upgrade.md) was introduced to guide operators through the technical requirements for upgrading nodes in this environment [1]. Key aspects covered in such guides typically include in-place upgrade steps, mandatory environment variables (such as DERIVATION_VERIFY_MODE), and critical warnings to perform upgrades before designated consensus switch heights or fork activation times [1]. As of July 2026, Morph is transitioning toward a decentralized sequencer network, with significant consensus upgrades scheduled for late July 2026 [7]. Node operators should always consult the official Morph documentation and the latest release notes on the morph-l2/go-ethereum GitHub repository for the most accurate and version-specific configuration instructions [6][4].

Citations:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the related upgrade guides that handle geth explicitly.
for file in \
  docs/build-on-morph/developer-resources/node-operation/upgrade-node/1-upgrade-node-host.md \
  docs/build-on-morph/developer-resources/node-operation/upgrade-node/2-upgrade-node-docker.md
do
  printf '\n===== %s =====\n' "$file"
  sed -n '1,140p' "$file"
done

Repository: morph-l2/morph-doc

Length of output: 4113


Call out the go-ethereum upgrade here. The target release includes morph-v2.2.4, but the steps only mention updating the node image/binary. Add the geth image/binary bump and a version check here, or link directly to the host/Docker upgrade guide that does it.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@docs/build-on-morph/developer-resources/node-operation/upgrade-node/0-centralized-sequencer-upgrade.md`
at line 42, Update the centralized sequencer upgrade instructions to explicitly
include upgrading the go-ethereum/geth image or binary to morph-v2.2.4 or newer,
and add a corresponding version check or a direct link to the host/Docker
upgrade guide covering that step.


## If your node is already running

This is an **in-place upgrade** — your existing data is preserved, so there is no need to re-download a snapshot or resync. In most cases you simply swap the binary/image and restart.

:::caution Upgrade before the switch time
The network switches consensus from the Tendermint validator set to the centralized sequencer at a fixed L2 block **timestamp** built into the new release (see [Activation schedule](#activation-schedule) for the exact time per network). Upgrade in good time, before the chain reaches that timestamp, so your node follows the switch without interruption.
:::

Steps:

1. **Pull the updated node image / binary** — bump the `node` image tag in `morph-node/docker-compose.yml` (Docker), or pull the new source and `make build` (binary).
2. **Make sure `L1_BEACON_CHAIN_RPC` is set** in your env file (`morph-node/.env` or `.env_hoodi`). A former validator already has it; a plain full node that ran without it must add it now. No other variables need changing.
3. **Former validators:** nothing to change — the existing `--validator` flag still selects L1 derivation (it now aliases `DERIVATION_VERIFY_MODE=layer1`). For new setups, prefer `DERIVATION_VERIFY_MODE=layer1`. Plain full nodes need nothing here; the default is `local`.
4. **Restart the node** (it resumes from your existing data):

```bash
make stop-node && make run-node # mainnet (Docker)
make stop-node && make run-hoodi-node # Hoodi (Docker)
```
5. **Confirm it is following the chain** — see [Verify](#verify) below.

## Verify

Check sync status as usual (see [Run a full node → Verify the Node](../full-node/1-run-in-docker.md#verify-the-node)). Every node verifies batches against L1; if it detects a mismatch you will see a log line such as:

```
root hash or withdrawal hash is not equal originStateRootHash=0x... deriveStateRootHash=0x...
```
Comment thread
coderabbitai[bot] marked this conversation as resolved.
Outdated

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,6 @@ make stop-node
make run-node
```

If you are running a **validator**, use these commands instead:
```bash
make stop-validator
make run-validator
```

:::note
Ensure that the startup parameters for the Docker container remain consistent with your previous configuration. If you previously used a custom setup, verify that the configuration and directory paths match your earlier setup. For details, please refer to [**Advanced Usage**](../full-node/1-run-in-docker.md#advanced-usage)
:::

This file was deleted.

3 changes: 1 addition & 2 deletions sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -174,15 +174,14 @@ const NodeOperatorsSidebar = [
collapsed: false,
items: [
'build-on-morph/developer-resources/node-operation/full-node/run-in-docker',
'build-on-morph/developer-resources/node-operation/validator-node/run-in-docker',
],
},
{
type: 'category',
label: 'Upgrade Node',
collapsed: false,
items: [
'build-on-morph/developer-resources/node-operation/upgrade-node/zktrie-to-mpt-migration',
'build-on-morph/developer-resources/node-operation/upgrade-node/centralized-sequencer-upgrade',
'build-on-morph/developer-resources/node-operation/upgrade-node/upgrade-node-host',
'build-on-morph/developer-resources/node-operation/upgrade-node/upgrade-node-docker',
],
Expand Down