From 020111dcd7d573972e4d0374bdc8703d0612bda5 Mon Sep 17 00:00:00 2001 From: dkijania Date: Sun, 15 Mar 2026 20:41:11 +0100 Subject: [PATCH 01/45] Add Mesa upgrade overview with timeline, examples, and role-based guides Restructure the Mesa upgrade index page with: - End-to-end upgrade timeline with visual overview and milestone table - Per-phase breakdowns (pre-upgrade, state finalization, upgrade, post-upgrade) with actor-specific action tables - Collapsible role-based timeline views with schedule images - Upgrade mode summary (automode vs manual) with dispatcher limitation notes - Six collapsible walk-through examples covering all roles: - Block Producer automode (Debian), manual (Docker), manual (Debian) - Archive Node / Explorer operator - zkApp Developer - Exchange operator - Quick reference table linking each operator type to relevant pages Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/network-upgrades/mesa/appendix.mdx | 64 +++ docs/network-upgrades/mesa/index.mdx | 540 ++++++++++++++++++ .../mesa/preflight-network.mdx | 2 +- docs/network-upgrades/mesa/requirements.mdx | 67 +++ docs/network-upgrades/mesa/upgrade-modes.mdx | 85 +++ .../mesa/upgrade-steps/index.mdx | 190 ++++++ .../mesa/upgrade-steps/pre-upgrade.mdx | 237 ++++++++ .../mesa/upgrade-steps/state-finalization.mdx | 47 ++ .../mesa/upgrade-steps/upgrade.mdx | 44 ++ .../mesa/simplified-schedule-archive.png | Bin 0 -> 2304641 bytes .../mesa/simplified-schedule-echanges.png | Bin 0 -> 2325886 bytes .../mesa/simplified-schedule-manual.png | Bin 0 -> 2157226 bytes .../mesa/simplified-schedule.png | Bin 0 -> 1881580 bytes 13 files changed, 1275 insertions(+), 1 deletion(-) create mode 100644 docs/network-upgrades/mesa/appendix.mdx create mode 100644 docs/network-upgrades/mesa/index.mdx create mode 100644 docs/network-upgrades/mesa/requirements.mdx create mode 100644 docs/network-upgrades/mesa/upgrade-modes.mdx create mode 100644 docs/network-upgrades/mesa/upgrade-steps/index.mdx create mode 100644 docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx create mode 100644 docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx create mode 100644 docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx create mode 100644 static/img/network-upgrades/mesa/simplified-schedule-archive.png create mode 100644 static/img/network-upgrades/mesa/simplified-schedule-echanges.png create mode 100644 static/img/network-upgrades/mesa/simplified-schedule-manual.png create mode 100644 static/img/network-upgrades/mesa/simplified-schedule.png diff --git a/docs/network-upgrades/mesa/appendix.mdx b/docs/network-upgrades/mesa/appendix.mdx new file mode 100644 index 000000000..9ec8e106e --- /dev/null +++ b/docs/network-upgrades/mesa/appendix.mdx @@ -0,0 +1,64 @@ +--- +title: Appendix +sidebar_label: Appendix +hide_title: true +description: Mesa Upgrade Appendix +keywords: + - Mesa + - upgrade + - appendix +--- + +# Appendix + +## Upgrading archive nodes from Berkeley to Mesa + +Below we present details of what changed in the archive node database schema between Berkeley and Mesa versions. + +### Extended zkApp State Fields + +Both zkApp state tables have been modified to support additional state elements: + +**zkapp_states_nullable table** + - Added columns `element8` through `element31` (nullable integer fields) + - Each new column references `zkapp_field(id)` + - These fields allow zkApps to store additional state information beyond the original 8 elements + +```sql +ALTER TABLE zkapp_states_nullable ADD COLUMN IF NOT EXISTS element8 INT REFERENCES zkapp_field(id); +... +ALTER TABLE zkapp_states_nullable ADD COLUMN IF NOT EXISTS element31 INT REFERENCES zkapp_field(id); +``` + +**zkapp_states table** + - Added columns `element8` through `element31` (non-nullable integer fields) + - Each new column references `zkapp_field(id)` with a default value pointing to the zero field + - Unlike the nullable version, these fields are required and default to the zero field ID + +```sql +ALTER TABLE zkapp_states ADD COLUMN IF NOT EXISTS element8 INT DEFAULT NOT NULL REFERENCES zkapp_field(id); +... +ALTER TABLE zkapp_states ADD COLUMN IF NOT EXISTS element31 INT DEFAULT NOT NULL REFERENCES zkapp_field(id); +``` + +This expansion allows zkApps to store up to 31 state elements instead of the previous 8, significantly increasing the state storage capacity for complex smart contracts. + +### Version Tracking + +The upgrade introduces a new `version` table to keep track of the database schema version. The purpose of this table is to help with future database migrations. The table tracks which migration scripts were applied and when. + +**version table** +```sql +CREATE TABLE IF NOT EXISTS version ( + version_num INT PRIMARY KEY, + applied_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP +); +``` + +The version table provides: +- **Migration tracking**: Records which migrations have been applied +- **Timestamp tracking**: Shows when each migration was executed +- **Idempotency**: Prevents duplicate migration runs +- **Version identification**: Easily identify the current database schema version + +The table is created if it does not exist already. Rollback and upgrade scripts will insert a new row with the version number and timestamp when the script was applied. \ No newline at end of file diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx new file mode 100644 index 000000000..f31c10ba4 --- /dev/null +++ b/docs/network-upgrades/mesa/index.mdx @@ -0,0 +1,540 @@ +--- +title: Mesa Upgrade +sidebar_label: Mesa Upgrade +hide_title: true +description: Overview of the Mesa mainnet upgrade for Mina Protocol — expanded zkApp state, automode upgrades, and protocol improvements. +keywords: + - Mesa + - upgrade + - hard fork + - overview + - mainnet +--- + +# Mesa Upgrade + +The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible and requires all nodes to upgrade. + +Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases/tag/4.0.0). + +## What Mesa Introduces + +### Expanded zkApp State + +Mesa extends the on-chain state available to zkApps from 8 fields to 31 fields per account. This significantly increases the data capacity available to smart contracts, enabling more complex application logic without off-chain workarounds. + +### Automode Upgrades + +For the first time in Mina's history, node operators can upgrade through a hard fork **without manual intervention**. The automode mechanism ships both the pre-fork and post-fork binaries in a single package, with a dispatcher that automatically transitions to the new chain when the fork activates. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for details. + +### Simplified Archive Migration + +Unlike the Berkeley upgrade (which required up to 48 hours for archive migration), the Mesa archive upgrade is a fast schema migration that completes in under a minute. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). + +## Upgrade Flow — End-to-End Timeline + +The Mesa upgrade follows four phases. The timeline below shows what happens at each stage, when it happens, and what **you** need to do. + +### Overview + +Mesa upgrade timeline overview + +The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization**, **Upgrade**, and **Post-Upgrade** — anchored by three key moments: + +| Milestone | When | What happens | +|---|---|---| +| **stop-transaction-slot** | Hours before the fork | Network stops accepting new transactions | +| **stop-network-slot** | ~5 hours after stop-transaction-slot | Block production halts entirely | +| **Mesa genesis timestamp** | ~1 hour after Mesa release is published | First Mesa block is produced | + +--- + +### Phase 1: Pre-Upgrade — weeks before the fork + +> **Goal:** Every participant is prepared and running the stop-slot release before the fork begins. + +| Actor | What to do | +|---|---| +| **All operators** | Verify [hardware requirements](/network-upgrades/mesa/requirements) (32 GB RAM, 8-core CPU with AVX/BMI2). Back up keys. | +| **Block Producers** | Choose [upgrade mode](/network-upgrades/mesa/upgrade-modes): **automode** (recommended) or manual. Install stop-slot release [4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0). If automode, install both prefork and postfork packages. | +| **SNARK Workers** | Follow the same path as block producers (automode or manual). | +| **Archive Nodes** | Install stop-slot release. Choose migration method: _trustless_ (run migration script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | +| **Exchanges** | Install stop-slot release. Update integrations (mina-signer, Rosetta API). Test on devnet. Plan deposit/withdrawal freeze window. | +| **zkApp Developers** | Test your zkApp against the Mesa-compatible o1js version. Verify behavior before and after the upgrade on testnet. | + +:::tip Readiness checklist +Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pre-upgrade) to verify every item before proceeding. +::: + +--- + +### Phase 2: State Finalization — hours before the fork (~5 hours) + +> **Goal:** The network reaches consensus on a final state. No new transactions are accepted. + +At the predefined **stop-transaction-slot**, nodes stop accepting new user transactions. Block production continues for ~100 more slots with empty blocks (no coinbase, no fees) until the **stop-network-slot** to ensure all nodes converge on the same state. + +| Actor | What to do | +|---|---| +| **Block Producers** | **Keep your node running.** Block density during finalization is critical. Do not stop your node. | +| **SNARK Workers** | **Keep running.** Continue producing SNARK work. | +| **Archive Nodes** | Keep the archive node running to capture all finalized blocks. If doing trustless migration, run the upgrade script now if you haven't already. | +| **Exchanges** | **Disable MINA deposits and withdrawals.** Any transactions submitted after the stop-transaction-slot will not exist on the Mesa chain. | +| **zkApp Developers** | No action required. Monitor announcements. | + +:::danger For exchanges +Transactions submitted after the stop-transaction-slot **will not carry over** to the Mesa chain. Freeze all MINA activity before this point. +::: + +--- + +### Phase 3: Upgrade — fork day (network is down) + +> **Goal:** The network halts, state is exported, and the Mesa release is published. + +At the **stop-network-slot**, block production stops entirely. o1Labs exports the network state, builds the Mesa release with the final ledger baked in, and publishes packages and Docker images. + +| Actor | What to do | +|---|---| +| **Block Producers (automode)** | **Nothing.** Your node transitions to Mesa automatically. It will start producing blocks when the Mesa genesis timestamp arrives. | +| **Block Producers (manual)** | Stop your node. Wait for the Mesa release announcement. Install the new package. Restart with [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade). | +| **SNARK Workers** | Follow the same mode as your coordinator (automode = automatic, manual = reinstall and restart). | +| **Archive Nodes** | Install the Mesa archive node release. Point it at your migrated database (trustless) or import the o1Labs SQL dump into a fresh database (trustful). | +| **Exchanges** | Install the Mesa release. Keep deposits/withdrawals disabled until Mesa block production begins. | + +--- + +### Phase 4: Post-Upgrade — after the fork + +> **Goal:** Block production resumes on the Mesa network. Normal operations return. + +At approximately **1 hour** after the Mesa release is published, at the predefined Mesa genesis timestamp, the first Mesa block is produced. + +| Actor | What to do | +|---|---| +| **Block Producers** | Verify your node is on the Mesa chain (`mina-mesa client status`). If automode, check that the `activated` file exists in your config directory (see [Troubleshooting](/network-upgrades/mesa/upgrade-modes-details#how-do-i-know-which-binary-my-node-is-using)). Monitor block production. | +| **SNARK Workers** | Reconnect workers to the upgraded coordinator. Verify SNARK work is being produced. | +| **Archive Nodes** | Verify the archive database is in sync. Run [validation checks](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation). Fix any missing blocks using archive tooling. | +| **Exchanges** | **Re-enable MINA deposits and withdrawals** once block production is confirmed and your systems are verified. | +| **zkApp Developers** | Deploy and test your upgraded zkApps on mainnet. Take advantage of the expanded 31-field on-chain state. | + +--- + +### Timeline by Role + +Select your role to see a simplified view of what you need to do and when. + +
+Block Producers & SNARK Workers (automode) + +Automode upgrade timeline + +**Your upgrade is hands-free.** Install the stop-slot release weeks before the fork, keep your node running through state finalization, and the automode dispatcher handles the transition automatically. After the fork, verify your node is on the Mesa chain. + +
+ +
+Block Producers & SNARK Workers (manual mode) + +Manual upgrade timeline + +You must take action on fork day: stop your node after the network halts, install the Mesa release when published, and restart. You have until 290 blocks into the Mesa chain to complete the upgrade without missing your slots. + +
+ +
+Archive Node Operators + +Archive node upgrade timeline + +Choose your migration method early: +- **Trustless:** Run the archive upgrade script before the fork (it's backward-compatible). After the fork, point the Mesa archive node at your migrated DB. +- **Trustful:** Wait for the o1Labs SQL dump after the fork and import it into a fresh database. + +After the fork, verify data integrity and monitor the archive daemon. + +
+ +
+Exchanges & Service Providers + +Exchange upgrade timeline + +The critical action is timing your **deposit/withdrawal freeze**. Disable MINA activity before the stop-transaction-slot. Install the Mesa release on fork day. Re-enable deposits and withdrawals only after block production is confirmed and your integration is verified. + +
+ +For step-by-step instructions, see [Upgrade Steps](/network-upgrades/mesa/upgrade-steps). + +## Upgrade Modes + +There are two ways to upgrade your daemon node: + +- **[Automode](/network-upgrades/mesa/upgrade-modes) (Recommended):** The daemon handles the fork transition automatically. You install the stop-slot release and the node takes care of the rest — no manual intervention during the fork. +- **[Manual](/network-upgrades/mesa/upgrade-modes):** You manually stop your node after the network halts, install the Mesa release, and restart. This gives you full control. + +For in-depth technical details on the dispatcher and dual-binary architecture, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). + +:::caution Automode requires a process restart and persistent filesystem +When the fork activates, the automode daemon **shuts down cleanly** (exit code 0) after writing the Mesa configuration and an `activated` marker file to the config directory. It does **not** restart itself — your process manager must restart it. On restart, the dispatcher detects the `activated` file and launches the Mesa binary automatically. + +This means two things are required: +- **Persistent filesystem**: The config directory (e.g., `~/.mina-config` or the Docker volume at `/root/.mina-config`) **must survive across restarts**. If it is wiped, the `activated` file and generated Mesa config are lost, and the node cannot transition to Mesa. +- **Automatic restart policy**: Your process manager must be configured to restart the daemon after a clean exit: + - **systemd**: Use `Restart=always` in your service file (this is the default in the Mina systemd unit) + - **Docker**: Use `--restart=always` or `--restart=unless-stopped` when creating the container + - **Kubernetes / Helm**: Ensure your pod has `restartPolicy: Always` (the k8s default). If you use a custom `livenessProbe` or a Helm chart with its own restart logic, verify it does not treat exit code 0 as a failure that triggers a full volume wipe or pod replacement. +::: + +:::info Dispatcher limitation (current implementation) +The automode dispatcher only supports the `daemon` subcommand. Other subcommands (e.g., `mina client status`, `mina accounts list`, `mina ledger export`) will fail with an error. This is because, for non-daemon commands, the dispatcher does not have access to the config directory location and therefore cannot determine whether the node is running Berkeley or Mesa. It is the user's responsibility to invoke the correct version-specific binary directly: `mina-berkeley` or `mina-mesa` (or the full paths `/usr/lib/mina/berkeley/mina` and `/usr/lib/mina/mesa/mina`). This limitation may be removed in a future release. +::: + +--- + +### Upgrade Examples + +The examples below walk through the entire upgrade for different roles and setups. Each follows the same four phases. Click to expand. + +
+Example: Block Producer Upgrading with Automode (Debian) + +Imagine you are **Alice**, a block producer running on a Debian server. Here is what your upgrade looks like end to end. + +**Weeks before the fork** — Alice checks [hardware requirements](/network-upgrades/mesa/requirements) and installs the automode packages: + +```bash +sudo apt-get update +sudo apt-get install mina-mainnet-prefork-mesa=4.0.0 mina-mainnet-postfork-mesa=4.0.0 +``` + +She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. + +> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). + +**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for ~100 slots (~5 hours) until all nodes agree on the final state. + +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). + +**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Alice's daemon generates the Mesa configuration, writes the `activated` marker file, and **shuts down cleanly** (exit code 0). Because Alice uses systemd with `Restart=always`, the daemon restarts automatically. On restart, the dispatcher detects the `activated` file and launches the Mesa binary. Alice does **nothing** — this all happens automatically. + +> For what happens if you chose manual mode instead, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). For details on the restart mechanism, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements). + +**After the fork (Post-Upgrade)** — About 1 hour after the Mesa release is published, the first Mesa block is produced. Alice verifies: + +```bash +# Check if the activated file exists (path depends on your config directory and network ID) +ls ~/.mina-config/auto-fork-mesa-mainnet/activated + +# Confirm Mesa chain ID +mina-mesa client status +``` + +:::note Dispatcher and non-daemon commands +The automode dispatcher only supports the `daemon` subcommand — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `client status`, `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. +::: + +She's done. Her node is producing blocks on Mesa. + +> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
+ +
+Example: Block Producer — Manual Mode (Docker) + +**Carlos** runs a block producer using Docker and prefers manual control over the upgrade. + +**Weeks before the fork** — Carlos pulls the stop-slot Docker image and starts his node: + +```bash +docker pull minaprotocol/mina-daemon:4.0.0-bullseye-mainnet + +docker run --name mina -d \ + minaprotocol/mina-daemon:4.0.0-bullseye-mainnet \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --generate-genesis-proof true \ + --file-log-rotations 500 \ + --log-json +``` + +> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). + +**Hours before the fork (State Finalization)** — Carlos keeps his node running. He does **nothing** during this phase. + +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). + +**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Carlos waits for the Mesa release announcement, then swaps to the new image: + +```bash +docker stop mina && docker rm mina + +docker pull minaprotocol/mina-daemon:4.0.0-bullseye-mesa + +docker run --name mina -d \ + minaprotocol/mina-daemon:4.0.0-bullseye-mesa \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --generate-genesis-proof true \ + --file-log-rotations 500 \ + --log-json +``` + +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). + +**After the fork (Post-Upgrade)** — About 1 hour later, block production starts. Carlos verifies: + +```bash +docker exec mina mina client status # confirms Mesa chain ID +``` + +> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
+ +
+Example: Block Producer — Manual Mode (Debian) + +**Diana** runs a block producer on a Debian server using systemd and prefers to upgrade manually. + +**Weeks before the fork** — Diana installs the stop-slot release: + +```bash +sudo apt-get update +sudo apt-get install mina-mainnet=4.0.0 +``` + +She restarts her node via systemd and confirms it syncs. + +> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). + +**Hours before the fork (State Finalization)** — Diana keeps her node running. No action required. + +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). + +**Fork day (Upgrade)** — The network halts. Diana waits for the Mesa release announcement, then upgrades: + +```bash +sudo systemctl stop mina + +sudo apt-get update +sudo apt-get install mina-mainnet-mesa= + +# Restart with the same flags (libp2p key can be reused) +sudo systemctl start mina +``` + +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). + +**After the fork (Post-Upgrade)** — Block production resumes. Diana verifies: + +```bash +mina client status # confirms Mesa chain ID +``` + +> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
+ +
+Example: Archive Node / Explorer Operator + +**Eve** runs an archive node, a Rosetta API instance, and a block explorer. She needs to upgrade both the daemon and the database. + +**Weeks before the fork** — Eve installs the stop-slot release and decides on her migration method: + +```bash +sudo apt-get update +sudo apt-get install mina-mainnet=4.0.0 +``` + +She chooses the **trustless** path — running the migration script early, while her archive is still online: + +```bash +# Back up the database first +pg_dump -U archive_db > berkeley-archive-backup.sql + +# Download and run the upgrade script (completes in under 1 minute) +curl -O https://raw.githubusercontent.com/MinaProtocol/mina/refs/heads/mesa/src/app/archive/upgrade_to_mesa.sql +psql -U -d archive_db -f upgrade_to_mesa.sql + +# Verify +psql -U -d archive_db -c "SELECT * FROM version;" +``` + +The script is backward-compatible — her existing Berkeley archive node keeps working normally after the migration. + +> For the full archive migration guide, see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). + +**Hours before the fork (State Finalization)** — Eve keeps her archive node running to capture all finalized blocks. + +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). + +**Fork day (Upgrade)** — The network halts. Eve installs the Mesa archive release and points it at her already-migrated database: + +```bash +sudo systemctl stop mina-archive +sudo systemctl stop mina + +sudo apt-get update +sudo apt-get install mina-archive-mesa= mina-mainnet-mesa= + +# Start archive process pointing to the migrated DB +mina-archive run \ + --postgres-uri postgres://:@localhost:5432/archive_db \ + --server-port 3086 \ + --log-json --log-level DEBUG + +# Start the non-block-producing daemon connected to the archive +mina daemon \ + --archive-address localhost:3086 \ + --config-directory ~/.mina-config \ + --libp2p-keypair ~/keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --generate-genesis-proof true \ + --file-log-rotations 500 \ + --log-json +``` + +She also restarts Rosetta: + +```bash +docker run --name rosetta --rm -d \ + -p 3088:3088 \ + --entrypoint '' \ + minaprotocol/mina-rosetta:4.0.0-bullseye-mainnet \ + /usr/local/bin/mina-rosetta \ + --archive-uri "postgres://:@localhost:5432/archive_db" \ + --graphql-uri "http://localhost:3085/graphql" \ + --log-json --port 3088 +``` + +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). + +**After the fork (Post-Upgrade)** — Block production resumes. Eve verifies data integrity: + +```bash +# Check the archive is in sync +mina client status + +# Run the verification toolbox +mina-archive-hardfork-toolbox verify-upgrade \ + --postgres-uri postgres://:@localhost:5432/archive_db \ + --protocol-version \ + --migration-version +``` + +She checks her explorer UI to confirm new Mesa blocks are appearing and the historical data is intact. + +> For the full validation workflow, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) and the [Archive Hardfork Toolbox](/network-upgrades/mesa/archive-upgrade#verification-with-the-archive-hardfork-toolbox). + +
+ +
+Example: zkApp Developer + +**Frank** maintains a zkApp deployed on mainnet. His contract uses on-chain state and he wants to take advantage of Mesa's expanded 31-field state. + +**Weeks before the fork** — Frank updates his o1js dependency to the Mesa-compatible version and tests his zkApp on the [preflight network](/network-upgrades/mesa/preflight-network): + +```bash +npm install o1js@latest +``` + +He verifies that: +- His existing zkApp (compiled for Berkeley) still works unchanged on the preflight Mesa network +- Transactions deploy and execute correctly +- If he plans to use the expanded state fields (9–31), his new contract version compiles and deploys on preflight + +> For details on testing with the preflight network, see [Preflight Network](/network-upgrades/mesa/preflight-network). + +**Hours before the fork (State Finalization)** — Frank does **nothing**. His deployed zkApp keeps running on the Berkeley chain. No transactions can be submitted during this phase anyway. + +**Fork day (Upgrade)** — Frank does **nothing**. His existing zkApp state carries over to the Mesa chain automatically. All account state (including zkApp state fields 1–8) is preserved exactly as-is. + +**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank can now: + +```bash +# Deploy an updated version of his zkApp that uses the expanded state +zkapp deploy --network mainnet +``` + +If his zkApp does not need the new state fields, no redeployment is needed — it continues to work on Mesa without changes. + +> For post-upgrade details, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
+ +
+Example: Exchange Upgrading to Mesa + +**Bob** is an exchange operator. His main concern is avoiding lost deposits. + +**Weeks before the fork** — Bob tests his integration (Rosetta API, mina-signer) on the [preflight network](/network-upgrades/mesa/preflight-network). He reviews [schema changes](/network-upgrades/mesa/appendix) and installs the stop-slot release: + +```bash +sudo apt-get install mina-mainnet=4.0.0 +``` + +> For the full exchange pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). + +**Hours before the fork** — Before the _stop-transaction-slot_ arrives, Bob **disables MINA deposits and withdrawals** on his platform and notifies customers about the maintenance window. + +:::danger +Any transactions submitted after the stop-transaction-slot **will not exist on the Mesa chain**. This is the most critical step for exchanges. +::: + +**Fork day** — The network halts. Bob waits for the Mesa release announcement, then upgrades: + +```bash +sudo systemctl stop mina +sudo apt-get update +sudo apt-get install mina-mainnet-mesa= +sudo systemctl start mina +``` + +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). + +**After the fork** — Block production resumes. Bob verifies his node is on the Mesa chain, confirms Rosetta API is working, then **re-enables MINA deposits and withdrawals**. + +```bash +mina client status # verify Mesa chain ID +# test a small internal transfer before opening to customers +``` + +> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
+ +## Quick Reference by Operator Type + +| Operator Type | Key Pages | +|---|---| +| **Block Producers** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Modes](/network-upgrades/mesa/upgrade-modes), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **SNARK Workers / Coordinators** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Archive Node Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Rosetta API Operators** | [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Appendix](/network-upgrades/mesa/appendix) | + +## Network Details + +``` +Chain ID +a7351abc7ddf2ea92d1b38cc8e636c271c1dfd2c081c637f62ebc2af34eb7cc1 + +Git SHA-1 +ae112d3a96fe71b4ccccf3c54e7b7494db4898a4 + +Seed List +https://bootnodes.minaprotocol.com/networks/mainnet.txt + +Node build +https://github.com/MinaProtocol/mina/releases/tag/4.0.0 +``` diff --git a/docs/network-upgrades/mesa/preflight-network.mdx b/docs/network-upgrades/mesa/preflight-network.mdx index 9894f6a79..8e4faa6e4 100644 --- a/docs/network-upgrades/mesa/preflight-network.mdx +++ b/docs/network-upgrades/mesa/preflight-network.mdx @@ -107,7 +107,7 @@ docker run --name mina-mesa-preflight -d \ gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa \ daemon \ --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ - --libp2p-keypair /root/.mina-config/keys/libp2p-key + --libp2p-keypair /data/.mina-config/keys/libp2p-key ``` ### Example: Running with Debian Package diff --git a/docs/network-upgrades/mesa/requirements.mdx b/docs/network-upgrades/mesa/requirements.mdx new file mode 100644 index 000000000..ba03a1486 --- /dev/null +++ b/docs/network-upgrades/mesa/requirements.mdx @@ -0,0 +1,67 @@ +--- +title: Requirements +sidebar_label: Requirements +hide_title: true +description: Mesa upgrade is a major upgrade that requires all nodes in a network to upgrade to a newer version. It is not backward compatible. +keywords: + - Mesa + - upgrade + - hardware requirements +--- + +# Requirements + +## Hardware Requirements + +Please note the following are the hardware requirements for each node type after the upgrade: + +| Node Type | Memory | CPU | Storage | Network | +|--|--|--|--|--| +| Mina Daemon Node | 32 GB RAM | 8 core processor with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | +| SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| SNARK Worker | 32 GB RAM | 4 core/8 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | +| Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| Rosetta API standalone Docker image | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| Mina Seed Node | 64 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | + +## Mina Daemon Requirements + +### Installation + +:::caution + +If you have `mina-generate-keypair` installed, you will need to first `sudo apt remove mina-generate-keypair` before installing `mina-mainnet=4.0.0`. +The `mina-generate-keypair` binary is now installed as part of the mina-mainnet package. + +::: + +### IP and Port configuration + +**IP:** + +By default, the Mina Daemon will attempt to retrieve its public IP address from the system. If you are running the node behind a NAT or firewall, you can set the `--external-ip` flag to specify the public IP address. + +**Port:** + +Nodes must expose a port publicly to communicate with other peers. +Mina uses by default the port `8302` which is the default libp2p port. + +You can use a different port by setting the `--external-port` flag. + +### Node Auto-restart + +Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [auto-restart instructions](/node-operators/block-producer-node/connecting-to-the-network#start-a-mina-node-with-auto-restart-flows-using-systemd) + +## Seed Peer Requirements + +### Generation of libp2p keypair + +To ensure connectivity across the network, it is essential that all seed nodes start with the **same** `libp2p` keypair. +This consistency allows other nodes in the network to reliably connect. +Although the same libp2p keys can be reused from before the upgrade, if you need to manually generate new libp2p keys, use the following command: + +``` +mina libp2p generate-keypair --privkey-path +``` + +Further information on [generating key pairs](/node-operators/generating-a-keypair) on Mina Protocol. diff --git a/docs/network-upgrades/mesa/upgrade-modes.mdx b/docs/network-upgrades/mesa/upgrade-modes.mdx new file mode 100644 index 000000000..f1cbb08a8 --- /dev/null +++ b/docs/network-upgrades/mesa/upgrade-modes.mdx @@ -0,0 +1,85 @@ +--- +title: Upgrade Modes +sidebar_label: Upgrade Modes +hide_title: true +description: Automode and Manual upgrade paths for the Mesa hard fork. Automode handles the transition automatically for daemon nodes; Manual gives operators full control. +keywords: + - Mesa + - upgrade + - automode + - manual + - daemon +--- + +# Upgrade Modes + +The Mesa upgrade supports two modes for daemon node operators: **Automode** and **Manual**. Both modes run in parallel during the upgrade process and reach the same end state — a node running on the Mesa network. + +## Automode (Recommended) + +Automode is the recommended upgrade path for daemon nodes (block producers, SNARK coordinators). In automode, the node handles the entire fork transition automatically. + +### How it works + +1. You install the stop-slot release ([4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0)) during the Pre-Upgrade phase. +2. Your node participates normally in block production through the State Finalization phase. +3. When the network reaches the _stop-network-slot_, the node automatically: + - Stops producing blocks on the old chain + - Transitions to the Mesa network configuration + - Begins producing blocks on the Mesa network once the genesis timestamp is reached +4. No manual intervention is required during the fork. + +### Who should use Automode + +- Block producers who want a hands-off upgrade experience +- SNARK coordinators running daemon nodes +- Operators who want to minimize downtime and operational risk + +### Requirements + +- Install the stop-slot release ([4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0)) **before** the _stop-transaction-slot_ +- Ensure your node remains running through the State Finalization phase +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) + +:::info +Automode applies only to the daemon process. Archive nodes and Rosetta API instances require separate upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). +::: + +## Manual Mode + +Manual mode gives operators full control over each step of the upgrade process. + +### How it works + +1. You install the stop-slot release ([4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0)) during the Pre-Upgrade phase. +2. Your node participates normally through the State Finalization phase. +3. When the network halts at the _stop-network-slot_, you: + - Stop your node + - Wait for the Mesa release to be published + - Install the Mesa release + - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) +4. Your node begins participating in the Mesa network once the genesis timestamp is reached. + +### Who should use Manual mode + +- Operators who need full control over the upgrade process +- Operators with custom deployment pipelines that require explicit upgrade steps +- Operators who want to validate the Mesa build before restarting + +### Requirements + +- Install the stop-slot release ([4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0)) **before** the _stop-transaction-slot_ +- Be prepared to act promptly when the Mesa release is published to minimize downtime +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) + +## Comparison + +| Aspect | Automode | Manual | +|---|---|---| +| Operator intervention during fork | None | Stop, install, restart | +| Downtime | Minimal (automatic transition) | Depends on operator response time | +| Applies to | Daemon nodes only | All node types | +| Control | Automated | Full manual control | +| Risk | Lower (fewer manual steps) | Higher (depends on operator timing) | + +For in-depth technical details on how the upgrade mechanism works internally, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). diff --git a/docs/network-upgrades/mesa/upgrade-steps/index.mdx b/docs/network-upgrades/mesa/upgrade-steps/index.mdx new file mode 100644 index 000000000..b8584ade2 --- /dev/null +++ b/docs/network-upgrades/mesa/upgrade-steps/index.mdx @@ -0,0 +1,190 @@ +--- +title: Upgrade Steps +sidebar_label: Upgrade Steps +hide_title: true +description: Step-by-step Mesa upgrade instructions with per-role timelines and examples for block producers, SNARK workers, archive nodes, and exchanges. +keywords: + - Mesa + - upgrade + - steps + - phases + - block producer + - SNARK worker + - archive node + - exchange +--- + +# Upgrade Steps + +The Mesa upgrade proceeds through four sequential phases. Each phase has specific actions for different node operator types. + +| Phase | Description | +|---|---| +| [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade) | Prepare infrastructure, upgrade to the stop-slot release, run archive migration scripts | +| [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization) | 100-slot stabilization period — no new transactions accepted, block production continues | +| [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade) | Network halts, state is exported, Mesa build is published | +| [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | Block production resumes on Mesa, flags and configurations for the new network | + +**Please note:** A simplified Node Status service will be part of the upgrade tooling and enabled by default in the Pre-Upgrade release with stop-slots ([4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0)). This feature allows for a safe upgrade by monitoring the amount of upgraded active stake. Only non-sensitive data will be reported. If operators are not comfortable sharing their node version, they can disable the reports using the flag `--node-stats-type none`. + +Before proceeding, make sure you have reviewed the [Requirements](/network-upgrades/mesa/requirements) and chosen your [Upgrade Mode](/network-upgrades/mesa/upgrade-modes). + +--- + +## What You Need to Do — By Role + +### Block Producer (Automode — Recommended) + +This is the simplest path. You install one update and your node handles the rest. + +Block Producer Automode upgrade schedule: install 4.0.0 weeks before, keep node running during state finalization, node switches to Mesa automatically on fork day, monitor after + +**Example — Docker (automode):** +```bash +# Pre-Upgrade: switch to the auto-hardfork image +docker pull minaprotocol/mina-daemon-auto-hardfork:4.0.0-bullseye-mainnet + +docker run --name mina -d \ + minaprotocol/mina-daemon-auto-hardfork:4.0.0-bullseye-mainnet \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --generate-genesis-proof true \ + --file-log-rotations 500 \ + --log-json + +# That's it. Your node will automatically transition to Mesa at the fork. +# After the fork, verify it switched: +docker exec mina ls /root/.mina-config/auto-fork-mesa-mainnet/activated +docker exec mina mina-mesa client status +``` + +**Example — Debian (automode):** +```bash +# Pre-Upgrade: install both automode packages +sudo apt-get update +sudo apt-get install mina-mainnet-prefork-mesa=4.0.0 mina-mainnet-postfork-mesa=4.0.0 + +# Start your node as usual — the dispatcher routes to the correct binary +mina daemon \ + --block-producer-key ~/keys/my-wallet \ + --config-directory ~/.mina-config \ + --libp2p-keypair ~/keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --generate-genesis-proof true \ + --file-log-rotations 500 \ + --log-json + +# After the fork, verify: +ls ~/.mina-config/auto-fork-mesa-mainnet/activated # exists = Mesa is active +mina-mesa client status # should show Mesa chain +``` + +### Block Producer (Manual Mode) + +You control every step, but you need to act fast when the Mesa release is published. + +Block Producer Manual upgrade schedule: install 4.0.0 weeks before, keep node running during state finalization, stop node and install Mesa release on fork day, monitor after + +**Example — Docker (manual):** +```bash +# Pre-Upgrade: pull the stop-slot image and start your node +docker pull minaprotocol/mina-daemon:4.0.0-bullseye-mainnet + +docker run --name mina -d \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:4.0.0-bullseye-mainnet \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --generate-genesis-proof true \ + --file-log-rotations 500 \ + --log-json + +# Run your node normally until the network halts at stop-network-slot +# ... + +# Upgrade phase: once the Mesa release is published +docker stop mina && docker rm mina + +docker pull minaprotocol/mina-daemon:4.0.0-bullseye-mesa + +docker run --name mina -d \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:4.0.0-bullseye-mesa \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --generate-genesis-proof true \ + --file-log-rotations 500 \ + --log-json + +# After the fork, verify: +docker exec mina mina client status # should show Mesa chain +``` + +**Example — Debian (manual):** +```bash +# Pre-Upgrade: install the stop-slot release +sudo apt-get update +sudo apt-get install mina-mainnet=4.0.0 + +# Run your node normally until the network halts at stop-network-slot +# ... + +# Upgrade phase: once the Mesa release is published +sudo systemctl stop mina + +sudo apt-get update +sudo apt-get install mina-mainnet-mesa= + +# Restart with updated flags (see Post-Upgrade Flags page) +sudo systemctl start mina + +# After the fork, verify: +mina client status # should show Mesa chain +``` + +### SNARK Worker / Coordinator + +SNARK coordinators follow the same path as block producers (automode or manual). SNARK workers connect to a coordinator and do not need independent upgrades — they just need the coordinator to be on Mesa. + +The coordinator schedule is identical to the block producer schedule above — use [Automode](#block-producer-automode--recommended) or [Manual Mode](#block-producer-manual-mode) depending on your preference. After the coordinator transitions to Mesa, restart your SNARK workers and reconnect them to the coordinator. + +### Archive Node Operator + +Archive nodes do **not** support automode — they always require manual steps. You also need to handle the database migration. + +Archive Node upgrade schedule: install 4.0.0 and choose migration method weeks before, keep archive running during state finalization, point to migrated DB or import dump on fork day, verify data after + +See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) for detailed migration instructions. + +### Exchange + +Exchange upgrade schedule: test integration and install 4.0.0 weeks before, disable MINA deposits and withdrawals during state finalization, install Mesa release on fork day, re-enable deposits and verify after + +:::danger For exchanges +Any transactions submitted after the _stop-transaction-slot_ **will not exist on the Mesa chain**. Disable deposits and withdrawals **before** State Finalization begins and keep them disabled until block production resumes on Mesa. +::: diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx new file mode 100644 index 000000000..9293e3ffa --- /dev/null +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -0,0 +1,237 @@ +--- +title: Pre-Upgrade +sidebar_label: Pre-Upgrade +hide_title: true +description: Pre-upgrade preparation steps and readiness checklist for the Mesa hard fork, by operator type. +keywords: + - Mesa + - upgrade + - pre-upgrade + - preparation + - checklist +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Pre-Upgrade + +During the Pre-Upgrade phase, node operators prepare their infrastructure for the Mesa hard fork. Select your role below and work through each item on the checklist. + +## Readiness Checklist + + + + +#### Infrastructure + +
    +
  • Server meets hardware requirements — 32 GB RAM, 8-core CPU with AVX and BMI2
  • +
  • Port 8302 (or custom --external-port) is open and reachable from the internet
  • +
  • If behind NAT/firewall, --external-ip is set to your public IP
  • +
  • Node is configured for auto-restart (systemd or equivalent)
  • +
+ +#### Keys and Credentials + +
    +
  • Block producer key file is accessible and backed up
  • +
  • libp2p keypair is accessible (same key can be reused from before the upgrade)
  • +
  • If mina-generate-keypair is installed, remove it: sudo apt remove mina-generate-keypair
  • +
+ +#### Software Upgrade + +
    +
  • Chosen an upgrade mode: automode (recommended) or manual
  • +
  • Upgraded node to the current stable version (3.3.0)
  • +
  • Installed stop-slot release 4.0.0 before the stop-transaction-slot
  • +
  • If using automode: installed both mina-{network}-prefork-mesa and mina-{network}-postfork-mesa packages (or the auto-hardfork Docker image)
  • +
  • If using manual mode: installed mina-mainnet=4.0.0 (stop-slot release only)
  • +
+ +#### Verification + +
    +
  • Node is running and synced after the upgrade
  • +
  • Node status shows correct version: mina client status
  • +
+ +
+ + +#### Infrastructure + +
    +
  • Server meets hardware requirements — 32 GB RAM, 8-core CPU
  • +
  • Port 8302 (or custom --external-port) is open and reachable
  • +
  • Node is configured for auto-restart
  • +
+ +#### Keys + +
    +
  • libp2p keypair is accessible
  • +
  • If mina-generate-keypair is installed, remove it: sudo apt remove mina-generate-keypair
  • +
+ +#### Software Upgrade + +
    +
  • Chosen an upgrade mode: automode (recommended) or manual
  • +
  • Upgraded node to the current stable version (3.3.0)
  • +
  • Installed stop-slot release 4.0.0 before the stop-transaction-slot
  • +
  • If using automode: installed both prefork and postfork packages
  • +
  • If using manual mode: installed stop-slot release only
  • +
+ +#### Verification + +
    +
  • Node is running and synced
  • +
  • SNARK workers can connect to coordinator after upgrade
  • +
+ +
+ + +#### Infrastructure + + + +#### Connectivity + +
    +
  • Connected to a coordinator that is upgrading
  • +
  • No independent upgrade action needed — workers follow the coordinator
  • +
+ +:::info +SNARK workers do not need to install the stop-slot release independently. They connect to a SNARK coordinator, which handles the upgrade. Just ensure your coordinator is ready. +::: + +
+ + +#### Infrastructure + +
    +
  • Server meets hardware requirements — 32 GB RAM, 8-core CPU
  • +
  • Port 8302 (or custom --external-port) is open and reachable
  • +
  • Node is configured for auto-restart
  • +
  • If mina-generate-keypair is installed, remove it: sudo apt remove mina-generate-keypair
  • +
+ +#### Database Migration + +
    +
  • Chosen archive migration method: trustless or trustful
  • +
+ +**If trustless:** + +
    +
  • Downloaded and reviewed the upgrade script
  • +
  • Created a database backup: pg_dump -U <user> <db> > berkeley-archive-backup.sql
  • +
  • Ran the upgrade script (completes in under 1 minute)
  • +
  • Verified upgrade: psql -U <user> -d <db> -c "SELECT * FROM version;"
  • +
+ +**If trustful:** + +
    +
  • No action now — wait for o1Labs database export during the Upgrade phase
  • +
+ +#### Software Upgrade + +
    +
  • Upgraded node to the current stable version (3.3.0)
  • +
  • Installed stop-slot release 4.0.0 before the stop-transaction-slot
  • +
  • Archive node is running and capturing blocks
  • +
+ +
+ + +#### Prerequisites + +
    +
  • Complete the entire Archive Node checklist first (Rosetta depends on archive)
  • +
+ +#### Rosetta-Specific + +
    +
  • Reviewed the Rosetta Docker image version in Post-Upgrade flags
  • +
  • Verified current Rosetta API is functional against existing archive database
  • +
+ +
+ + +#### Infrastructure + +
    +
  • Server meets hardware requirements — 32 GB RAM, 8-core CPU
  • +
  • Node is configured for auto-restart
  • +
  • If mina-generate-keypair is installed, remove it: sudo apt remove mina-generate-keypair
  • +
+ +#### Integration Testing + +
    +
  • Tested system integration with Mesa features on the preflight network
  • +
  • Reviewed database schema changes in the Appendix (if using archive database directly)
  • +
+ +#### Software Upgrade + +
    +
  • Upgraded node to the current stable version (3.3.0)
  • +
  • Installed stop-slot release 4.0.0 before the stop-transaction-slot
  • +
+ +#### Operations Plan + +
    +
  • Plan in place to disable MINA deposits and withdrawals before stop-transaction-slot
  • +
  • Customer communication prepared for the maintenance window
  • +
+ +:::danger +Any transactions submitted after the _stop-transaction-slot_ **will not exist on the Mesa chain**. Disable deposits and withdrawals before State Finalization begins. +::: + +
+
+ +--- + +## Detailed Steps + +### Block Producers and SNARK Workers + +1. Provision servers that meet the minimum [hardware requirements](/network-upgrades/mesa/requirements), including 32 GB RAM and support for _AVX_ and _BMI2_ CPU instructions. +2. Upgrade nodes to node version [4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0), which has built-in stop slots. + +If you are using [Automode](/network-upgrades/mesa/upgrade-modes), no further action is needed until the [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) phase — your node will handle the transition automatically. + +### Archive Node Operators and Rosetta Operators + +Two upgrade processes are available: _trustless_ and _trustful_. If you want to perform the _trustless_ migration, follow the steps below; otherwise, proceed to the [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade) phase. The _trustful_ migration relies on o1Labs database exports and Docker images and doesn't require any actions at this stage. + +1. Trustless migration: + - Perform the archive node upgrade. Since Mainnet is a long-lived network, the upgrade process is a very fast operation and boils down to running the upgrade script against your archive. It should not take more than 1 minute, depending on your server specification and infrastructure. + - For more information on the archive node upgrade process, please refer to the [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) section. +2. Provision servers that meet the minimum hardware requirements, primarily 32 GB RAM. +3. Upgrade all nodes to the stop-slot release [4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0) before the pre-defined _stop-transaction-slot_. + +### Exchanges + +1. Make sure to test your system integration with Mesa's new features. Pay special attention to: + - If you rely on the archive node SQL database tables, please review the schema changes in the [Appendix](/network-upgrades/mesa/appendix). +2. Provision servers that meet the minimum hardware requirements, particularly 32 GB RAM. +3. Upgrade all nodes to the stop-slot release [4.0.0](https://github.com/MinaProtocol/mina/releases/tag/4.0.0) before the pre-defined _stop-transaction-slot_. diff --git a/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx b/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx new file mode 100644 index 000000000..a25698747 --- /dev/null +++ b/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx @@ -0,0 +1,47 @@ +--- +title: State Finalization +sidebar_label: State Finalization +hide_title: true +description: State finalization phase of the Mesa upgrade — stabilization period between stop-transaction-slot and stop-network-slot. +keywords: + - Mesa + - upgrade + - state finalization + - stop-transaction-slot + - stop-network-slot +--- + +# State Finalization + +Between the predefined _stop-transaction-slot_ and _stop-network-slot_, a stabilization period of 100 slots will occur. During this phase, the network consensus will not accept new blocks with transactions on them, including coinbase transactions. This means all blocks produced during this period will be completely empty — no user commands, no coinbase rewards, and no fee transfers. The state finalization period ensures all nodes reach a consensus on the latest network state before the upgrade. + +During the state finalization slots, it is crucial to maintain a high block density. Therefore, block producers and SNARK workers shall continue running their nodes to support the network's stability and security. + +Archive nodes should also continue to execute to ensure finalized blocks are in the database and can be migrated, preserving the integrity and accessibility of the network's history. + +## Block Producers and SNARK Workers + +1. It is crucial for the network's successful upgrade that all block producers and SNARK workers maintain their block-producing nodes up and running throughout the state finalization phase. +2. If you are running multiple daemons like is common with many operators, you can run one single node at this stage. +3. If you are a Delegation Program operator, remember that your uptime data will continue to be tracked during the state finalization phase and will be considered for the delegation grant in the following epoch. + +:::info +During this phase, both Automode and Manual mode operators simply keep their nodes running. No special action is needed regardless of your upgrade mode. +::: + +## Archive Node Operators and Rosetta Operators + +**If you plan to do the _trustful_ migration, you can skip this step.** + +If you are doing the trustless migration, then: + +1. Continue to execute the archive node to ensure finalized blocks are in the database. +2. Execute the archive node upgrade script, which is backward compatible. +3. Continue to run archive node until after the network stops at the stop-network slot. +4. For more information on the archive node upgrade process, please refer to the [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) section. + +## Exchanges + +Exchanges shall disable MINA deposits and withdrawals during the state finalization period (the period between _stop-transaction-slot_ and _stop-network-slot_) since any transactions after the _stop-transaction-slot_ will not be part of the upgraded chain. + +Remember that although you might be able to submit transactions, the majority of the block producers will be running a node that discards any blocks with transactions. diff --git a/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx new file mode 100644 index 000000000..9cfaa3d8f --- /dev/null +++ b/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx @@ -0,0 +1,44 @@ +--- +title: Upgrade +sidebar_label: Upgrade +hide_title: true +description: Upgrade phase of the Mesa hard fork — network halt, state export, and Mesa build publication. +keywords: + - Mesa + - upgrade + - network halt + - state export +--- + +# Upgrade + +Starting at the _stop-network-slot_ the network will not produce nor accept new blocks, resulting in halting the network. During the upgrade period, o1Labs will use automated tooling to export the network state based on the block at the slot just before the _stop-transaction-slot_. The exported state will then be baked into the new Mesa build, which will be used to initiate the upgraded network. It is during the upgrade window that the Mesa network infrastructure will be bootstrapped, and seed nodes will become available. o1Labs will also finalize the archive node migration and publish the PostgreSQL database dumps for import by the archive node operators who wish to bootstrap their archives in a trustful manner. + +There is a tool available to validate that the Mesa node was built from the pre-upgrade network state. To validate, follow the instructions provided in this [location](https://github.com/MinaProtocol/mina/blob/mesa/docs/upgrading-to-mesa.md). + +## Block Producers and SNARK Workers + +:::info +If you are using [Automode](/network-upgrades/mesa/upgrade-modes), your node handles this phase automatically. It will transition to the Mesa network without manual intervention. Skip to [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) for monitoring guidance. +::: + +If you are using **Manual mode**: + +1. During the upgrade phase (between _stop-network-slot_ and the publishing of the Mesa release), block producers can shut down their nodes. +2. After the publication of the Mesa node release, block producers and SNARK workers should upgrade their nodes and be prepared for block production at the genesis timestamp, which is the slot when the first Mesa block will be produced. +3. It is possible to continue using the same libp2p key after the upgrade. Remember to adjust the new flag to pass the libp2p key to the node. + +## Archive Node Operators and Rosetta Operators + +1. Upon publishing the archive node Mesa release, archive node operators and Rosetta operators should upgrade their systems. There will be both Docker images and archive node releases available to choose from. +2. Depending on the chosen migration method: + - _Trustless_ + - Operators should direct their Mesa archive process to the previously migrated database. + - _Trustful_ + - Operators shall import the SQL dump file provided by o1Labs to a freshly created database. + - Operators should direct their Mesa archive process to the newly created database. + +## Exchanges + +1. Exchanges shall disable MINA deposits and withdrawals during the entirety of the upgrade downtime, since the _stop-transaction-slot_ until the Mainnet Mesa network is operational. +2. After the Mesa releases are published, exchanges should upgrade their nodes and prepare for the new network to start block production. diff --git a/static/img/network-upgrades/mesa/simplified-schedule-archive.png b/static/img/network-upgrades/mesa/simplified-schedule-archive.png new file mode 100644 index 0000000000000000000000000000000000000000..2ca535939024a5a611e9df6e157c95758e3e877f GIT binary patch literal 2304641 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

H_?-*i^et)nt@0}zsm?nks(+I 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�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π=BFBfJE%Qof+P4*Jx=npU7kgS`HJCJPJRk7g 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%0DTDZNI^Ii(n_J3T$CX{=jG((eIw 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�gho!XlAGSiEu@}82=GMoVz#tpwVK-6#*}Eu{#^S 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

#### Database Upgrade @@ -8178,7 +8182,6 @@ SNARK workers do not need to install the stop-slot release independently. They c
  • Server meets hardware requirements — 32 GB RAM, 8-core CPU
  • Node is configured for auto-restart
  • -
  • If mina-generate-keypair is installed, remove it: sudo apt remove mina-generate-keypair
#### Integration Testing From b30661ea803611952e85ba9667f6d5516b3963a2 Mon Sep 17 00:00:00 2001 From: dkijania Date: Tue, 28 Apr 2026 10:48:41 +0200 Subject: [PATCH 19/45] Regenerate llms-full.txt after rebase onto latest main Co-Authored-By: Claude Opus 4.7 (1M context) --- static/llms-full.txt | 231 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 188 insertions(+), 43 deletions(-) diff --git a/static/llms-full.txt b/static/llms-full.txt index d4d1950bb..742e0336f 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -1559,7 +1559,7 @@ url: /glossary # Glossary -[A](#a) [B](#b) [C](#c) [D](#d) [E](#e) [F](#f) [G](#g) [H](#h) [I](#i) J [K](#k) [L](#l) [M](#m) [N](#n) [O](#o) +[A](#a) [B](#b) [C](#c) [D](#d) [E](#e) [F](#f) G [H](#h) [I](#i) J [K](#k) [L](#l) [M](#m) [N](#n) [O](#o) [P](#p) Q [R](#r) [S](#s) [T](#t) [U](#u) [V](#v) W X Y [Z](#z) Are you looking for a zero knowledge, o1js, zkApp, or Mina term that isn't here yet? To let us know, please [create an issue](https://github.com/o1-labs/docs2/issues) or click **EDIT THIS PAGE** to submit a PR. @@ -1633,7 +1633,7 @@ A node in the [transition frontier](#transition-frontier) that contains the exte ## C -### catch up +### catch up {#catchup} The final stage of the [syncing](#syncing) process where the node attempts to catch up to the current [best tip](#best-tip) by determining and then downloading all [transitions](#transition) between the transition frontier [root](#root-of-transition-frontier) and the current best tip. First, a node requests the missing transition hashes and a transaction chain proof. This proof proves the path provided is valid, for example, that the provided transition hashes lead from the root to the best tip. After the node has all transition hashes, it requests the full external transition for each transition hash from peers. @@ -2611,7 +2611,7 @@ If you want to send a transaction without running a node yourself, but by delega ### Using a Ledger device -To generate a signed transaction offline if your private key is on a Ledger device, see [Ledger Offline Mode](/using-mina/ledger-hardware-wallet#offline-mode). +To generate a signed transaction offline if your private key is on a Ledger device, see [Ledger Hardware Wallet](/using-mina/ledger-hardware-wallet). ### Using a keypair generated with the generate-keypair tool @@ -5281,7 +5281,7 @@ You can use a different port by setting the `--external-port` flag. ### Node Auto-restart -Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [auto-restart instructions](/node-operators/validator-node/connecting-to-the-network#start-a-mina-node-with-auto-restart-flows) +Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [auto-restart instructions](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service) ## Seed Peer Requirements @@ -5431,10 +5431,22 @@ url: /network-upgrades Mina Protocol evolves through network upgrades (hard forks). Each upgrade introduces new protocol features, performance improvements, or governance changes. Hard forks are not backward compatible — all node operators must upgrade before the fork activates. +:::tip Mesa preflight hard fork completed + +The Mesa preflight network hard-forked at **2026-04-27 13:00 UTC**. The post-fork chain is now running the Mesa release **`4.0.0-preflight-3f038cb`**, which raises the **transaction protocol version to 5.0.0**. + +Operators must run **`4.0.0-preflight-3f038cb`** to remain on the preflight network. Earlier builds — including the stop-slot release `4.0.0-preflight-stop-2967b39` — are no longer compatible with the post-fork chain. + +zkApp developers must update to **`o1js@3.0.0-mesa.698ca`**, which targets transaction protocol v5.0.0; earlier o1js releases will produce transactions that the post-fork network rejects. + +See [Preflight Network](/network-upgrades/mesa/preflight-network) for the full upgrade path. + +::: + | Upgrade | Status | Date | Key Changes | -|---|---|---|---| -| [Berkeley](/network-upgrades/berkeley) | Completed | June 2024 | Transitioned mainnet to the Berkeley proof system. Introduced zkApp programmability, recursive proofs, and a new transaction model. | -| [Mesa](/network-upgrades/mesa) | Upcoming | TBD | Expands zkApp state capacity, introduces automode upgrades, and adds protocol improvements. | +|---------|--------|------|-------------| +| [Berkeley](/network-upgrades/berkeley/requirements) | Completed | June 2024 | zkApp programmability, recursive proofs, new transaction model, archive database migration | +| [Mesa](/network-upgrades/mesa/preflight-network) | Preflight hard fork completed | 2026-04-27 13:00 UTC (preflight) | Transaction protocol v5.0.0, automode upgrades, simplified archive migration | --- url: /network-upgrades/mesa/appendix @@ -5502,15 +5514,21 @@ url: /network-upgrades/mesa/archive-upgrade This guide describes the general procedure for upgrading a Mina archive database from Berkeley to Mesa. The same steps apply to every Mesa deployment (preflight, devnet, mainnet) — only the archive package version differs. +:::tip Mesa preflight hard fork completed + +The Mesa preflight network hard-forked at **2026-04-27 13:00 UTC**. The post-fork chain runs **`4.0.0-preflight-3f038cb`**, which raises the **transaction protocol version to 5.0.0**. Pre-fork builds — including the stop-slot release `4.0.0-preflight-stop-2967b39` — are no longer compatible. + +When upgrading a preflight archive database, install the matching `mina-archive-mesa=4.0.0-preflight-3f038cb` package so the archive node speaks the new transaction protocol. + +::: + :::info Choosing the Mesa archive version The commands below use `` as a placeholder for the archive build you want to install. Substitute the tag that matches your target network: -- **Preflight network** — see [Preflight Network](./preflight-network) for the current pinned version (e.g. `4.0.0-preflight-stop-2967b39`). +- **Preflight network** — use `4.0.0-preflight-3f038cb` (post-hard-fork; transaction protocol v5.0.0). See [Preflight Network](./preflight-network) for the full release matrix. - **Devnet / mainnet** — use the Mesa release tag published for that network when it is announced. -If you are following the preflight hard-fork timeline (**2026-04-27 14:00 UTC**), see [Preflight Network](./preflight-network) for the build versions and the hard-fork notice. A dedicated upgrade-steps walkthrough will be linked here once it ships. - ::: To successfully upgrade the archive database to Mesa, you must ensure that your environment meets the foundational requirements. @@ -6432,13 +6450,15 @@ url: /network-upgrades/mesa/preflight-network The Mesa preflight network is a testing environment for validating the Mesa upgrade before deployment to devnet and mainnet. This network allows node operators and developers to test their infrastructure and applications with the new Mesa release. -:::warning Network Hard Fork — 2026-04-27 14:00 UTC +:::tip Mesa preflight hard fork completed + +The Mesa preflight network hard-forked at **2026-04-27 13:00 UTC**. The post-fork chain is now running the Mesa release **`4.0.0-preflight-3f038cb`**, which bumps the **transaction protocol version to 5.0.0**. -The Mesa preflight network will hard-fork on **2026-04-27 at 14:00 UTC**. A new stop-slot release, **`4.0.0-preflight-stop-2967b39`**, is now available and is **mandatory** for every operator running a Mesa node. +The transaction protocol bump is a breaking wire-format change: any node still running a pre-fork build (including the stop-slot release `4.0.0-preflight-stop-2967b39` and the original preflight build `4.0.0-preflight1-b649c79`) will reject the new transaction format and is no longer compatible with the network. Upgrade to **`4.0.0-preflight-3f038cb`** to resume participation. -Nodes still on the original preflight build (`4.0.0-preflight1-b649c79`) will fall off the network at the stop transaction slot (2026-04-27 10:00 UTC). Upgrade to `4.0.0-preflight-stop-2967b39` now — the same binary carries your node across the fork automatically. +zkApp developers must rebuild and redeploy against **`o1js@3.0.0-mesa.698ca`** — the first o1js release that targets transaction protocol v5.0.0. Transactions produced by earlier o1js versions will be rejected by post-fork nodes. -A dedicated **Upgrade Steps** page covering the full hard-fork timeline and per-role operator checklist will be linked from the Mesa Upgrade sidebar once it ships. +A dedicated **Upgrade Steps** page covering the post-fork operator checklist will be linked from the Mesa Upgrade sidebar once it ships. ::: @@ -6452,19 +6472,24 @@ The preflight network is intended for testing purposes only. This network may ex The Mesa preflight network uses the following build versions: -**Current version (install this):** `4.0.0-preflight-stop-2967b39` — stop-slot / hard-fork release. +**Current version (install this):** `4.0.0-preflight-3f038cb` — post-hard-fork release. Implements transaction protocol version **5.0.0** and is the only build compatible with the post-fork chain. + +**Compatible o1js release:** `o1js@3.0.0-mesa.698ca` — the matching SDK for transaction protocol v5.0.0. Install with `npm install o1js@3.0.0-mesa.698ca` (or the equivalent for your package manager) when developing or redeploying zkApps against the post-fork preflight network. + +**Previous versions (historical, do not install on new nodes):** -**Previous version (historical):** `4.0.0-preflight1-b649c79` — original preflight build. Kept here for reference only; do not install on new nodes. +- `4.0.0-preflight-stop-2967b39` — stop-slot release used to carry nodes up to the fork. Pre-fork transaction protocol; incompatible with the post-fork chain. +- `4.0.0-preflight1-b649c79` — original preflight build. Listed for reference only. ### Docker Images Docker images are available for both `amd64` and `arm64` architectures, on the `bookworm` and `noble` base distributions: -- **Mina Daemon:** `gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-stop-2967b39-bookworm-mesa` -- **Archive Node:** `gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-stop-2967b39-bookworm-mesa` -- **Rosetta:** `gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-stop-2967b39-bookworm-mesa` +- **Mina Daemon:** `gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa` +- **Archive Node:** `gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-3f038cb-bookworm-mesa` +- **Rosetta:** `gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-3f038cb-bookworm-mesa` -For `noble`, swap `bookworm` for `noble` in the tag (e.g. `mina-daemon:4.0.0-preflight-stop-2967b39-noble-mesa`). +For `noble`, swap `bookworm` for `noble` in the tag (e.g. `mina-daemon:4.0.0-preflight-3f038cb-noble-mesa`). ### Debian Packages @@ -6474,7 +6499,7 @@ Debian packages are available from the unstable repository: **Channel:** `preflight` **Codenames:** `bookworm`, `noble` -Available packages (each at version `4.0.0-preflight-stop-2967b39`): +Available packages (each at version `4.0.0-preflight-3f038cb`): - `mina-mesa` - `mina-archive-mesa` @@ -6502,7 +6527,7 @@ To start a Mina daemon node using Docker: docker run --name mina-mesa-preflight -d \ -p 8302:8302 \ --restart=always \ - gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-stop-2967b39-bookworm-mesa \ + gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa \ daemon \ --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt ``` @@ -6513,8 +6538,8 @@ For production deployments, you'll want to mount configuration directories and a docker run --name mina-mesa-preflight -d \ -p 8302:8302 \ --restart=always \ - -v $(pwd)/.mina-config:/data/.mina-config \ - gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-stop-2967b39-bookworm-mesa \ + -v $(pwd)/.mina-config:/root/.mina-config \ + gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa \ daemon \ --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ --libp2p-keypair /data/.mina-config/keys/libp2p-key @@ -6538,7 +6563,7 @@ echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) pref # Step 4: Update and install sudo apt-get update -sudo apt-get install -y mina-mesa=4.0.0-preflight-stop-2967b39 +sudo apt-get install -y mina-mesa=4.0.0-preflight-3f038cb ``` Then start the daemon: @@ -6582,7 +6607,7 @@ echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) pref # Step 4: Install mina-archive-mesa sudo apt-get update -sudo apt-get install -y mina-archive-mesa=4.0.0-preflight-stop-2967b39 +sudo apt-get install -y mina-archive-mesa=4.0.0-preflight-3f038cb # Step 5: Create PostgreSQL database sudo -u postgres createdb archive @@ -6603,7 +6628,7 @@ mina-archive run \ docker run --name mina-archive-mesa -d \ -p 3086:3086 \ --restart=always \ - gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-stop-2967b39-bookworm-mesa \ + gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-3f038cb-bookworm-mesa \ mina-archive run \ --postgres-uri postgresql://archive_user:your-secure-password@postgres-host:5432/archive \ --server-port 3086 @@ -6639,7 +6664,7 @@ echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) pref # Step 4: Install mina-rosetta-mesa sudo apt-get update -sudo apt-get install -y mina-rosetta-mesa=4.0.0-preflight-stop-2967b39 +sudo apt-get install -y mina-rosetta-mesa=4.0.0-preflight-3f038cb # Step 5: Start Rosetta # Rosetta connects to both the mina daemon and archive node @@ -6655,7 +6680,7 @@ mina-rosetta \ docker run --name mina-rosetta-mesa -d \ -p 3087:3087 \ --restart=always \ - gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-stop-2967b39-bookworm-mesa \ + gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-3f038cb-bookworm-mesa \ --port 3087 \ --archive-uri http://archive-host:3086/graphql \ --graphql-uri http://mina-daemon-host:3085/graphql @@ -10107,7 +10132,7 @@ As an example for calculating staking service payouts, we recommend taking a loo ## Odds of Winning a Block -Blocks in Mina are produced within distinct time intervals called "slots". Each account in the ledger has a chance of winning each slot on the network, which allows them to produce a block for that slot (or, in the case of delegation, allows the delegated account to produce a block on their behalf). An account computes a random number (via a [Verifiable Random Function, or VRF](/glossary#vrf)) for each slot, and compares that random number against a required threshold to determine if they have "won" that slot and can produce a block at that time. Their chance of winning a slot is thus determined by the threshold, which is a function of their relative stake in the network. +Blocks in Mina are produced within distinct time intervals called "slots". Each account in the ledger has a chance of winning each slot on the network, which allows them to produce a block for that slot (or, in the case of delegation, allows the delegated account to produce a block on their behalf). An account computes a random number (via a [Verifiable Random Function, or VRF](/glossary#verifiable-random-function-vrf)) for each slot, and compares that random number against a required threshold to determine if they have "won" that slot and can produce a block at that time. Their chance of winning a slot is thus determined by the threshold, which is a function of their relative stake in the network. The stake distribution that is sampled when determining the VRF threshold are contained in a special ledger called the "staking ledger". Staking ledgers are fixed ledgers from past epochs in the network (epochs are fixed spans of slots; every epoch is 7140 slots long). Using past fixed ledgers prevents malicious stakers from increasing their chances of winning during an epoch by altering the distribution of stake on the main ledger (the "staged ledger"). Every epoch, the staking ledger changes. Due to this constraint, any account on the system can only check for "winning slots" within the next 2 epochs at any given time. @@ -10634,6 +10659,126 @@ FILE_LOG_LEVEL=Debug #### Need any help? Post your questions in the [#Delegation-Program](https://discord.gg/ywDzwmGABT) channel on Discord. +--- +url: /node-operators/downgrading-to-older-versions +--- + +# Downgrading to Older Versions + +If you are running a Mina node on a version above 3.3.0 and need to roll back to 3.3.0 or below, you can convert the on-disk state in place using `mina-storage-converter`. This avoids a full rebootstrap from a remote S3 ledger bucket, which can save significant time. + +## When is downgrading needed? + +Downgrading is typically necessary when a fork fails and there is a RocksDB version bump between the stop slot release and the pre-stop slot release. In such cases, the development team will notify node operators that a downgrade is required to continue operating on the correct chain. + +## Debian/Ubuntu + +### 1. Stop the Mina daemon + +Ensure your Mina node is fully shut down before proceeding: + +```sh +mina client stop daemon +``` + +Or however you normally stop your node process. Verify it is no longer running before continuing. + +### 2. Install storage toolbox packages + +Install the required toolbox packages that provide `mina-storage-converter` and the RocksDB scanners: + +```sh +sudo apt-get install -y mina-daemon-storage-toolbox mina-daemon-recovery-storage-toolbox +``` + +### 3. Convert on-disk state + +Run `mina-storage-converter` to convert the local database to the format expected by the older version. + +```sh +mina-storage-converter \ + --node-dir ${NODE_DIR} \ + --current-scanner /usr/lib/mina/storage/*/${SOURCE_VERSION}/mina-rocksdb-scanner \ + --stable-scanner /usr/lib/mina/storage/*/${TARGET_VERSION}/mina-rocksdb-scanner +``` + +Where: + +- `NODE_DIR` is the path to your node's config directory. This is usually `~/.mina-config` if you haven't set it explicitly. +- `SOURCE_VERSION` is the version you are downgrading from. +- `TARGET_VERSION` is the version you are downgrading to (e.g. `3.3.0`). + +The `*` wildcard lets bash resolve the RocksDB version directory automatically, so you don't need to know which RocksDB version is bundled with each Mina release. + +The tool will prompt for confirmation before making changes. + +### 4. Install the target version + +Install the older Mina package. For example, to install 3.3.0: + +```sh +sudo apt-get install --allow-downgrades -y mina-mainnet=3.3.0 +``` + +### 5. Start the Mina daemon + +Start your node as usual: + +```sh +mina daemon ${YOUR_EXTRA_DAEMON_ARGS_HERE} +``` + +Your node should resume from the converted local state without needing to rebootstrap. + +## Docker + +On-disk state conversion is only possible if your `mina-config` directory is persisted as a volume outside the container (e.g. via `--mount "type=bind,source=$(pwd)/.mina-config,dst=/root/.mina-config"`). + +:::caution + +If your `mina-config` is not persisted outside of the container, there is no way to convert the on-disk state. You will need to rebootstrap from scratch after switching to the older image. + +::: + +Since the Docker image is a Debian/Ubuntu environment with the Mina Debian package installed, you can run the same conversion steps inside the container. The default `NODE_DIR` inside the container is `/root/.mina-config`. + +### 1. Stop the running container + +Assume your mina daemon container is running with name `mina-node` + +```sh +docker stop mina-node +``` + +### 2. Install toolbox packages and run the converter + +Use the current (newer) image to install the toolbox packages and run the conversion against your mounted `mina-config` volume: + +```sh +docker run -it --rm \ + --entrypoint bash \ + --mount "type=bind,source=$(pwd)/.mina-config,dst=/root/.mina-config" \ + minaprotocol/mina-daemon:${SOURCE_VERSION}-bullseye-mainnet \ + -c "apt-get update && apt-get install -y mina-daemon-storage-toolbox mina-daemon-recovery-storage-toolbox && mina-storage-converter --node-dir /root/.mina-config --current-scanner /usr/lib/mina/storage/*/${SOURCE_VERSION}/mina-rocksdb-scanner --stable-scanner /usr/lib/mina/storage/*/${TARGET_VERSION}/mina-rocksdb-scanner" +``` + +### 3. Start a new container with the target version + +Remove the old container and start with the target image: + +```sh +docker rm mina-node + +docker run --name mina-node -d \ + -p 8302:8302 \ + --restart=always \ + --mount "type=bind,source=$(pwd)/.mina-config,dst=/root/.mina-config" \ + minaprotocol/mina-daemon:${TARGET_VERSION}-bullseye-mainnet \ + daemon ${YOUR_EXTRA_DAEMON_ARGS_HERE} +``` + +Your node should resume from the converted local state without needing to rebootstrap. + --- url: /node-operators/faq --- @@ -13459,8 +13604,8 @@ If the node crashes quickly and repeatably, this is likely a configuration issue If you start the mina daemon in the foreground, once you detach from it, it will shut down (via a SIGINT signal). To run the process in the background so that you may detach, you have many options: - Start the daemon with the `-background` flag. -- Run as a systemd service (see [the docs](/node-operators/validator-node/connecting-to-the-network#start-a-mina-node-with-auto-restart-flows)). -- Run with Docker (see [the docs](/node-operators/validator-node/connecting-to-the-network#start-a-mina-node-with-auto-restart-flows)). +- Run as a systemd service (see [the docs](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service)). +- Run with Docker (see [the docs](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service)). - Run the daemon in a terminal multiplexer such as screen or [tmux](https://icohigh.gitbook.io/mina-node-testnet/english/setting-up-tmux) that you can detach from to keep the process running. Running as a service / via Docker is recommended as they have the advantage of automated restarts if your node crashes. @@ -65010,7 +65155,7 @@ Since this code extends `SmartContract` that has its own initialization to perfo Then, `this.num.set(Field(3))` initializes the on-chain state `num` to a value of `3`. -You can optionally specify permissions. See [setPermissions](/zkapps/o1js-reference/classes/SmartContract#setpermissions) in the o1js Reference documentation. +You can optionally specify permissions. See [setPermissions](/zkapps/o1js-reference/classes/SmartContract) in the o1js Reference documentation. Finally, this code adds the `update()` function: @@ -66699,7 +66844,7 @@ There are 255 Fields in a private key and 256 Fields in a signature. If you are ## Struct -You can create your own compound data types with the special [Struct](../o1js-reference#struct) type. +You can create your own compound data types with the special [Struct](../o1js-reference/functions/Struct) type. Define a Struct as one or more data types that o1js understands. For example, Field, higher-order types built into o1js based on Field, or other Struct types defined by you. You can also define methods on your Struct to act upon this data type. @@ -66746,10 +66891,10 @@ points8 Fields: {"points":[{"x":"0","y":"0"},{"x":"1","y":"10"},{"x":"2","y":"20 Two functions help do control flow in o1js: -- [Provable.if](../o1js-reference/classes/Circuit#if) +- Provable.if Similar to a ternary in JavaScript -- [Provable.switch](../o1js-reference/classes/Circuit#switch) +- Provable.switch Similar to a switch case statement in JavaScript You can write conditionals inside o1js with these functions. @@ -68671,7 +68816,7 @@ Each [AccountUpdate](/zkapps/o1js-reference/classes/AccountUpdate) class has the - `Preconditions`: Conditions that must be true for the account update to be applied. Corresponds to assertions in an o1js method. - `Updates`: Things changed by the account update, such as including the zkApp state, permissions, and verification key. - `BalanceChange`: Any changes to the balance -- `Authorization`: How the zkApp is authorized; must be a proof (corresponding to the verification key on the account), a signature, or none. See [Authorizations](/zkapps/writing-a-zkapp/introduction-to-zkapps/interact-with-mina#authorizations). +- `Authorization`: How the zkApp is authorized; must be a proof (corresponding to the verification key on the account), a signature, or none. See [Interacting With Mina](/zkapps/writing-a-zkapp/introduction-to-zkapps/interact-with-mina). Other `AccountUpdate` components are available to use, but are not covered in this tutorial: @@ -70076,7 +70221,7 @@ url: /zkapps/writing-a-zkapp/feature-overview/fetch-events-and-actions # How to Fetch Events and Actions -[Events](#events) and [Actions](#actions-and-reducer) are two distinct mechanisms for logging information alongside a transaction: +Events and Actions are two distinct mechanisms for logging information alongside a transaction: - Events are not meant for use within proofs directly, as they can't be predicated on inside proofs. Events are used to signal to UIs. You can also use events for reconstructing Merkle trees. @@ -70355,7 +70500,7 @@ url: /zkapps/writing-a-zkapp/feature-overview/on-chain-values # On-Chain Values -In a zkApp, you can access the current [on-chain state](/zkapps/writing-a-zkapp/introduction-to-zkapps/how-to-write-a-zkapp#on-chain-state) and many other on-chain values of the account. +In a zkApp, you can access the current [on-chain state](/zkapps/writing-a-zkapp/introduction-to-zkapps/how-to-write-a-zkapp) and many other on-chain values of the account. The zkApp account's on-chain state can be updated by account updates included in a transaction (see [Tutorial 10: Account Updates](/zkapps/tutorials/account-updates)). On the Mina blockchain, each zkApp account provides eight fields of ~32 bytes each of arbitrary storage for the on-chain state. @@ -71364,8 +71509,8 @@ You can start writing zkApps with just a few steps. The focus of this Getting St 1. [Create a project](#2-create-a-project) 1. [Add testing code](#3-add-testing-code) 1. [Add functionality](#4-add-functionality) -1. [Create an integration test](#5-create-an-integration-test) -1. [Test locally](#6-test-with-local-simulated-blockchain) +1. [Create an integration test](#5-create-integration-test) +1. [Test locally](#6-test-locally) 1. [Test with Lightnet](#7-test-with-lightnet) 1. [Test with a live network](#8-test-with-a-live-network) @@ -71480,7 +71625,7 @@ Add the logic for your smart contract. zk deploy ``` -### 8. Test with a live network +### 8. Test with a live network {#8-test-with-a-live-network} To deploy the smart contract to the Testnet, run the `zk` commands from the directory that contains your smart contract. @@ -71560,7 +71705,7 @@ To deploy the smart contract to the Testnet, run the `zk` commands from the dire node build/src/interact.js ``` -1. Keep building and experimenting! After you add features to your contract, repeat [7. Test with a live network](#7-test-with-a-live-network) to test with a live network. +1. Keep building and experimenting! After you add features to your contract, repeat [8. Test with a live network](#8-test-with-a-live-network) to test with a live network. ## Learn more From ce05b32daaf17a05ca1d93f94684a9d00093ee08 Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 29 Apr 2026 21:52:46 +0200 Subject: [PATCH 20/45] Address remaining PR #1133 review comments and regen llms-full.txt MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - appendix.mdx, glossary.mdx: correct "31 elements/fields" → 32 to match Mesa's 32-field zkApp state expansion (indexes 0–31). Addresses yamimaio's and glyh's comments on element counts. - glossary.mdx: add new "Automode Image" entry that defines the `mina-daemon-auto-hardfork` Docker image using already-defined terms (automode, dispatcher, pre/post-fork binary). Update inline references in upgrade-modes-details.mdx, upgrade-steps/index.mdx, and upgrade-steps/pre-upgrade.mdx to use "automode image" / link to the glossary anchor. Addresses SanabriaRusso's comment that "auto-hardfork image" was an undefined term. - glossary.mdx: add "Mesa Package Naming Convention" entry explaining why Debian packages and Docker codenames carry the `-mesa` suffix (side-by-side install during transition). Add an inline note in the Debian manual upgrade example pointing to the new glossary entry. Addresses glyh's comment asking why the suffix is needed. - requirements.mdx, upgrade-steps/pre-upgrade.mdx: bump SNARK Worker CPU from 4 core/8 thread to 6 core/12 thread per worker, per Cris-F. - index.mdx, upgrade-steps/state-finalization.mdx: replace "migrated database" / "can be migrated" with upgrade-oriented wording per glyh's request to avoid the migration term for what is a simple schema upgrade. Regenerate static/llms-full.txt to match. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/appendix.mdx | 2 +- docs/network-upgrades/mesa/glossary.mdx | 12 +++++- docs/network-upgrades/mesa/index.mdx | 2 +- docs/network-upgrades/mesa/requirements.mdx | 2 +- .../mesa/upgrade-modes-details.mdx | 4 +- .../mesa/upgrade-steps/index.mdx | 11 +++++- .../mesa/upgrade-steps/pre-upgrade.mdx | 4 +- .../mesa/upgrade-steps/state-finalization.mdx | 2 +- static/llms-full.txt | 39 +++++++++++++------ 9 files changed, 54 insertions(+), 24 deletions(-) diff --git a/docs/network-upgrades/mesa/appendix.mdx b/docs/network-upgrades/mesa/appendix.mdx index 9ec8e106e..510359627 100644 --- a/docs/network-upgrades/mesa/appendix.mdx +++ b/docs/network-upgrades/mesa/appendix.mdx @@ -41,7 +41,7 @@ ALTER TABLE zkapp_states ADD COLUMN IF NOT EXISTS element8 INT DEFAULT NOT NULL REFERENCES zkapp_field(id); ``` -This expansion allows zkApps to store up to 31 state elements instead of the previous 8, significantly increasing the state storage capacity for complex smart contracts. +This expansion allows zkApps to store up to 32 state elements instead of the previous 8, significantly increasing the state storage capacity for complex smart contracts. ### Version Tracking diff --git a/docs/network-upgrades/mesa/glossary.mdx b/docs/network-upgrades/mesa/glossary.mdx index a3ff77d34..cb4653e4c 100644 --- a/docs/network-upgrades/mesa/glossary.mdx +++ b/docs/network-upgrades/mesa/glossary.mdx @@ -68,9 +68,13 @@ The recommended upgrade path for daemon nodes (block producers, SNARK coordinato The traditional upgrade path where operators manually stop their node after the network halts, install the [Mesa release](#mesa-release), and restart. This gives full control over every step but requires prompt action when the release is published. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes). +### Automode Image {#automode-image} + +The Docker image that bundles the [automode](#automode) runtime — both the [pre-fork](#pre-fork-binary) and [post-fork binary](#post-fork-binary), plus the [dispatcher](#dispatcher). Published as `minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network}`. Use this image when running automode in Docker. The companion image `minaprotocol/mina-daemon-hardfork` is the manual-mode equivalent (no dispatcher). + ### Pre-Fork Binary {#pre-fork-binary} -The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is packaged as `mina-{network}-prefork-mesa` and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the automode image (`mina-daemon-auto-hardfork`) includes this binary. +The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is packaged as `mina-{network}-prefork-mesa` and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the [automode image](#automode-image) includes this binary. ### Post-Fork Binary {#post-fork-binary} @@ -114,7 +118,11 @@ The official ledger checkpoint published with the [Mesa release](#mesa-release). ### Expanded zkApp State -Mesa increases the on-chain state available to zkApps from 8 fields to 31 fields per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See the [Appendix](/network-upgrades/mesa/appendix) for schema details. +Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See the [Appendix](/network-upgrades/mesa/appendix) for schema details. + +### Mesa Package Naming Convention + +Mesa Debian packages are published with a `-mesa` suffix (e.g., `mina-mainnet-mesa`, `mina-archive-mesa`) to distinguish them from the existing Berkeley packages (`mina-mainnet`, `mina-archive`). This allows operators to install both packages side-by-side during the transition window without one replacing the other. Docker images use a `-mesa` codename suffix for the same reason (e.g., `minaprotocol/mina-daemon:-bullseye-mesa`). ### Node Status Service diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 9a97d8b97..08c02e0cd 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -103,7 +103,7 @@ At the **stop-network-slot**, block production stops entirely. o1Labs exports th | **Block Producers (automode)** | **Nothing.** Your node transitions to Mesa automatically. It will start producing blocks when the Mesa genesis timestamp arrives. | | **Block Producers (manual)** | Stop your node. Wait for the Mesa release announcement. Install the new package. Restart with [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade). | | **SNARK Workers** | Follow the same mode as your coordinator (automode = automatic, manual = reinstall and restart). | -| **Archive Nodes** | Install the Mesa archive node release. Point it at your migrated database (trustless) or import the o1Labs SQL dump into a fresh database (trustful). | +| **Archive Nodes** | Install the Mesa archive node release. Point it at your upgraded database (trustless) or import the o1Labs SQL dump into a fresh database (trustful). | | **Exchanges** | Install the Mesa release. Keep deposits/withdrawals disabled until Mesa block production begins. | --- diff --git a/docs/network-upgrades/mesa/requirements.mdx b/docs/network-upgrades/mesa/requirements.mdx index e2f3ea660..850dbb20f 100644 --- a/docs/network-upgrades/mesa/requirements.mdx +++ b/docs/network-upgrades/mesa/requirements.mdx @@ -19,7 +19,7 @@ Please note the following are the hardware requirements for each node type after |--|--|--|--|--| | Mina Daemon Node | 32 GB RAM | 8 core processor with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| SNARK Worker | 32 GB RAM | 4 core/8 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | +| SNARK Worker | 32 GB RAM | 6 core/12 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Rosetta API standalone Docker image | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Mina Seed Node | 64 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | diff --git a/docs/network-upgrades/mesa/upgrade-modes-details.mdx b/docs/network-upgrades/mesa/upgrade-modes-details.mdx index c5dbc2edc..0ee84b216 100644 --- a/docs/network-upgrades/mesa/upgrade-modes-details.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes-details.mdx @@ -54,7 +54,7 @@ The automode release ships with **two complete sets of Mina binaries** in a sing | **Post-fork binary** (`mina-{network}-postfork-mesa`) | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | | **Dispatcher** (`mina-dispatch`) | `/usr/local/bin/mina-dispatch` | Routes your commands to the correct binary | -When you install the automode package (or use the auto-hardfork Docker image), all three components are installed together. +When you install the automode package (or use the [automode Docker image](/network-upgrades/mesa/glossary#automode-image)), all three components are installed together. ### The Dispatcher @@ -154,7 +154,7 @@ If your Helm chart or pod spec uses `emptyDir` for the config directory, the `ac ### Automode Docker Image -If you run your node with Docker, use the **auto-hardfork** image: +If you run your node with Docker, use the **automode** image (`mina-daemon-auto-hardfork`): ``` minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} diff --git a/docs/network-upgrades/mesa/upgrade-steps/index.mdx b/docs/network-upgrades/mesa/upgrade-steps/index.mdx index ebe8dbac9..98d4ce232 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/index.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/index.mdx @@ -45,7 +45,7 @@ This is the simplest path. You install one update and your node handles the rest **Example — Docker (automode):** ```bash -# Pre-Upgrade: switch to the auto-hardfork image +# Pre-Upgrade: switch to the automode image docker pull minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet docker run --name mina -d \ @@ -154,8 +154,15 @@ sudo apt-get install mina-mainnet-mesa= # Restart with updated flags (see Post-Upgrade Flags page) sudo systemctl start mina +``` -# After the fork, verify: +:::note Why `-mesa` in the package name? +The `-mesa` suffix distinguishes Mesa packages from the existing Berkeley packages (`mina-mainnet`), so both can be installed side-by-side during the transition. See [Mesa Package Naming Convention](/network-upgrades/mesa/glossary#mesa-package-naming-convention). +::: + +After the fork, verify the chain: + +```bash mina client status # should show Mesa chain ``` diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx index 1c71b7ca7..cf9282611 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -45,7 +45,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th
  • Chosen an upgrade mode: automode (recommended) or manual
  • Upgraded node to the current stable version
  • Installed stop-slot release 3.x.x before the stop-transaction-slot
  • -
  • If using automode: installed both mina-{network}-prefork-mesa and mina-{network}-postfork-mesa packages (or the auto-hardfork Docker image)
  • +
  • If using automode: installed both mina-{network}-prefork-mesa and mina-{network}-postfork-mesa packages (or the automode Docker image)
  • If using manual mode: installed mina-mainnet=3.x.x (stop-slot release only)
  • @@ -96,7 +96,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th #### Infrastructure #### Connectivity diff --git a/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx b/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx index c98a612e8..aacefc8d6 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx @@ -17,7 +17,7 @@ Between the predefined _stop-transaction-slot_ and _stop-network-slot_, a stabil During the state finalization slots, it is crucial to maintain a high block density. Therefore, block producers and SNARK workers shall continue running their nodes to support the network's stability and security. -Archive nodes should also continue to execute to ensure finalized blocks are in the database and can be migrated, preserving the integrity and accessibility of the network's history. +Archive nodes should also continue to execute to ensure finalized blocks are in the database and can be carried over to the upgraded schema, preserving the integrity and accessibility of the network's history. ## Block Producers and SNARK Workers diff --git a/static/llms-full.txt b/static/llms-full.txt index 742e0336f..d2d739454 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5484,7 +5484,7 @@ ALTER TABLE zkapp_states ADD COLUMN IF NOT EXISTS element8 INT DEFAULT NOT NULL REFERENCES zkapp_field(id); ``` -This expansion allows zkApps to store up to 31 state elements instead of the previous 8, significantly increasing the state storage capacity for complex smart contracts. +This expansion allows zkApps to store up to 32 state elements instead of the previous 8, significantly increasing the state storage capacity for complex smart contracts. ### Version Tracking @@ -5852,9 +5852,13 @@ The recommended upgrade path for daemon nodes (block producers, SNARK coordinato The traditional upgrade path where operators manually stop their node after the network halts, install the [Mesa release](#mesa-release), and restart. This gives full control over every step but requires prompt action when the release is published. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes). +### Automode Image {#automode-image} + +The Docker image that bundles the [automode](#automode) runtime — both the [pre-fork](#pre-fork-binary) and [post-fork binary](#post-fork-binary), plus the [dispatcher](#dispatcher). Published as `minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network}`. Use this image when running automode in Docker. The companion image `minaprotocol/mina-daemon-hardfork` is the manual-mode equivalent (no dispatcher). + ### Pre-Fork Binary {#pre-fork-binary} -The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is packaged as `mina-{network}-prefork-mesa` and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the automode image (`mina-daemon-auto-hardfork`) includes this binary. +The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is packaged as `mina-{network}-prefork-mesa` and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the [automode image](#automode-image) includes this binary. ### Post-Fork Binary {#post-fork-binary} @@ -5898,7 +5902,11 @@ The official ledger checkpoint published with the [Mesa release](#mesa-release). ### Expanded zkApp State -Mesa increases the on-chain state available to zkApps from 8 fields to 31 fields per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See the [Appendix](/network-upgrades/mesa/appendix) for schema details. +Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See the [Appendix](/network-upgrades/mesa/appendix) for schema details. + +### Mesa Package Naming Convention + +Mesa Debian packages are published with a `-mesa` suffix (e.g., `mina-mainnet-mesa`, `mina-archive-mesa`) to distinguish them from the existing Berkeley packages (`mina-mainnet`, `mina-archive`). This allows operators to install both packages side-by-side during the transition window without one replacing the other. Docker images use a `-mesa` codename suffix for the same reason (e.g., `minaprotocol/mina-daemon:-bullseye-mesa`). ### Node Status Service @@ -6000,7 +6008,7 @@ At the **stop-network-slot**, block production stops entirely. o1Labs exports th | **Block Producers (automode)** | **Nothing.** Your node transitions to Mesa automatically. It will start producing blocks when the Mesa genesis timestamp arrives. | | **Block Producers (manual)** | Stop your node. Wait for the Mesa release announcement. Install the new package. Restart with [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade). | | **SNARK Workers** | Follow the same mode as your coordinator (automode = automatic, manual = reinstall and restart). | -| **Archive Nodes** | Install the Mesa archive node release. Point it at your migrated database (trustless) or import the o1Labs SQL dump into a fresh database (trustful). | +| **Archive Nodes** | Install the Mesa archive node release. Point it at your upgraded database (trustless) or import the o1Labs SQL dump into a fresh database (trustful). | | **Exchanges** | Install the Mesa release. Keep deposits/withdrawals disabled until Mesa block production begins. | --- @@ -7014,7 +7022,7 @@ Please note the following are the hardware requirements for each node type after |--|--|--|--|--| | Mina Daemon Node | 32 GB RAM | 8 core processor with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| SNARK Worker | 32 GB RAM | 4 core/8 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | +| SNARK Worker | 32 GB RAM | 6 core/12 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Rosetta API standalone Docker image | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Mina Seed Node | 64 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | @@ -7096,7 +7104,7 @@ The automode release ships with **two complete sets of Mina binaries** in a sing | **Post-fork binary** (`mina-{network}-postfork-mesa`) | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | | **Dispatcher** (`mina-dispatch`) | `/usr/local/bin/mina-dispatch` | Routes your commands to the correct binary | -When you install the automode package (or use the auto-hardfork Docker image), all three components are installed together. +When you install the automode package (or use the [automode Docker image](/network-upgrades/mesa/glossary#automode-image)), all three components are installed together. ### The Dispatcher @@ -7196,7 +7204,7 @@ If your Helm chart or pod spec uses `emptyDir` for the config directory, the `ac ### Automode Docker Image -If you run your node with Docker, use the **auto-hardfork** image: +If you run your node with Docker, use the **automode** image (`mina-daemon-auto-hardfork`): ``` minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} @@ -7470,7 +7478,7 @@ This is the simplest path. You install one update and your node handles the rest **Example — Docker (automode):** ```bash -# Pre-Upgrade: switch to the auto-hardfork image +# Pre-Upgrade: switch to the automode image docker pull minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet docker run --name mina -d \ @@ -7579,8 +7587,15 @@ sudo apt-get install mina-mainnet-mesa= # Restart with updated flags (see Post-Upgrade Flags page) sudo systemctl start mina +``` -# After the fork, verify: +:::note Why `-mesa` in the package name? +The `-mesa` suffix distinguishes Mesa packages from the existing Berkeley packages (`mina-mainnet`), so both can be installed side-by-side during the transition. See [Mesa Package Naming Convention](/network-upgrades/mesa/glossary#mesa-package-naming-convention). +::: + +After the fork, verify the chain: + +```bash mina client status # should show Mesa chain ``` @@ -8078,7 +8093,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th
  • Chosen an upgrade mode: automode (recommended) or manual
  • Upgraded node to the current stable version
  • Installed stop-slot release 3.x.x before the stop-transaction-slot
  • -
  • If using automode: installed both mina-{network}-prefork-mesa and mina-{network}-postfork-mesa packages (or the auto-hardfork Docker image)
  • +
  • If using automode: installed both mina-{network}-prefork-mesa and mina-{network}-postfork-mesa packages (or the automode Docker image)
  • If using manual mode: installed mina-mainnet=3.x.x (stop-slot release only)
  • @@ -8129,7 +8144,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th #### Infrastructure #### Connectivity @@ -8275,7 +8290,7 @@ Between the predefined _stop-transaction-slot_ and _stop-network-slot_, a stabil During the state finalization slots, it is crucial to maintain a high block density. Therefore, block producers and SNARK workers shall continue running their nodes to support the network's stability and security. -Archive nodes should also continue to execute to ensure finalized blocks are in the database and can be migrated, preserving the integrity and accessibility of the network's history. +Archive nodes should also continue to execute to ensure finalized blocks are in the database and can be carried over to the upgraded schema, preserving the integrity and accessibility of the network's history. ## Block Producers and SNARK Workers From 24ca649874f5fd9c12fdfd92f3e0c985a15398ba Mon Sep 17 00:00:00 2001 From: dkijania Date: Sat, 2 May 2026 10:12:04 +0200 Subject: [PATCH 21/45] Address remaining PR #1133 review feedback - zkApp redeployment: clarify that every zkApp must be redeployed on Mesa because the protocol version bump invalidates Berkeley verification keys (Frank example + Pre/Post-Upgrade tables) - Drop -mesa suffix from standard packages and Docker tags; keep it only on automode prefork/postfork variants; pare glossary entry to match - Use mina client status throughout post-upgrade and examples now that the dispatcher supports it - SNARK coordinator path narrowed to manual mode in upgrade-steps - Revert temporary requirements.mdx storage/CPU changes pending cross-page coordination Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/glossary.mdx | 2 +- docs/network-upgrades/mesa/index.mdx | 38 ++++----- .../mesa/upgrade-steps/index.mdx | 24 +++--- .../mesa/upgrade-steps/post-upgrade.mdx | 16 ++-- .../mesa/upgrade-steps/pre-upgrade.mdx | 2 +- static/llms-full.txt | 82 +++++++++---------- 6 files changed, 78 insertions(+), 86 deletions(-) diff --git a/docs/network-upgrades/mesa/glossary.mdx b/docs/network-upgrades/mesa/glossary.mdx index cb4653e4c..24245d421 100644 --- a/docs/network-upgrades/mesa/glossary.mdx +++ b/docs/network-upgrades/mesa/glossary.mdx @@ -122,7 +122,7 @@ Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0 ### Mesa Package Naming Convention -Mesa Debian packages are published with a `-mesa` suffix (e.g., `mina-mainnet-mesa`, `mina-archive-mesa`) to distinguish them from the existing Berkeley packages (`mina-mainnet`, `mina-archive`). This allows operators to install both packages side-by-side during the transition window without one replacing the other. Docker images use a `-mesa` codename suffix for the same reason (e.g., `minaprotocol/mina-daemon:-bullseye-mesa`). +The [automode](#automode) Debian packages are published with a `-mesa` suffix (`mina-{network}-prefork-mesa`, `mina-{network}-postfork-mesa`) to distinguish the dual-binary automode variants from the standard manual-mode `mina-{network}` package. This allows operators to install the automode packages side-by-side with the existing daemon without one replacing the other. ### Node Status Service diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 08c02e0cd..d0c1a65a3 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -64,7 +64,7 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* | **SNARK Workers** | Follow the same path as block producers (automode or manual). | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | | **Exchanges** | Install stop-slot release. Update integrations (mina-signer, Rosetta API). Test on devnet. Plan deposit/withdrawal freeze window. | -| **zkApp Developers** | Test your zkApp against the Mesa-compatible o1js version. Verify behavior before and after the upgrade on testnet. | +| **zkApp Developers** | Update to the Mesa-compatible o1js version, recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. | :::tip Readiness checklist Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pre-upgrade) to verify every item before proceeding. @@ -116,11 +116,11 @@ At approximately **1 hour** after the Mesa release is published, at the predefin | Actor | What to do | |---|---| -| **Block Producers** | Verify your node is on the Mesa chain (`mina-mesa client status`). If automode, check that the `activated` file exists in your config directory (see [Troubleshooting](/network-upgrades/mesa/upgrade-modes-details#how-do-i-know-which-binary-my-node-is-using)). Monitor block production. | +| **Block Producers** | Verify your node is on the Mesa chain (`mina client status`). If automode, check that the `activated` file exists in your config directory (see [Troubleshooting](/network-upgrades/mesa/upgrade-modes-details#how-do-i-know-which-binary-my-node-is-using)). Monitor block production. | | **SNARK Workers** | Reconnect workers to the upgraded coordinator. Verify SNARK work is being produced. | | **Archive Nodes** | Verify the archive database is in sync. Run [validation checks](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation). Fix any missing blocks using archive tooling. | | **Exchanges** | **Re-enable MINA deposits and withdrawals** once block production is confirmed and your systems are verified. | -| **zkApp Developers** | Deploy and test your upgraded zkApps on mainnet. Take advantage of the expanded 32-field on-chain state. | +| **zkApp Developers** | **Redeploy every zkApp** on Mesa — the protocol version bump invalidates Berkeley verification keys, so a redeploy is required before any zkApp can accept transactions. You can also take advantage of the expanded 32-field on-chain state at this point. | --- @@ -191,7 +191,7 @@ This means two things are required: ::: :::info Dispatcher limitation (current implementation) -The automode dispatcher only supports the `daemon` subcommand. Other subcommands (e.g., `mina client status`, `mina accounts list`, `mina ledger export`) will fail with an error. This is because, for non-daemon commands, the dispatcher does not have access to the config directory location and therefore cannot determine whether the node is running Berkeley or Mesa. It is the user's responsibility to invoke the correct version-specific binary directly: `mina-berkeley` or `mina-mesa` (or the full paths `/usr/lib/mina/berkeley/mina` and `/usr/lib/mina/mesa/mina`). This limitation may be removed in a future release. +The automode dispatcher only supports the `daemon` subcommand and `mina client status` command. Other subcommands (e.g. `mina accounts list`, `mina ledger export`) will fail with an error. This is because, for non-daemon commands, the dispatcher does not have access to the config directory location and therefore cannot determine whether the node is running Berkeley or Mesa. It is the user's responsibility to invoke the correct version-specific binary directly: `mina-berkeley` or `mina-mesa` (or the full paths `/usr/lib/mina/berkeley/mina` and `/usr/lib/mina/mesa/mina`). This limitation may be removed in a future release. ::: --- @@ -209,7 +209,7 @@ Imagine you are **Alice**, a block producer running on a Debian server. Here is ```bash sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=3.x.x +sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x ``` She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. @@ -231,11 +231,11 @@ She starts her node normally. The automode dispatcher runs the pre-fork binary u ls ~/.mina-config/auto-fork-mesa-mainnet/activated # Confirm Mesa chain ID -mina-mesa client status +mina client status ``` :::note Dispatcher and non-daemon commands -The automode dispatcher only supports the `daemon` subcommand — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `client status`, `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. +The automode dispatcher only supports the `daemon` subcommand and `client status` command — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. ::: She's done. Her node is producing blocks on Mesa. @@ -279,10 +279,10 @@ docker run --name mina -d \ ```bash docker stop mina && docker rm mina -docker pull minaprotocol/mina-daemon:-bullseye-mesa +docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ - minaprotocol/mina-daemon:-bullseye-mesa \ + minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ --block-producer-key /keys/my-wallet \ --config-directory /root/.mina-config \ @@ -331,7 +331,7 @@ She restarts her node via systemd and confirms it syncs. sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-mainnet-mesa= +sudo apt-get install mina-mainnet=4.x.x # Restart with the same flags (libp2p key can be reused) sudo systemctl start mina @@ -390,7 +390,7 @@ sudo systemctl stop mina-archive sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-archive-mesa= mina-mainnet-mesa= +sudo apt-get install mina-archive-mainnet=4.x.x mina-mainnet=4.x.x # Start archive process pointing to the upgraded DB mina-archive run \ @@ -455,24 +455,24 @@ npm install o1js@latest ``` He verifies that: -- His existing zkApp (compiled for Berkeley) still works unchanged on the preflight Mesa network -- Transactions deploy and execute correctly -- If he plans to use the expanded state fields (indexes `8–31`), his new contract version compiles and deploys on preflight +- His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network +- Transactions execute end-to-end against the redeployed contract +- If he plans to use the expanded state fields (indexes `8–31`), his updated contract version compiles and deploys on preflight > For details on testing with the preflight network, see [Preflight Network](/network-upgrades/mesa/preflight-network). **Hours before the fork (State Finalization)** — Frank does **nothing**. His deployed zkApp keeps running on the Berkeley chain. No transactions can be submitted during this phase anyway. -**Fork day (Upgrade)** — Frank does **nothing**. His existing zkApp state carries over to the Mesa chain automatically. All account state (including zkApp state fields at indexes `0–7`) is preserved exactly as-is. +**Fork day (Upgrade)** — Frank does **nothing during the network halt**. His zkApp account and on-chain state values carry over to the Mesa chain automatically (including state fields at indexes `0–7`). However, the verification key generated for Berkeley is no longer valid under the Mesa protocol — the contract cannot process transactions on Mesa until it is redeployed. -**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank can now: +**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank **must redeploy his zkApp** before it can accept transactions, regardless of whether he uses the new state fields: ```bash -# Deploy an updated version of his zkApp that uses the expanded state +# Required for every zkApp — the Mesa protocol version bump invalidates the Berkeley verification key zkapp deploy --network mainnet ``` -If his zkApp does not need the new state fields, no redeployment is needed — it continues to work on Mesa without changes. +If he is also adopting the expanded `8–31` state slots, this same deployment step ships the updated contract version that declares the new fields. > For post-upgrade details, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). @@ -502,7 +502,7 @@ Any transactions submitted after the stop-transaction-slot **will not exist on t ```bash sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-mainnet-mesa= +sudo apt-get install mina-mainnet=4.x.x sudo systemctl start mina ``` diff --git a/docs/network-upgrades/mesa/upgrade-steps/index.mdx b/docs/network-upgrades/mesa/upgrade-steps/index.mdx index 98d4ce232..51757386a 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/index.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/index.mdx @@ -62,14 +62,14 @@ docker run --name mina -d \ # That's it. Your node will automatically transition to Mesa at the fork. # After the fork, verify it switched: docker exec mina ls /root/.mina-config/auto-fork-mesa-mainnet/activated -docker exec mina mina-mesa client status +docker exec mina mina client status ``` **Example — Debian (automode):** ```bash -# Pre-Upgrade: install both automode packages +# Pre-Upgrade: install both prefork and postfork packages sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=3.x.x +sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x # Start your node as usual — the dispatcher routes to the correct binary mina daemon \ @@ -81,9 +81,9 @@ mina daemon \ --file-log-rotations 500 \ --log-json -# After the fork, verify: +# After the network halts, verify: ls ~/.mina-config/auto-fork-mesa-mainnet/activated # exists = Mesa is active -mina-mesa client status # should show Mesa chain +mina client status # should show Mesa chain ``` ### Block Producer (Manual Mode) @@ -119,11 +119,11 @@ docker run --name mina -d \ # Upgrade phase: once the Mesa release is published docker stop mina && docker rm mina -docker pull minaprotocol/mina-daemon:-bullseye-mesa +docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon:-bullseye-mesa \ + minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ --block-producer-key /keys/my-wallet \ --config-directory /root/.mina-config \ @@ -150,16 +150,12 @@ sudo apt-get install mina-mainnet=3.x.x sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-mainnet-mesa= +sudo apt-get install mina-mainnet=4.x.x # Restart with updated flags (see Post-Upgrade Flags page) sudo systemctl start mina ``` -:::note Why `-mesa` in the package name? -The `-mesa` suffix distinguishes Mesa packages from the existing Berkeley packages (`mina-mainnet`), so both can be installed side-by-side during the transition. See [Mesa Package Naming Convention](/network-upgrades/mesa/glossary#mesa-package-naming-convention). -::: - After the fork, verify the chain: ```bash @@ -168,9 +164,9 @@ mina client status # should show Mesa chain ### SNARK Worker / Coordinator -SNARK coordinators follow the same path as block producers (automode or manual). SNARK workers connect to a coordinator and do not need independent upgrades — they just need the coordinator to be on Mesa. +SNARK coordinators follow the same path as manual block producers. SNARK workers connect to a coordinator and do not need independent upgrades — they just need the coordinator to be on Mesa. -The coordinator schedule is identical to the block producer schedule above — use [Automode](#block-producer-automode--recommended) or [Manual Mode](#block-producer-manual-mode) depending on your preference. After the coordinator transitions to Mesa, restart your SNARK workers and reconnect them to the coordinator. +The coordinator schedule is identical to the block producer schedule above — use [Manual Mode](#block-producer-manual-mode) depending on your preference. After the coordinator transitions to Mesa, restart your SNARK workers and reconnect them to the coordinator. ### Archive Node Operator diff --git a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx index a92b5acbf..4b75868ed 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx @@ -32,8 +32,8 @@ This page helps you **verify your node is healthy** and running on the Mesa chai # If using automode, check the activation file exists ls ~/.mina-config/auto-fork-mesa-mainnet/activated -# Check node status (use mina-mesa if running automode packages) -mina-mesa client status +# Check node status +mina client status ``` You should see: @@ -45,7 +45,7 @@ You should see: ```bash # Check that your node is at the tip of the Mesa chain and is producing blocks -mina-mesa client status | grep -E "^(Block height|Block producers running|Coinbase receiver):" +mina client status | grep -E "^(Block height|Block producers running|Coinbase receiver):" ``` Expected output looks like: @@ -56,8 +56,6 @@ Block producers running: 1 (B62qjZ8yh17dCiEyu2WDCVWLreGCAr Coinbase receiver: Block producer ``` -If `mina-mesa` is not on `$PATH` (for example, when running from a Docker image without the automode wrapper), invoke `mina client status` instead, or call it directly inside the container: - ```bash docker exec mina client status | grep -E "^(Block height|Block producers running|Coinbase receiver):" ``` @@ -80,7 +78,7 @@ docker logs mina --since 1h 2>&1 | grep -i error #### 1. Confirm the coordinator is on Mesa ```bash -mina-mesa client status +mina client status ``` Verify **Sync status** is `Synced` and the **Chain ID** matches Mesa. @@ -89,7 +87,7 @@ Verify **Sync status** is `Synced` and the **Chain ID** matches Mesa. ```bash # Check that workers are producing proofs -mina-mesa client status | grep -i snark +mina client status | grep -i snark ``` If workers were disconnected during the fork, restart them and reconnect to the coordinator: @@ -101,13 +99,15 @@ mina internal snark-worker \ --daemon-address : ``` +Note: above command does not work on mina automode dispatcher. You need to explicitly use mina-mesa binary + #### 1. Confirm the daemon and archive process are running ```bash -mina-mesa client status +mina client status ``` Verify **Sync status** is `Synced`. diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx index cf9282611..220981b6d 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -26,7 +26,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th #### Infrastructure
      -
    • Server meets hardware requirements — 32 GB RAM, 8-core CPU with AVX and BMI2
    • +
    • Server meets hardware requirements
    • Port 8302 (or custom --external-port) is open and reachable from the internet
    • If behind NAT/firewall, --external-ip is set to your public IP
    • Node is configured for auto-restart (systemd or equivalent)
    • diff --git a/static/llms-full.txt b/static/llms-full.txt index d2d739454..730dea138 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5906,7 +5906,7 @@ Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0 ### Mesa Package Naming Convention -Mesa Debian packages are published with a `-mesa` suffix (e.g., `mina-mainnet-mesa`, `mina-archive-mesa`) to distinguish them from the existing Berkeley packages (`mina-mainnet`, `mina-archive`). This allows operators to install both packages side-by-side during the transition window without one replacing the other. Docker images use a `-mesa` codename suffix for the same reason (e.g., `minaprotocol/mina-daemon:-bullseye-mesa`). +The [automode](#automode) Debian packages are published with a `-mesa` suffix (`mina-{network}-prefork-mesa`, `mina-{network}-postfork-mesa`) to distinguish the dual-binary automode variants from the standard manual-mode `mina-{network}` package. This allows operators to install the automode packages side-by-side with the existing daemon without one replacing the other. ### Node Status Service @@ -5969,7 +5969,7 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* | **SNARK Workers** | Follow the same path as block producers (automode or manual). | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | | **Exchanges** | Install stop-slot release. Update integrations (mina-signer, Rosetta API). Test on devnet. Plan deposit/withdrawal freeze window. | -| **zkApp Developers** | Test your zkApp against the Mesa-compatible o1js version. Verify behavior before and after the upgrade on testnet. | +| **zkApp Developers** | Update to the Mesa-compatible o1js version, recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. | :::tip Readiness checklist Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pre-upgrade) to verify every item before proceeding. @@ -6021,11 +6021,11 @@ At approximately **1 hour** after the Mesa release is published, at the predefin | Actor | What to do | |---|---| -| **Block Producers** | Verify your node is on the Mesa chain (`mina-mesa client status`). If automode, check that the `activated` file exists in your config directory (see [Troubleshooting](/network-upgrades/mesa/upgrade-modes-details#how-do-i-know-which-binary-my-node-is-using)). Monitor block production. | +| **Block Producers** | Verify your node is on the Mesa chain (`mina client status`). If automode, check that the `activated` file exists in your config directory (see [Troubleshooting](/network-upgrades/mesa/upgrade-modes-details#how-do-i-know-which-binary-my-node-is-using)). Monitor block production. | | **SNARK Workers** | Reconnect workers to the upgraded coordinator. Verify SNARK work is being produced. | | **Archive Nodes** | Verify the archive database is in sync. Run [validation checks](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation). Fix any missing blocks using archive tooling. | | **Exchanges** | **Re-enable MINA deposits and withdrawals** once block production is confirmed and your systems are verified. | -| **zkApp Developers** | Deploy and test your upgraded zkApps on mainnet. Take advantage of the expanded 32-field on-chain state. | +| **zkApp Developers** | **Redeploy every zkApp** on Mesa — the protocol version bump invalidates Berkeley verification keys, so a redeploy is required before any zkApp can accept transactions. You can also take advantage of the expanded 32-field on-chain state at this point. | --- @@ -6096,7 +6096,7 @@ This means two things are required: ::: :::info Dispatcher limitation (current implementation) -The automode dispatcher only supports the `daemon` subcommand. Other subcommands (e.g., `mina client status`, `mina accounts list`, `mina ledger export`) will fail with an error. This is because, for non-daemon commands, the dispatcher does not have access to the config directory location and therefore cannot determine whether the node is running Berkeley or Mesa. It is the user's responsibility to invoke the correct version-specific binary directly: `mina-berkeley` or `mina-mesa` (or the full paths `/usr/lib/mina/berkeley/mina` and `/usr/lib/mina/mesa/mina`). This limitation may be removed in a future release. +The automode dispatcher only supports the `daemon` subcommand and `mina client status` command. Other subcommands (e.g. `mina accounts list`, `mina ledger export`) will fail with an error. This is because, for non-daemon commands, the dispatcher does not have access to the config directory location and therefore cannot determine whether the node is running Berkeley or Mesa. It is the user's responsibility to invoke the correct version-specific binary directly: `mina-berkeley` or `mina-mesa` (or the full paths `/usr/lib/mina/berkeley/mina` and `/usr/lib/mina/mesa/mina`). This limitation may be removed in a future release. ::: --- @@ -6114,7 +6114,7 @@ Imagine you are **Alice**, a block producer running on a Debian server. Here is ```bash sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=3.x.x +sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x ``` She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. @@ -6136,11 +6136,11 @@ She starts her node normally. The automode dispatcher runs the pre-fork binary u ls ~/.mina-config/auto-fork-mesa-mainnet/activated # Confirm Mesa chain ID -mina-mesa client status +mina client status ``` :::note Dispatcher and non-daemon commands -The automode dispatcher only supports the `daemon` subcommand — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `client status`, `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. +The automode dispatcher only supports the `daemon` subcommand and `client status` command — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. ::: She's done. Her node is producing blocks on Mesa. @@ -6184,10 +6184,10 @@ docker run --name mina -d \ ```bash docker stop mina && docker rm mina -docker pull minaprotocol/mina-daemon:-bullseye-mesa +docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ - minaprotocol/mina-daemon:-bullseye-mesa \ + minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ --block-producer-key /keys/my-wallet \ --config-directory /root/.mina-config \ @@ -6236,7 +6236,7 @@ She restarts her node via systemd and confirms it syncs. sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-mainnet-mesa= +sudo apt-get install mina-mainnet=4.x.x # Restart with the same flags (libp2p key can be reused) sudo systemctl start mina @@ -6295,7 +6295,7 @@ sudo systemctl stop mina-archive sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-archive-mesa= mina-mainnet-mesa= +sudo apt-get install mina-archive-mainnet=4.x.x mina-mainnet=4.x.x # Start archive process pointing to the upgraded DB mina-archive run \ @@ -6360,24 +6360,24 @@ npm install o1js@latest ``` He verifies that: -- His existing zkApp (compiled for Berkeley) still works unchanged on the preflight Mesa network -- Transactions deploy and execute correctly -- If he plans to use the expanded state fields (indexes `8–31`), his new contract version compiles and deploys on preflight +- His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network +- Transactions execute end-to-end against the redeployed contract +- If he plans to use the expanded state fields (indexes `8–31`), his updated contract version compiles and deploys on preflight > For details on testing with the preflight network, see [Preflight Network](/network-upgrades/mesa/preflight-network). **Hours before the fork (State Finalization)** — Frank does **nothing**. His deployed zkApp keeps running on the Berkeley chain. No transactions can be submitted during this phase anyway. -**Fork day (Upgrade)** — Frank does **nothing**. His existing zkApp state carries over to the Mesa chain automatically. All account state (including zkApp state fields at indexes `0–7`) is preserved exactly as-is. +**Fork day (Upgrade)** — Frank does **nothing during the network halt**. His zkApp account and on-chain state values carry over to the Mesa chain automatically (including state fields at indexes `0–7`). However, the verification key generated for Berkeley is no longer valid under the Mesa protocol — the contract cannot process transactions on Mesa until it is redeployed. -**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank can now: +**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank **must redeploy his zkApp** before it can accept transactions, regardless of whether he uses the new state fields: ```bash -# Deploy an updated version of his zkApp that uses the expanded state +# Required for every zkApp — the Mesa protocol version bump invalidates the Berkeley verification key zkapp deploy --network mainnet ``` -If his zkApp does not need the new state fields, no redeployment is needed — it continues to work on Mesa without changes. +If he is also adopting the expanded `8–31` state slots, this same deployment step ships the updated contract version that declares the new fields. > For post-upgrade details, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). @@ -6407,7 +6407,7 @@ Any transactions submitted after the stop-transaction-slot **will not exist on t ```bash sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-mainnet-mesa= +sudo apt-get install mina-mainnet=4.x.x sudo systemctl start mina ``` @@ -7495,14 +7495,14 @@ docker run --name mina -d \ # That's it. Your node will automatically transition to Mesa at the fork. # After the fork, verify it switched: docker exec mina ls /root/.mina-config/auto-fork-mesa-mainnet/activated -docker exec mina mina-mesa client status +docker exec mina mina client status ``` **Example — Debian (automode):** ```bash -# Pre-Upgrade: install both automode packages +# Pre-Upgrade: install both prefork and postfork packages sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=3.x.x +sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x # Start your node as usual — the dispatcher routes to the correct binary mina daemon \ @@ -7514,9 +7514,9 @@ mina daemon \ --file-log-rotations 500 \ --log-json -# After the fork, verify: +# After the network halts, verify: ls ~/.mina-config/auto-fork-mesa-mainnet/activated # exists = Mesa is active -mina-mesa client status # should show Mesa chain +mina client status # should show Mesa chain ``` ### Block Producer (Manual Mode) @@ -7552,11 +7552,11 @@ docker run --name mina -d \ # Upgrade phase: once the Mesa release is published docker stop mina && docker rm mina -docker pull minaprotocol/mina-daemon:-bullseye-mesa +docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon:-bullseye-mesa \ + minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ --block-producer-key /keys/my-wallet \ --config-directory /root/.mina-config \ @@ -7583,16 +7583,12 @@ sudo apt-get install mina-mainnet=3.x.x sudo systemctl stop mina sudo apt-get update -sudo apt-get install mina-mainnet-mesa= +sudo apt-get install mina-mainnet=4.x.x # Restart with updated flags (see Post-Upgrade Flags page) sudo systemctl start mina ``` -:::note Why `-mesa` in the package name? -The `-mesa` suffix distinguishes Mesa packages from the existing Berkeley packages (`mina-mainnet`), so both can be installed side-by-side during the transition. See [Mesa Package Naming Convention](/network-upgrades/mesa/glossary#mesa-package-naming-convention). -::: - After the fork, verify the chain: ```bash @@ -7601,9 +7597,9 @@ mina client status # should show Mesa chain ### SNARK Worker / Coordinator -SNARK coordinators follow the same path as block producers (automode or manual). SNARK workers connect to a coordinator and do not need independent upgrades — they just need the coordinator to be on Mesa. +SNARK coordinators follow the same path as manual block producers. SNARK workers connect to a coordinator and do not need independent upgrades — they just need the coordinator to be on Mesa. -The coordinator schedule is identical to the block producer schedule above — use [Automode](#block-producer-automode--recommended) or [Manual Mode](#block-producer-manual-mode) depending on your preference. After the coordinator transitions to Mesa, restart your SNARK workers and reconnect them to the coordinator. +The coordinator schedule is identical to the block producer schedule above — use [Manual Mode](#block-producer-manual-mode) depending on your preference. After the coordinator transitions to Mesa, restart your SNARK workers and reconnect them to the coordinator. ### Archive Node Operator @@ -7650,8 +7646,8 @@ This page helps you **verify your node is healthy** and running on the Mesa chai # If using automode, check the activation file exists ls ~/.mina-config/auto-fork-mesa-mainnet/activated -# Check node status (use mina-mesa if running automode packages) -mina-mesa client status +# Check node status +mina client status ``` You should see: @@ -7663,7 +7659,7 @@ You should see: ```bash # Check that your node is at the tip of the Mesa chain and is producing blocks -mina-mesa client status | grep -E "^(Block height|Block producers running|Coinbase receiver):" +mina client status | grep -E "^(Block height|Block producers running|Coinbase receiver):" ``` Expected output looks like: @@ -7674,8 +7670,6 @@ Block producers running: 1 (B62qjZ8yh17dCiEyu2WDCVWLreGCAr Coinbase receiver: Block producer ``` -If `mina-mesa` is not on `$PATH` (for example, when running from a Docker image without the automode wrapper), invoke `mina client status` instead, or call it directly inside the container: - ```bash docker exec mina client status | grep -E "^(Block height|Block producers running|Coinbase receiver):" ``` @@ -7698,7 +7692,7 @@ docker logs mina --since 1h 2>&1 | grep -i error #### 1. Confirm the coordinator is on Mesa ```bash -mina-mesa client status +mina client status ``` Verify **Sync status** is `Synced` and the **Chain ID** matches Mesa. @@ -7707,7 +7701,7 @@ Verify **Sync status** is `Synced` and the **Chain ID** matches Mesa. ```bash # Check that workers are producing proofs -mina-mesa client status | grep -i snark +mina client status | grep -i snark ``` If workers were disconnected during the fork, restart them and reconnect to the coordinator: @@ -7719,13 +7713,15 @@ mina internal snark-worker \ --daemon-address : ``` +Note: above command does not work on mina automode dispatcher. You need to explicitly use mina-mesa binary + #### 1. Confirm the daemon and archive process are running ```bash -mina-mesa client status +mina client status ``` Verify **Sync status** is `Synced`. @@ -8074,7 +8070,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th #### Infrastructure
        -
      • Server meets hardware requirements — 32 GB RAM, 8-core CPU with AVX and BMI2
      • +
      • Server meets hardware requirements
      • Port 8302 (or custom --external-port) is open and reachable from the internet
      • If behind NAT/firewall, --external-ip is set to your public IP
      • Node is configured for auto-restart (systemd or equivalent)
      • From ee2fd662ad134127f3957b73eb735d2e0da54e22 Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 6 May 2026 23:02:47 +0200 Subject: [PATCH 22/45] Split Rosetta requirements into standalone and Rosetta+Archive rows Address Cris-F's review comment that the single "Rosetta API standalone Docker image" row was misleading for Trailblazer AN Ops who run Rosetta alongside an archive node. Lower the standalone Rosetta requirements (2 core / 8 GB RAM / 16 GB storage) to reflect actual usage, and add a combined Rosetta + Archive Node row that matches the archive specs. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/requirements.mdx | 3 ++- static/llms-full.txt | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/network-upgrades/mesa/requirements.mdx b/docs/network-upgrades/mesa/requirements.mdx index 850dbb20f..e50744233 100644 --- a/docs/network-upgrades/mesa/requirements.mdx +++ b/docs/network-upgrades/mesa/requirements.mdx @@ -21,7 +21,8 @@ Please note the following are the hardware requirements for each node type after | SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | SNARK Worker | 32 GB RAM | 6 core/12 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| Rosetta API standalone Docker image | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| Rosetta API standalone Docker image | 8 GB RAM | 2 core processor | 16 GB | 1 Mbps Internet Connection | +| Rosetta API + Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Mina Seed Node | 64 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | ## Mina Daemon Requirements diff --git a/static/llms-full.txt b/static/llms-full.txt index 730dea138..a0212e034 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -7024,7 +7024,8 @@ Please note the following are the hardware requirements for each node type after | SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | SNARK Worker | 32 GB RAM | 6 core/12 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| Rosetta API standalone Docker image | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| Rosetta API standalone Docker image | 8 GB RAM | 2 core processor | 16 GB | 1 Mbps Internet Connection | +| Rosetta API + Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Mina Seed Node | 64 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | ## Mina Daemon Requirements From c2f1f3df82a513007854c66aa303d02bcd8c4620 Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 13 May 2026 20:21:05 +0200 Subject: [PATCH 23/45] Glossary: add code names for stop slots, rename Protocol Terms section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR #1133 review feedback on glossary.mdx: - Add `slot_tx_end` as the codebase alias for Stop-Transaction-Slot - Add `slot_chain_end` as the codebase alias for Stop-Network-Slot - Rename "Protocol Terms" section to "Mesa-Specific Changes and Conventions" — its entries (Expanded zkApp State, Mesa Package Naming, Node Status Service) describe Mesa-specific changes rather than general protocol definitions. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/glossary.mdx | 6 +++++- static/llms-full.txt | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docs/network-upgrades/mesa/glossary.mdx b/docs/network-upgrades/mesa/glossary.mdx index 24245d421..54bc54fb5 100644 --- a/docs/network-upgrades/mesa/glossary.mdx +++ b/docs/network-upgrades/mesa/glossary.mdx @@ -36,10 +36,14 @@ The Mina release (version 3.x.x) that node operators install **before** the fork A predefined global slot number baked into the [stop-slot release](#stop-slot-release). When the network reaches this slot, nodes stop accepting new user transactions. Block production continues with empty blocks (no user commands, no coinbase, no fee transfers) for approximately 100 more slots until the [stop-network-slot](#stop-network-slot). This is the point where exchanges must disable deposits and withdrawals. +Referred to as `slot_tx_end` in the Mina codebase and daemon configuration. + ### Stop-Network-Slot {#stop-network-slot} A predefined global slot number that comes after the [stop-transaction-slot](#stop-transaction-slot). When the network reaches this slot, block production halts entirely. The network is now frozen, and the final state is used to build the Mesa release. In [automode](#automode), this is when the daemon automatically transitions to the [post-fork binary](#post-fork-binary). +Referred to as `slot_chain_end` in the Mina codebase and daemon configuration. + ### State Finalization The stabilization period between the [stop-transaction-slot](#stop-transaction-slot) and the [stop-network-slot](#stop-network-slot) — approximately 100 slots (~5 hours). During this window, empty blocks are produced so that all nodes converge on the same final state. No operator action is required; nodes should remain running. See [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). @@ -114,7 +118,7 @@ The official ledger checkpoint published with the [Mesa release](#mesa-release). --- -## Protocol Terms +## Mesa-Specific Changes and Conventions ### Expanded zkApp State diff --git a/static/llms-full.txt b/static/llms-full.txt index a0212e034..5563224c1 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5820,10 +5820,14 @@ The Mina release (version 3.x.x) that node operators install **before** the fork A predefined global slot number baked into the [stop-slot release](#stop-slot-release). When the network reaches this slot, nodes stop accepting new user transactions. Block production continues with empty blocks (no user commands, no coinbase, no fee transfers) for approximately 100 more slots until the [stop-network-slot](#stop-network-slot). This is the point where exchanges must disable deposits and withdrawals. +Referred to as `slot_tx_end` in the Mina codebase and daemon configuration. + ### Stop-Network-Slot {#stop-network-slot} A predefined global slot number that comes after the [stop-transaction-slot](#stop-transaction-slot). When the network reaches this slot, block production halts entirely. The network is now frozen, and the final state is used to build the Mesa release. In [automode](#automode), this is when the daemon automatically transitions to the [post-fork binary](#post-fork-binary). +Referred to as `slot_chain_end` in the Mina codebase and daemon configuration. + ### State Finalization The stabilization period between the [stop-transaction-slot](#stop-transaction-slot) and the [stop-network-slot](#stop-network-slot) — approximately 100 slots (~5 hours). During this window, empty blocks are produced so that all nodes converge on the same final state. No operator action is required; nodes should remain running. See [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). @@ -5898,7 +5902,7 @@ The official ledger checkpoint published with the [Mesa release](#mesa-release). --- -## Protocol Terms +## Mesa-Specific Changes and Conventions ### Expanded zkApp State From 7bcb533841dd6c6ae7b13078921f3f2d7d2b39d2 Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 13 May 2026 20:29:27 +0200 Subject: [PATCH 24/45] Remove AI-generated timeline diagrams from mesa/index.mdx Address PR #1133 review feedback (glyh #3198904627, #3198923451; cjjdespres #3220486292; yamimaio #3228350952): - Drop overview at the Overview section (L44) - Drop the four per-role tags in the Timeline by Role section (automode, manual, archive, exchanges) - Leave MDX comments pointing to design's updated diagrams (Berkeley upgrade-steps page and Mesa upgrade slide deck) as a TODO marker The PNG files in static/img/network-upgrades/mesa/ are left in place so they can be swapped in once the official versions are ready. Note: duplicates in upgrade-steps/index.mdx will be addressed when the structural reorg lands (yamimaio #3230147631 calls for removing that section entirely). Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 12 +++--------- static/llms-full.txt | 12 +++--------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index d0c1a65a3..7fb74fa61 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -41,7 +41,7 @@ The Mesa upgrade follows four phases. The timeline below shows what happens at e ### Overview -Mesa upgrade timeline overview +{/* TODO(PR #1133): Replace with updated timeline diagram from design (Rebecca). Reference: the diagram used in the Berkeley upgrade-steps page and the Mesa upgrade slide deck. The previous AI-generated `simplified-schedule.png` has been removed pending the official version. */} The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization**, **Upgrade**, and **Post-Upgrade** — anchored by three key moments: @@ -128,11 +128,11 @@ At approximately **1 hour** after the Mesa release is published, at the predefin Select your role to see a simplified view of what you need to do and when. +{/* TODO(PR #1133): The per-role timeline diagrams below (`simplified-schedule*.png`) were AI-generated and have been removed. Replace with updated diagrams from design (Rebecca) once available — see Berkeley upgrade-steps page and the Mesa upgrade slide deck for the new visual style. */} +
        Block Producers & SNARK Workers (automode) -Automode upgrade timeline - **Your upgrade is hands-free.** Install the stop-slot release weeks before the fork, keep your node running through state finalization, and the automode dispatcher handles the transition automatically. After the fork, verify your node is on the Mesa chain.
        @@ -140,8 +140,6 @@ Select your role to see a simplified view of what you need to do and when.
        Block Producers & SNARK Workers (manual mode) -Manual upgrade timeline - You must take action on fork day: stop your node after the network halts, install the Mesa release when published, and restart. You have until 290 blocks into the Mesa chain to complete the upgrade without missing your slots.
        @@ -149,8 +147,6 @@ You must take action on fork day: stop your node after the network halts, instal
        Archive Node Operators -Archive node upgrade timeline - Choose your upgrade method early: - **Trustless:** Run the archive upgrade script before the fork (it's backward-compatible). After the fork, point the Mesa archive node at your upgraded DB. - **Trustful:** Wait for the o1Labs SQL dump after the fork and import it into a fresh database. @@ -162,8 +158,6 @@ After the fork, verify data integrity and monitor the archive daemon.
        Exchanges & Service Providers -Exchange upgrade timeline - The critical action is timing your **deposit/withdrawal freeze**. Disable MINA activity before the stop-transaction-slot. Install the Mesa release on fork day. Re-enable deposits and withdrawals only after block production is confirmed and your integration is verified.
        diff --git a/static/llms-full.txt b/static/llms-full.txt index 5563224c1..584ca4086 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5950,7 +5950,7 @@ The Mesa upgrade follows four phases. The timeline below shows what happens at e ### Overview -Mesa upgrade timeline overview +{/* TODO(PR #1133): Replace with updated timeline diagram from design (Rebecca). Reference: the diagram used in the Berkeley upgrade-steps page and the Mesa upgrade slide deck. The previous AI-generated `simplified-schedule.png` has been removed pending the official version. */} The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization**, **Upgrade**, and **Post-Upgrade** — anchored by three key moments: @@ -6037,11 +6037,11 @@ At approximately **1 hour** after the Mesa release is published, at the predefin Select your role to see a simplified view of what you need to do and when. +{/* TODO(PR #1133): The per-role timeline diagrams below (`simplified-schedule*.png`) were AI-generated and have been removed. Replace with updated diagrams from design (Rebecca) once available — see Berkeley upgrade-steps page and the Mesa upgrade slide deck for the new visual style. */} +
        Block Producers & SNARK Workers (automode) -Automode upgrade timeline - **Your upgrade is hands-free.** Install the stop-slot release weeks before the fork, keep your node running through state finalization, and the automode dispatcher handles the transition automatically. After the fork, verify your node is on the Mesa chain.
        @@ -6049,8 +6049,6 @@ Select your role to see a simplified view of what you need to do and when.
        Block Producers & SNARK Workers (manual mode) -Manual upgrade timeline - You must take action on fork day: stop your node after the network halts, install the Mesa release when published, and restart. You have until 290 blocks into the Mesa chain to complete the upgrade without missing your slots.
        @@ -6058,8 +6056,6 @@ You must take action on fork day: stop your node after the network halts, instal
        Archive Node Operators -Archive node upgrade timeline - Choose your upgrade method early: - **Trustless:** Run the archive upgrade script before the fork (it's backward-compatible). After the fork, point the Mesa archive node at your upgraded DB. - **Trustful:** Wait for the o1Labs SQL dump after the fork and import it into a fresh database. @@ -6071,8 +6067,6 @@ After the fork, verify data integrity and monitor the archive daemon.
        Exchanges & Service Providers -Exchange upgrade timeline - The critical action is timing your **deposit/withdrawal freeze**. Disable MINA activity before the stop-transaction-slot. Install the Mesa release on fork day. Re-enable deposits and withdrawals only after block production is confirmed and your integration is verified.
        From 26796593e9c902d48c59fed946314361065c59fb Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 13 May 2026 21:56:15 +0200 Subject: [PATCH 25/45] Fix three broken links flagged in PR #1133 review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - upgrade.mdx:17 — the link to `mina/blob/mesa/docs/upgrading-to-mesa.md` returned 404; the `mesa` branch does not exist on MinaProtocol/mina. Replace with an in-docs reference to the In-Depth Validation section in post-upgrade.mdx, which documents the `mina-archive-hardfork-toolbox` commands that perform the equivalent verification. TODO comment left to repoint at the authoritative mina-repo doc when it lands. (yamimaio #3230190853) - post-upgrade.mdx:322 — generic `mina/releases` link did not point at Mesa; switch to `releases?q=mesa` filter. TODO comment to swap in the specific tag URL once the Mesa release is published. (yamimaio #3230647265) - requirements.mdx:45 — anchor `#start-a-mina-node-with-auto-restart-flows-using-systemd` no longer exists on connecting-to-the-network.mdx. Repoint at the live section `#running-mina-node-as-a-service`, which covers both systemd `systemctl enable` and Docker `--restart=always`. Updated the link text to reflect the section's current title. (yamimaio #3228799955) Verified all other internal /network-upgrades/mesa/* links and external GitHub URLs in the mesa docs resolve. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/requirements.mdx | 2 +- docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx | 2 +- docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx | 2 +- static/llms-full.txt | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/network-upgrades/mesa/requirements.mdx b/docs/network-upgrades/mesa/requirements.mdx index e50744233..6b1543e8f 100644 --- a/docs/network-upgrades/mesa/requirements.mdx +++ b/docs/network-upgrades/mesa/requirements.mdx @@ -42,7 +42,7 @@ You can use a different port by setting the `--external-port` flag. ### Node Auto-restart -Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [auto-restart instructions](/node-operators/validator-node/connecting-to-the-network#start-a-mina-node-with-auto-restart-flows-using-systemd) +Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service) section, which covers both `systemctl enable` for systemd and `--restart=always` for Docker. ## Seed Peer Requirements diff --git a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx index 4b75868ed..639b4d4d9 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx @@ -319,7 +319,7 @@ If you encounter any problems after the upgrade: The flags below are **unchanged from Berkeley** — if your node was running correctly before the fork, the same flags will work on Mesa. This section is provided as a reference for operators setting up fresh nodes or verifying their configuration. -For full details, see the [Mesa release notes](https://github.com/MinaProtocol/mina/releases). +For full details, see the [Mesa release notes](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa release tag URL once published (e.g. `/releases/tag/4.0.0`). */} :::info What changed in Mesa - The `--hardfork-handling` flag is **removed** (not supported on the Mesa chain). If you were using it, remove it from your startup configuration. diff --git a/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx index 727755336..083632b95 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx @@ -14,7 +14,7 @@ keywords: Starting at the _stop-network-slot_ the network will not produce nor accept new blocks, resulting in halting the network. During the upgrade period, o1Labs will use automated tooling to export the network state based on the block at the slot just before the _stop-transaction-slot_. The exported state will then be baked into the new Mesa build, which will be used to initiate the upgraded network. It is during the upgrade window that the Mesa network infrastructure will be bootstrapped, and seed nodes will become available. o1Labs will also finalize the archive node upgrade and publish the PostgreSQL database dumps for import by the archive node operators who wish to bootstrap their archives in a trustful manner. -There is a tool available to validate that the Mesa node was built from the pre-upgrade network state. To validate, follow the instructions provided in this [location](https://github.com/MinaProtocol/mina/blob/mesa/docs/upgrading-to-mesa.md). +There is a tool available to validate that the Mesa node was built from the pre-upgrade network state. See [In-Depth Validation](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation) for the `mina-archive-hardfork-toolbox` commands (`validate-fork`, `fork-candidate no-commands-after`) used to verify fork-block integrity. {/* TODO(PR #1133): If/when an authoritative `upgrading-to-mesa.md` lands in MinaProtocol/mina, link to it here. The previous link to `mina/blob/mesa/docs/upgrading-to-mesa.md` returned 404 — the `mesa` branch does not exist on the main repo. */} ## Block Producers and SNARK Workers diff --git a/static/llms-full.txt b/static/llms-full.txt index 584ca4086..e95d3e0b6 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -7043,7 +7043,7 @@ You can use a different port by setting the `--external-port` flag. ### Node Auto-restart -Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [auto-restart instructions](/node-operators/validator-node/connecting-to-the-network#start-a-mina-node-with-auto-restart-flows-using-systemd) +Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service) section, which covers both `systemctl enable` for systemd and `--restart=always` for Docker. ## Seed Peer Requirements @@ -7932,7 +7932,7 @@ If you encounter any problems after the upgrade: The flags below are **unchanged from Berkeley** — if your node was running correctly before the fork, the same flags will work on Mesa. This section is provided as a reference for operators setting up fresh nodes or verifying their configuration. -For full details, see the [Mesa release notes](https://github.com/MinaProtocol/mina/releases). +For full details, see the [Mesa release notes](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa release tag URL once published (e.g. `/releases/tag/4.0.0`). */} :::info What changed in Mesa - The `--hardfork-handling` flag is **removed** (not supported on the Mesa chain). If you were using it, remove it from your startup configuration. @@ -8322,7 +8322,7 @@ url: /network-upgrades/mesa/upgrade-steps/upgrade Starting at the _stop-network-slot_ the network will not produce nor accept new blocks, resulting in halting the network. During the upgrade period, o1Labs will use automated tooling to export the network state based on the block at the slot just before the _stop-transaction-slot_. The exported state will then be baked into the new Mesa build, which will be used to initiate the upgraded network. It is during the upgrade window that the Mesa network infrastructure will be bootstrapped, and seed nodes will become available. o1Labs will also finalize the archive node upgrade and publish the PostgreSQL database dumps for import by the archive node operators who wish to bootstrap their archives in a trustful manner. -There is a tool available to validate that the Mesa node was built from the pre-upgrade network state. To validate, follow the instructions provided in this [location](https://github.com/MinaProtocol/mina/blob/mesa/docs/upgrading-to-mesa.md). +There is a tool available to validate that the Mesa node was built from the pre-upgrade network state. See [In-Depth Validation](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation) for the `mina-archive-hardfork-toolbox` commands (`validate-fork`, `fork-candidate no-commands-after`) used to verify fork-block integrity. {/* TODO(PR #1133): If/when an authoritative `upgrading-to-mesa.md` lands in MinaProtocol/mina, link to it here. The previous link to `mina/blob/mesa/docs/upgrading-to-mesa.md` returned 404 — the `mesa` branch does not exist on the main repo. */} ## Block Producers and SNARK Workers From 0865036d404c6bb77293a27071e2cb6b1ef74703 Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 13 May 2026 22:09:51 +0200 Subject: [PATCH 26/45] Fix Berkeley sidebar: land category on index, surface requirements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR #1133 review feedback on sidebars.js: - L22 (yamimaio #3228277246): the Berkeley Upgrade category was configured with `link.id: 'network-upgrades/berkeley/requirements'`, which caused the deployed site to show the Requirements page as the category landing — effectively hiding the Berkeley index page. Repoint at `'network-upgrades/berkeley/index'` so clicking the category opens index.mdx (matches the Mesa Upgrade pattern). - L24 (yamimaio #3228290558): add `'network-upgrades/berkeley/requirements'` to the category items so the Requirements page remains reachable from the sidebar after the link change above. Also resolves glyh #3198884231, who was unable to reach the Berkeley index page from the document site root. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- sidebars.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sidebars.js b/sidebars.js index ee53234b6..8626312b2 100644 --- a/sidebars.js +++ b/sidebars.js @@ -19,9 +19,10 @@ module.exports = { label: 'Berkeley Upgrade', link: { type: 'doc', - id: 'network-upgrades/berkeley/requirements', + id: 'network-upgrades/berkeley/index', }, items: [ + 'network-upgrades/berkeley/requirements', { type: 'category', label: 'Archive Migration', From 325a92d01d4fee570aa00dbe2b4828c8b1b6b98e Mon Sep 17 00:00:00 2001 From: dkijania Date: Wed, 13 May 2026 22:52:11 +0200 Subject: [PATCH 27/45] Address PR #1133 version-related review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mesa/index.mdx: - L18 (glyh #3198891299): replace generic `mina/releases` link with a `?q=mesa` filter and a TODO comment to swap in the specific Mesa mainnet release tag once published. Matches the pattern used in post-upgrade.mdx. - L448 (yamimaio #3228761246): change `npm install o1js@latest` to `npm install o1js@3.0.0-mesa.698ca` in the Frank zkApp-developer example. `o1js@latest` currently resolves to a pre-Mesa 2.x release, which would produce transactions the post-fork preflight network rejects. Added a one-sentence explanation and a cross-link to the Preflight Network page. Matches the version already documented in preflight-network.mdx and network-upgrades/index.mdx. - L528-540 (glyh #3198931711): the Network Details block was an unlabelled mix of Mainnet pre-fork values and a generic link. Explicitly label Chain ID and Git SHA-1 as "Mainnet, pre-fork", swap the bare releases link for `?q=mesa`, and add a TODO comment so the post-fork values can be appended once the Mesa mainnet release is cut. Note on the 5.0.0 question (glyh #3198876620, network-upgrades/index.mdx:20): verified against the mina source — commit 3f038cb601 on `mesa_preflight_prefork` is literally titled "artificial bump of protocol_version_transaction to 5". So txn protocol v5.0.0 is correct for the preflight post-fork release `4.0.0-preflight-3f038cb`. No edit needed; the docs are accurate. Per user direction, all other `3.x.x` / `4.x.x` mainnet version placeholders are kept as-is (mainnet versions not yet locked). Reviewer questions yamimaio #3228406060, #3228624590 are answered by "keep placeholders for now". Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 16 +++++++++++----- static/llms-full.txt | 16 +++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 7fb74fa61..fcbd2f44b 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -15,7 +15,7 @@ keywords: The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible and requires all nodes to upgrade. -Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases). +Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa mainnet release tag URL once published. Until then this filter surfaces all `*mesa*` tags (preflight builds today). */} :::info New to the Mesa upgrade? This documentation uses terms like _automode_, _stop-slot_, _trustless upgrade_, _dispatcher_, and more. If you encounter an unfamiliar term, check the **[Glossary](/network-upgrades/mesa/glossary)** for definitions. @@ -445,9 +445,11 @@ She checks her explorer UI to confirm new Mesa blocks are appearing and the hist **Weeks before the fork** — Frank updates his o1js dependency to the Mesa-compatible version and tests his zkApp on the [preflight network](/network-upgrades/mesa/preflight-network): ```bash -npm install o1js@latest +npm install o1js@3.0.0-mesa.698ca ``` +This is the first o1js release that targets the Mesa transaction protocol. `o1js@latest` currently resolves to a pre-Mesa version and will produce transactions the post-fork preflight network rejects. See [Preflight Network](/network-upgrades/mesa/preflight-network) for the matching daemon/archive/rosetta release. + He verifies that: - His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network - Transactions execute end-to-end against the redeployed contract @@ -525,16 +527,20 @@ mina client status # verify Mesa chain ID ## Network Details +The values below describe the **current Mainnet (pre-fork)** chain. They will change after the Mesa fork activates — the post-fork Chain ID, Git SHA-1, and node build link will be published in the Mesa release announcement. + ``` -Chain ID +Chain ID (Mainnet, pre-fork) a7351abc7ddf2ea92d1b38cc8e636c271c1dfd2c081c637f62ebc2af34eb7cc1 -Git SHA-1 +Git SHA-1 (Mainnet, pre-fork) ae112d3a96fe71b4ccccf3c54e7b7494db4898a4 Seed List https://bootnodes.minaprotocol.com/networks/mainnet.txt Node build -https://github.com/MinaProtocol/mina/releases +https://github.com/MinaProtocol/mina/releases?q=mesa ``` + +{/* TODO(PR #1133): When the Mesa mainnet release is cut, add the post-fork Chain ID, Git SHA-1, and the specific release tag URL alongside the pre-fork values above. For the current preflight values, see [Preflight Network](/network-upgrades/mesa/preflight-network). */} diff --git a/static/llms-full.txt b/static/llms-full.txt index e95d3e0b6..f9aeeca7e 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5924,7 +5924,7 @@ url: /network-upgrades/mesa The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible and requires all nodes to upgrade. -Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases). +Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa mainnet release tag URL once published. Until then this filter surfaces all `*mesa*` tags (preflight builds today). */} :::info New to the Mesa upgrade? This documentation uses terms like _automode_, _stop-slot_, _trustless upgrade_, _dispatcher_, and more. If you encounter an unfamiliar term, check the **[Glossary](/network-upgrades/mesa/glossary)** for definitions. @@ -6354,9 +6354,11 @@ She checks her explorer UI to confirm new Mesa blocks are appearing and the hist **Weeks before the fork** — Frank updates his o1js dependency to the Mesa-compatible version and tests his zkApp on the [preflight network](/network-upgrades/mesa/preflight-network): ```bash -npm install o1js@latest +npm install o1js@3.0.0-mesa.698ca ``` +This is the first o1js release that targets the Mesa transaction protocol. `o1js@latest` currently resolves to a pre-Mesa version and will produce transactions the post-fork preflight network rejects. See [Preflight Network](/network-upgrades/mesa/preflight-network) for the matching daemon/archive/rosetta release. + He verifies that: - His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network - Transactions execute end-to-end against the redeployed contract @@ -6434,20 +6436,24 @@ mina client status # verify Mesa chain ID ## Network Details +The values below describe the **current Mainnet (pre-fork)** chain. They will change after the Mesa fork activates — the post-fork Chain ID, Git SHA-1, and node build link will be published in the Mesa release announcement. + ``` -Chain ID +Chain ID (Mainnet, pre-fork) a7351abc7ddf2ea92d1b38cc8e636c271c1dfd2c081c637f62ebc2af34eb7cc1 -Git SHA-1 +Git SHA-1 (Mainnet, pre-fork) ae112d3a96fe71b4ccccf3c54e7b7494db4898a4 Seed List https://bootnodes.minaprotocol.com/networks/mainnet.txt Node build -https://github.com/MinaProtocol/mina/releases +https://github.com/MinaProtocol/mina/releases?q=mesa ``` +{/* TODO(PR #1133): When the Mesa mainnet release is cut, add the post-fork Chain ID, Git SHA-1, and the specific release tag URL alongside the pre-fork values above. For the current preflight values, see [Preflight Network](/network-upgrades/mesa/preflight-network). */} + --- url: /network-upgrades/mesa/preflight-network --- From e436f70995d144868aa0a5929558205a5a9579f2 Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 10:07:18 +0200 Subject: [PATCH 28/45] Address PR #1133 CLI-flag and SNARK-worker review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Section 2 — CLI flags / technical correctness (cjjdespres): - upgrade-steps/index.mdx L28 (#3220629641, #3220644439): the `--node-stats-type none` opt-out for Node Status reporting was documented but the flag does not exist (mina#15277 added then removed `--node-status-type`; neither name is recognized by the current daemon). Remove the opt-out sentence rather than describe a non-existent flag. - upgrade-steps/index.mdx (#3220687330): drop `--generate-genesis-proof true` from all four `daemon` examples. It is a no-op — see cli_entrypoint.ml:488-492. - upgrade-steps/index.mdx Docker automode (#3220678887, #3220734600): the Docker automode example previously had no volume and no `--restart=always`. Automode shuts the daemon down cleanly when the fork activates and relies on the process manager restarting it with a persistent config directory so the `activated` marker survives. Add `--restart=always` and `-v mina-config:/root/.mina-config` to both Docker examples (automode + manual) and document why. - upgrade-steps/index.mdx L167 (#3220764461, #3220717256): the "workers follow the coordinator" wording conflated coordinator- spawned workers with standalone `mina internal snark-worker` deployments. Split into two subsections. Section 3 — SNARK coordinator vs standalone SNARK worker: - mesa/index.mdx Phase 1 + Phase 3 actor tables (#3198911314, #3220507659, #3198917937, #3198921808): replace single "SNARK Workers" row with separate rows for "SNARK Coordinators" (which follow the daemon/automode path) and "Standalone SNARK Workers" (which must be redeployed with the Mesa binary). - mesa/index.mdx Phase 4 row (#3220764461): add the standalone- worker reminder. - upgrade-modes.mdx L20, "Who should use Automode", and the trailing `:::info` (#3198972913, #3228815014, #3198976191): clarify that Automode is for the consensus-participating Mina daemon (which is what a SNARK coordinator runs as); explicitly list archive nodes, Rosetta, and standalone SNARK workers as node types that cannot use Automode. - upgrade-steps/pre-upgrade.mdx SNARK Worker tab (#3235086255): split the tab into "coordinator-spawned" and "standalone" cases with separate checklists; the second case explicitly calls out post-fork redeployment. - requirements.mdx SNARK Worker row (#3198936297): reduce specs per glyh — 8 GB RAM and 1 GB storage per worker (down from 32 GB / 64 GB). Workers do not persist state on disk except logs. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 8 ++- docs/network-upgrades/mesa/requirements.mdx | 2 +- docs/network-upgrades/mesa/upgrade-modes.mdx | 12 +++- .../mesa/upgrade-steps/index.mdx | 25 +++++--- .../mesa/upgrade-steps/pre-upgrade.mdx | 17 +++-- static/llms-full.txt | 64 +++++++++++++------ 6 files changed, 86 insertions(+), 42 deletions(-) diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index fcbd2f44b..491a18c23 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -61,7 +61,8 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* |---|---| | **All operators** | Verify [hardware requirements](/network-upgrades/mesa/requirements) (32 GB RAM, 8-core CPU with AVX/BMI2). Back up keys. | | **Block Producers** | Choose [upgrade mode](/network-upgrades/mesa/upgrade-modes): **automode** (recommended) or manual. Install stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases). If automode, install both prefork and postfork packages. | -| **SNARK Workers** | Follow the same path as block producers (automode or manual). | +| **SNARK Coordinators** | A coordinator is a daemon node — follow the Block Producer path (automode or manual). | +| **Standalone SNARK Workers** | Workers spawned by a coordinator (`--run-snark-worker`) need no separate action — they inherit the coordinator's binary. Workers run as a separate `mina internal snark-worker` process or container must be redeployed with the Mesa release after the fork. | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | | **Exchanges** | Install stop-slot release. Update integrations (mina-signer, Rosetta API). Test on devnet. Plan deposit/withdrawal freeze window. | | **zkApp Developers** | Update to the Mesa-compatible o1js version, recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. | @@ -102,7 +103,8 @@ At the **stop-network-slot**, block production stops entirely. o1Labs exports th |---|---| | **Block Producers (automode)** | **Nothing.** Your node transitions to Mesa automatically. It will start producing blocks when the Mesa genesis timestamp arrives. | | **Block Producers (manual)** | Stop your node. Wait for the Mesa release announcement. Install the new package. Restart with [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade). | -| **SNARK Workers** | Follow the same mode as your coordinator (automode = automatic, manual = reinstall and restart). | +| **SNARK Coordinators** | Same as block producers — automode transitions automatically, manual requires stop + install + restart. | +| **Standalone SNARK Workers** | Coordinator-spawned workers follow the coordinator automatically. Standalone workers (`mina internal snark-worker` process or container) must be stopped and redeployed with the Mesa binary; an older worker cannot submit work to a Mesa coordinator. | | **Archive Nodes** | Install the Mesa archive node release. Point it at your upgraded database (trustless) or import the o1Labs SQL dump into a fresh database (trustful). | | **Exchanges** | Install the Mesa release. Keep deposits/withdrawals disabled until Mesa block production begins. | @@ -117,7 +119,7 @@ At approximately **1 hour** after the Mesa release is published, at the predefin | Actor | What to do | |---|---| | **Block Producers** | Verify your node is on the Mesa chain (`mina client status`). If automode, check that the `activated` file exists in your config directory (see [Troubleshooting](/network-upgrades/mesa/upgrade-modes-details#how-do-i-know-which-binary-my-node-is-using)). Monitor block production. | -| **SNARK Workers** | Reconnect workers to the upgraded coordinator. Verify SNARK work is being produced. | +| **SNARK Workers** | Reconnect workers to the upgraded coordinator. Standalone workers must already be on the Mesa binary at this point. Verify SNARK work is being produced. | | **Archive Nodes** | Verify the archive database is in sync. Run [validation checks](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation). Fix any missing blocks using archive tooling. | | **Exchanges** | **Re-enable MINA deposits and withdrawals** once block production is confirmed and your systems are verified. | | **zkApp Developers** | **Redeploy every zkApp** on Mesa — the protocol version bump invalidates Berkeley verification keys, so a redeploy is required before any zkApp can accept transactions. You can also take advantage of the expanded 32-field on-chain state at this point. | diff --git a/docs/network-upgrades/mesa/requirements.mdx b/docs/network-upgrades/mesa/requirements.mdx index 6b1543e8f..ecb698926 100644 --- a/docs/network-upgrades/mesa/requirements.mdx +++ b/docs/network-upgrades/mesa/requirements.mdx @@ -19,7 +19,7 @@ Please note the following are the hardware requirements for each node type after |--|--|--|--|--| | Mina Daemon Node | 32 GB RAM | 8 core processor with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| SNARK Worker | 32 GB RAM | 6 core/12 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | +| SNARK Worker (per worker) | 8 GB RAM | 6 core/12 threads with BMI2 and AVX CPU instruction set are required | 1 GB | 1 Mbps Internet Connection | | Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Rosetta API standalone Docker image | 8 GB RAM | 2 core processor | 16 GB | 1 Mbps Internet Connection | | Rosetta API + Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | diff --git a/docs/network-upgrades/mesa/upgrade-modes.mdx b/docs/network-upgrades/mesa/upgrade-modes.mdx index 096fe3f6b..2e335462d 100644 --- a/docs/network-upgrades/mesa/upgrade-modes.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes.mdx @@ -17,7 +17,7 @@ The Mesa upgrade supports two modes for daemon node operators: **Automode** and ## Automode (Recommended) -Automode is the recommended upgrade path for daemon nodes (block producers, SNARK coordinators). In automode, the node handles the entire fork transition automatically. +Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. ### How it works @@ -32,9 +32,15 @@ Automode is the recommended upgrade path for daemon nodes (block producers, SNAR ### Who should use Automode - Block producers who want a hands-off upgrade experience -- SNARK coordinators running daemon nodes +- SNARK coordinators (run as a Mina daemon) - Operators who want to minimize downtime and operational risk +Automode is **not** available for the following — operators of these node types must use Manual mode: + +- **Archive nodes** — schema upgrade is a separate manual step (see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade)) +- **Rosetta API nodes** — upgrade alongside the archive node they depend on +- **Standalone SNARK workers** — `mina internal snark-worker` processes/containers run separately from any daemon; they must be stopped and redeployed with the Mesa binary after the fork. (Workers spawned by a coordinator inherit the coordinator's upgrade automatically.) + ### Requirements - Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ @@ -42,7 +48,7 @@ Automode is the recommended upgrade path for daemon nodes (block producers, SNAR - Meet the [hardware requirements](/network-upgrades/mesa/requirements) :::info -Automode applies only to the daemon process. Archive nodes and Rosetta API instances require separate upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). +Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). ::: ## Manual Mode diff --git a/docs/network-upgrades/mesa/upgrade-steps/index.mdx b/docs/network-upgrades/mesa/upgrade-steps/index.mdx index 51757386a..521f3be03 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/index.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/index.mdx @@ -25,7 +25,7 @@ The Mesa upgrade proceeds through four sequential phases. Each phase has specifi | [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade) | Network halts, state is exported, Mesa build is published | | [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | Block production resumes on Mesa, flags and configurations for the new network | -**Please note:** A simplified Node Status service will be part of the upgrade tooling and enabled by default in the Pre-Upgrade release with stop-slots ([3.x.x](https://github.com/MinaProtocol/mina/releases)). This feature allows for a safe upgrade by monitoring the amount of upgraded active stake. Only non-sensitive data will be reported. If operators are not comfortable sharing their node version, they can disable the reports using the flag `--node-stats-type none`. +**Please note:** A simplified Node Status service will be part of the upgrade tooling and enabled by default in the Pre-Upgrade release with stop-slots ([3.x.x](https://github.com/MinaProtocol/mina/releases)). This feature allows for a safe upgrade by monitoring the amount of upgraded active stake. Only non-sensitive data is reported. Before proceeding, make sure you have reviewed the [Requirements](/network-upgrades/mesa/requirements) and chosen your [Upgrade Mode](/network-upgrades/mesa/upgrade-modes). @@ -48,14 +48,19 @@ This is the simplest path. You install one update and your node handles the rest # Pre-Upgrade: switch to the automode image docker pull minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet +# Note: `--restart=always` + a named volume for the config directory are required. +# Automode shuts the daemon down cleanly when the fork activates; the process +# manager must restart it, and the `activated` marker file must survive that +# restart so the dispatcher knows to launch the Mesa binary. docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet \ daemon \ --block-producer-key /keys/my-wallet \ --config-directory /root/.mina-config \ --libp2p-keypair /keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -77,7 +82,6 @@ mina daemon \ --config-directory ~/.mina-config \ --libp2p-keypair ~/keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -102,6 +106,7 @@ You control every step, but you need to act fast when the Mesa release is publis docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ + --restart=always \ -v mina-config:/root/.mina-config \ minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ @@ -109,7 +114,6 @@ docker run --name mina -d \ --config-directory /root/.mina-config \ --libp2p-keypair /keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -122,6 +126,7 @@ docker stop mina && docker rm mina docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ + --restart=always \ -v mina-config:/root/.mina-config \ minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ @@ -129,7 +134,6 @@ docker run --name mina -d \ --config-directory /root/.mina-config \ --libp2p-keypair /keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -162,11 +166,16 @@ After the fork, verify the chain: mina client status # should show Mesa chain ``` -### SNARK Worker / Coordinator +### SNARK Coordinator + +A SNARK coordinator is a daemon node and follows the same path as a Block Producer in [Manual Mode](#block-producer-manual-mode). The coordinator does not transition automatically — you must stop it after the network halts, install the Mesa release, and restart. + +### SNARK Workers -SNARK coordinators follow the same path as manual block producers. SNARK workers connect to a coordinator and do not need independent upgrades — they just need the coordinator to be on Mesa. +There are two deployment patterns and they upgrade differently: -The coordinator schedule is identical to the block producer schedule above — use [Manual Mode](#block-producer-manual-mode) depending on your preference. After the coordinator transitions to Mesa, restart your SNARK workers and reconnect them to the coordinator. +- **Workers spawned by a coordinator** (the common case — `--snark-worker-fee` / `--run-snark-worker` set on the coordinator) do not need an independent upgrade. They inherit the coordinator's binary, so when the coordinator restarts on Mesa, the spawned workers restart on Mesa. +- **Standalone workers** (`mina internal snark-worker …` run as a separate process or container) must be redeployed with the Mesa binary themselves. Stop each standalone worker after the fork, install the Mesa release (or pull the Mesa Docker image), and restart it pointing at the upgraded coordinator. Workers running an older binary cannot submit work to a Mesa coordinator. ### Archive Node Operator diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx index 220981b6d..c121b49f6 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -93,21 +93,26 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th -#### Infrastructure +There are two SNARK worker deployment patterns and they prepare differently for the fork: + +**1. Worker spawned by a coordinator** (`--run-snark-worker` set on the coordinator)
          -
        • Server meets hardware requirements — 32 GB RAM, 6 core/12 threads per worker, AVX + BMI2
        • +
        • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
        • +
        • No independent upgrade action needed — the spawned worker inherits the coordinator's binary
        • +
        • Ensure the coordinator is on the stop-slot release before the fork
        -#### Connectivity +**2. Standalone worker** (`mina internal snark-worker …` run as a separate process or container)
          -
        • Connected to a coordinator that is upgrading
        • -
        • No independent upgrade action needed — workers follow the coordinator
        • +
        • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
        • +
        • Install the stop-slot release on the worker host as well — the worker must speak the same protocol as the coordinator
        • +
        • Plan a post-fork redeployment: the worker must be stopped and restarted with the Mesa binary after the coordinator transitions, otherwise it cannot submit work to the upgraded coordinator
        :::info -SNARK workers do not need to install the stop-slot release independently. They connect to a SNARK coordinator, which handles the upgrade. Just ensure your coordinator is ready. +The "no independent upgrade" advice only applies to workers the coordinator spawns. Standalone `mina internal snark-worker` deployments need to be upgraded just like any other binary. :::
        diff --git a/static/llms-full.txt b/static/llms-full.txt index f9aeeca7e..99f474dbe 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5970,7 +5970,8 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* |---|---| | **All operators** | Verify [hardware requirements](/network-upgrades/mesa/requirements) (32 GB RAM, 8-core CPU with AVX/BMI2). Back up keys. | | **Block Producers** | Choose [upgrade mode](/network-upgrades/mesa/upgrade-modes): **automode** (recommended) or manual. Install stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases). If automode, install both prefork and postfork packages. | -| **SNARK Workers** | Follow the same path as block producers (automode or manual). | +| **SNARK Coordinators** | A coordinator is a daemon node — follow the Block Producer path (automode or manual). | +| **Standalone SNARK Workers** | Workers spawned by a coordinator (`--run-snark-worker`) need no separate action — they inherit the coordinator's binary. Workers run as a separate `mina internal snark-worker` process or container must be redeployed with the Mesa release after the fork. | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | | **Exchanges** | Install stop-slot release. Update integrations (mina-signer, Rosetta API). Test on devnet. Plan deposit/withdrawal freeze window. | | **zkApp Developers** | Update to the Mesa-compatible o1js version, recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. | @@ -6011,7 +6012,8 @@ At the **stop-network-slot**, block production stops entirely. o1Labs exports th |---|---| | **Block Producers (automode)** | **Nothing.** Your node transitions to Mesa automatically. It will start producing blocks when the Mesa genesis timestamp arrives. | | **Block Producers (manual)** | Stop your node. Wait for the Mesa release announcement. Install the new package. Restart with [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade). | -| **SNARK Workers** | Follow the same mode as your coordinator (automode = automatic, manual = reinstall and restart). | +| **SNARK Coordinators** | Same as block producers — automode transitions automatically, manual requires stop + install + restart. | +| **Standalone SNARK Workers** | Coordinator-spawned workers follow the coordinator automatically. Standalone workers (`mina internal snark-worker` process or container) must be stopped and redeployed with the Mesa binary; an older worker cannot submit work to a Mesa coordinator. | | **Archive Nodes** | Install the Mesa archive node release. Point it at your upgraded database (trustless) or import the o1Labs SQL dump into a fresh database (trustful). | | **Exchanges** | Install the Mesa release. Keep deposits/withdrawals disabled until Mesa block production begins. | @@ -6026,7 +6028,7 @@ At approximately **1 hour** after the Mesa release is published, at the predefin | Actor | What to do | |---|---| | **Block Producers** | Verify your node is on the Mesa chain (`mina client status`). If automode, check that the `activated` file exists in your config directory (see [Troubleshooting](/network-upgrades/mesa/upgrade-modes-details#how-do-i-know-which-binary-my-node-is-using)). Monitor block production. | -| **SNARK Workers** | Reconnect workers to the upgraded coordinator. Verify SNARK work is being produced. | +| **SNARK Workers** | Reconnect workers to the upgraded coordinator. Standalone workers must already be on the Mesa binary at this point. Verify SNARK work is being produced. | | **Archive Nodes** | Verify the archive database is in sync. Run [validation checks](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation). Fix any missing blocks using archive tooling. | | **Exchanges** | **Re-enable MINA deposits and withdrawals** once block production is confirmed and your systems are verified. | | **zkApp Developers** | **Redeploy every zkApp** on Mesa — the protocol version bump invalidates Berkeley verification keys, so a redeploy is required before any zkApp can accept transactions. You can also take advantage of the expanded 32-field on-chain state at this point. | @@ -7026,7 +7028,7 @@ Please note the following are the hardware requirements for each node type after |--|--|--|--|--| | Mina Daemon Node | 32 GB RAM | 8 core processor with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | | SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| SNARK Worker | 32 GB RAM | 6 core/12 threads per worker with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | +| SNARK Worker (per worker) | 8 GB RAM | 6 core/12 threads with BMI2 and AVX CPU instruction set are required | 1 GB | 1 Mbps Internet Connection | | Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | | Rosetta API standalone Docker image | 8 GB RAM | 2 core processor | 16 GB | 1 Mbps Internet Connection | | Rosetta API + Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | @@ -7381,7 +7383,7 @@ The Mesa upgrade supports two modes for daemon node operators: **Automode** and ## Automode (Recommended) -Automode is the recommended upgrade path for daemon nodes (block producers, SNARK coordinators). In automode, the node handles the entire fork transition automatically. +Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. ### How it works @@ -7396,9 +7398,15 @@ Automode is the recommended upgrade path for daemon nodes (block producers, SNAR ### Who should use Automode - Block producers who want a hands-off upgrade experience -- SNARK coordinators running daemon nodes +- SNARK coordinators (run as a Mina daemon) - Operators who want to minimize downtime and operational risk +Automode is **not** available for the following — operators of these node types must use Manual mode: + +- **Archive nodes** — schema upgrade is a separate manual step (see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade)) +- **Rosetta API nodes** — upgrade alongside the archive node they depend on +- **Standalone SNARK workers** — `mina internal snark-worker` processes/containers run separately from any daemon; they must be stopped and redeployed with the Mesa binary after the fork. (Workers spawned by a coordinator inherit the coordinator's upgrade automatically.) + ### Requirements - Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ @@ -7406,7 +7414,7 @@ Automode is the recommended upgrade path for daemon nodes (block producers, SNAR - Meet the [hardware requirements](/network-upgrades/mesa/requirements) :::info -Automode applies only to the daemon process. Archive nodes and Rosetta API instances require separate upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). +Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). ::: ## Manual Mode @@ -7463,7 +7471,7 @@ The Mesa upgrade proceeds through four sequential phases. Each phase has specifi | [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade) | Network halts, state is exported, Mesa build is published | | [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | Block production resumes on Mesa, flags and configurations for the new network | -**Please note:** A simplified Node Status service will be part of the upgrade tooling and enabled by default in the Pre-Upgrade release with stop-slots ([3.x.x](https://github.com/MinaProtocol/mina/releases)). This feature allows for a safe upgrade by monitoring the amount of upgraded active stake. Only non-sensitive data will be reported. If operators are not comfortable sharing their node version, they can disable the reports using the flag `--node-stats-type none`. +**Please note:** A simplified Node Status service will be part of the upgrade tooling and enabled by default in the Pre-Upgrade release with stop-slots ([3.x.x](https://github.com/MinaProtocol/mina/releases)). This feature allows for a safe upgrade by monitoring the amount of upgraded active stake. Only non-sensitive data is reported. Before proceeding, make sure you have reviewed the [Requirements](/network-upgrades/mesa/requirements) and chosen your [Upgrade Mode](/network-upgrades/mesa/upgrade-modes). @@ -7486,14 +7494,19 @@ This is the simplest path. You install one update and your node handles the rest # Pre-Upgrade: switch to the automode image docker pull minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet +# Note: `--restart=always` + a named volume for the config directory are required. +# Automode shuts the daemon down cleanly when the fork activates; the process +# manager must restart it, and the `activated` marker file must survive that +# restart so the dispatcher knows to launch the Mesa binary. docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet \ daemon \ --block-producer-key /keys/my-wallet \ --config-directory /root/.mina-config \ --libp2p-keypair /keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -7515,7 +7528,6 @@ mina daemon \ --config-directory ~/.mina-config \ --libp2p-keypair ~/keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -7540,6 +7552,7 @@ You control every step, but you need to act fast when the Mesa release is publis docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ + --restart=always \ -v mina-config:/root/.mina-config \ minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ @@ -7547,7 +7560,6 @@ docker run --name mina -d \ --config-directory /root/.mina-config \ --libp2p-keypair /keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -7560,6 +7572,7 @@ docker stop mina && docker rm mina docker pull minaprotocol/mina-daemon:-bullseye-mainnet docker run --name mina -d \ + --restart=always \ -v mina-config:/root/.mina-config \ minaprotocol/mina-daemon:-bullseye-mainnet \ daemon \ @@ -7567,7 +7580,6 @@ docker run --name mina -d \ --config-directory /root/.mina-config \ --libp2p-keypair /keys/libp2p-key \ --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ --file-log-rotations 500 \ --log-json @@ -7600,11 +7612,16 @@ After the fork, verify the chain: mina client status # should show Mesa chain ``` -### SNARK Worker / Coordinator +### SNARK Coordinator + +A SNARK coordinator is a daemon node and follows the same path as a Block Producer in [Manual Mode](#block-producer-manual-mode). The coordinator does not transition automatically — you must stop it after the network halts, install the Mesa release, and restart. -SNARK coordinators follow the same path as manual block producers. SNARK workers connect to a coordinator and do not need independent upgrades — they just need the coordinator to be on Mesa. +### SNARK Workers + +There are two deployment patterns and they upgrade differently: -The coordinator schedule is identical to the block producer schedule above — use [Manual Mode](#block-producer-manual-mode) depending on your preference. After the coordinator transitions to Mesa, restart your SNARK workers and reconnect them to the coordinator. +- **Workers spawned by a coordinator** (the common case — `--snark-worker-fee` / `--run-snark-worker` set on the coordinator) do not need an independent upgrade. They inherit the coordinator's binary, so when the coordinator restarts on Mesa, the spawned workers restart on Mesa. +- **Standalone workers** (`mina internal snark-worker …` run as a separate process or container) must be redeployed with the Mesa binary themselves. Stop each standalone worker after the fork, install the Mesa release (or pull the Mesa Docker image), and restart it pointing at the upgraded coordinator. Workers running an older binary cannot submit work to a Mesa coordinator. ### Archive Node Operator @@ -8142,21 +8159,26 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th -#### Infrastructure +There are two SNARK worker deployment patterns and they prepare differently for the fork: + +**1. Worker spawned by a coordinator** (`--run-snark-worker` set on the coordinator)
          -
        • Server meets hardware requirements — 32 GB RAM, 6 core/12 threads per worker, AVX + BMI2
        • +
        • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
        • +
        • No independent upgrade action needed — the spawned worker inherits the coordinator's binary
        • +
        • Ensure the coordinator is on the stop-slot release before the fork
        -#### Connectivity +**2. Standalone worker** (`mina internal snark-worker …` run as a separate process or container)
          -
        • Connected to a coordinator that is upgrading
        • -
        • No independent upgrade action needed — workers follow the coordinator
        • +
        • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
        • +
        • Install the stop-slot release on the worker host as well — the worker must speak the same protocol as the coordinator
        • +
        • Plan a post-fork redeployment: the worker must be stopped and restarted with the Mesa binary after the coordinator transitions, otherwise it cannot submit work to the upgraded coordinator
        :::info -SNARK workers do not need to install the stop-slot release independently. They connect to a SNARK coordinator, which handles the upgrade. Just ensure your coordinator is ready. +The "no independent upgrade" advice only applies to workers the coordinator spawns. Standalone `mina internal snark-worker` deployments need to be upgraded just like any other binary. :::
        From 4cf81ab4cf1d9b55735b3a27db70bcf24a9685ef Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 10:13:58 +0200 Subject: [PATCH 29/45] Address PR #1133 "Missing content" review comments MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit mesa/index.mdx: - L16 (glyh #3198895612): "requires all nodes to upgrade" was misleading; qualify which node types must upgrade for consensus participation versus downstream tooling. - L24-37 (glyh #3198894474, yamimaio #3228391904): the "What Mesa Introduces" section was missing MIPs beyond Expanded zkApp State and Automode. Add an "Additional Protocol Improvements" subsection noting the account-update limit increase, with a link to the o1Labs Mesa upgrade blog post for the complete MIP list and a TODO to inline the canonical list once the Mesa release notes publish it. - Phase 1 table (glyh #3198908301): high-level summary was unclear about being deployment-agnostic. Add a lead-in sentence pointing to Upgrade Steps / Upgrade Modes for concrete (Debian, Docker, ...) commands and checklists. - zkApp Developers row (cjjdespres #3220525842): swap the generic "Mesa-compatible o1js version" wording for the concrete `o1js@3.0.0-mesa.698ca` preflight version, and leave a TODO to link to the official o1js Mesa upgrade guide when published. - Phase 2 intro (glyh #3198914880): stop-transaction-slot and stop-network-slot were bold-but-unlinked; link both to their glossary anchors and add a TODO to create a dedicated Fork Schedule page with the concrete `slot_tx_end` / `slot_chain_end` values once they are known. - Quick Reference rows (yamimaio #3228520799, #3228516102): apply the suggested link lists for Rosetta API Operators (add Requirements; collapse duplicated Post-Upgrade) and Exchanges (add Post-Upgrade). mesa/archive-upgrade.mdx L109 (yamimaio #3230669303): apply suggested wording — "Another alternative is to run the rollback script" instead of "Another is to run rollback script". mesa/upgrade-steps/state-finalization.mdx L47 (cjjdespres #3235103301): add the caveat that the transaction-cutoff guarantee only holds when the majority of block producers are running the stop-slot release. mesa/upgrade-steps/upgrade.mdx L29 (yamimaio #3230195515): replace the vague "adjust the new flag" with an explicit link to the `--libp2p-keypair` flag in the Post-Upgrade Flag and Configuration Reference. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../network-upgrades/mesa/archive-upgrade.mdx | 2 +- docs/network-upgrades/mesa/index.mdx | 22 +++++++++++---- .../mesa/upgrade-steps/state-finalization.mdx | 2 +- .../mesa/upgrade-steps/upgrade.mdx | 2 +- static/llms-full.txt | 28 +++++++++++++------ 5 files changed, 40 insertions(+), 16 deletions(-) diff --git a/docs/network-upgrades/mesa/archive-upgrade.mdx b/docs/network-upgrades/mesa/archive-upgrade.mdx index b42399048..36c47f58e 100644 --- a/docs/network-upgrades/mesa/archive-upgrade.mdx +++ b/docs/network-upgrades/mesa/archive-upgrade.mdx @@ -106,7 +106,7 @@ Make sure to replace `` and `` with your actual PostgreSQL u #### Rollback You can rollback the upgrade process by restoring the database from a backup taken before running the upgrade script. -Another is to run rollback script which is part of the upgrade script. It will drop all tables and other database objects created by the upgrade script. +Another alternative is to run the rollback script, which is part of the upgrade script. It will drop all tables and other database objects created by the upgrade script. It will also update the version table to reflect the rollback. ##### Running the rollback script diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 491a18c23..6776ede61 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -13,7 +13,7 @@ keywords: # Mesa Upgrade -The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible and requires all nodes to upgrade. +The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible: every consensus-participating Mina daemon (block producers, SNARK coordinators, archive nodes, Rosetta API nodes, and seed nodes) must run a Mesa-compatible release to remain on the network. Wallets, off-chain services, and downstream tooling do not run a daemon and only need to update if they pin to a specific transaction format or version. Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa mainnet release tag URL once published. Until then this filter surfaces all `*mesa*` tags (preflight builds today). */} @@ -35,6 +35,14 @@ For the first time in Mina's history, node operators can upgrade through a hard Unlike the Berkeley upgrade (which required up to 48 hours for archive database conversion), the Mesa archive upgrade is a fast schema upgrade that completes in under a minute. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). +### Additional Protocol Improvements + +Mesa also ships a number of smaller MIPs (Mina Improvement Proposals) that affect protocol behavior, including: + +- **Account-update limit increase** — the maximum number of account updates a single zkApp transaction can include is raised, allowing more complex composed transactions in a single proof. + +For the complete list of MIPs landing in Mesa, see the [Mesa upgrade overview on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). {/* TODO(PR #1133): Inline the canonical MIP list here once it is published in the Mesa release notes / mina-improvements repo, instead of relying on the blog post. */} + ## Upgrade Flow — End-to-End Timeline The Mesa upgrade follows four phases. The timeline below shows what happens at each stage, when it happens, and what **you** need to do. @@ -57,6 +65,8 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* > **Goal:** Every participant is prepared and running the stop-slot release before the fork begins. +The table below is a high-level summary. The concrete install commands (Debian, Docker, etc.) and per-role checklists live in [Upgrade Steps — Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade) and the relevant [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) page — start there once you know your role and deployment style. + | Actor | What to do | |---|---| | **All operators** | Verify [hardware requirements](/network-upgrades/mesa/requirements) (32 GB RAM, 8-core CPU with AVX/BMI2). Back up keys. | @@ -65,7 +75,7 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* | **Standalone SNARK Workers** | Workers spawned by a coordinator (`--run-snark-worker`) need no separate action — they inherit the coordinator's binary. Workers run as a separate `mina internal snark-worker` process or container must be redeployed with the Mesa release after the fork. | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | | **Exchanges** | Install stop-slot release. Update integrations (mina-signer, Rosetta API). Test on devnet. Plan deposit/withdrawal freeze window. | -| **zkApp Developers** | Update to the Mesa-compatible o1js version, recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. | +| **zkApp Developers** | Update to the Mesa-compatible o1js version (`o1js@3.0.0-mesa.698ca` for the preflight chain), recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. {/* TODO(PR #1133): Link to the official o1js Mesa upgrade guide once published (cjjdespres #3220525842). */} | :::tip Readiness checklist Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pre-upgrade) to verify every item before proceeding. @@ -77,7 +87,9 @@ Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pr > **Goal:** The network reaches consensus on a final state. No new transactions are accepted. -At the predefined **stop-transaction-slot**, nodes stop accepting new user transactions. Block production continues for ~100 more slots with empty blocks (no coinbase, no fees) until the **stop-network-slot** to ensure all nodes converge on the same state. +At the predefined [**stop-transaction-slot**](/network-upgrades/mesa/glossary#stop-transaction-slot), nodes stop accepting new user transactions. Block production continues for ~100 more slots with empty blocks (no coinbase, no fees) until the [**stop-network-slot**](/network-upgrades/mesa/glossary#stop-network-slot) to ensure all nodes converge on the same state. + +{/* TODO(PR #1133, glyh #3198914880): Add a dedicated "Fork Schedule" page that lists the concrete values — Mesa genesis timestamp, stop-transaction-slot (`slot_tx_end`), stop-network-slot (`slot_chain_end`) — and link to it from every glossary anchor used here. Until it exists, links point at the glossary definitions. */} | Actor | What to do | |---|---| @@ -524,8 +536,8 @@ mina client status # verify Mesa chain ID | **Block Producers** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Modes](/network-upgrades/mesa/upgrade-modes), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **SNARK Workers / Coordinators** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **Archive Node Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Rosetta API Operators** | [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Appendix](/network-upgrades/mesa/appendix) | +| **Rosetta API Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Appendix](/network-upgrades/mesa/appendix) | ## Network Details diff --git a/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx b/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx index aacefc8d6..21b5f6351 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/state-finalization.mdx @@ -44,4 +44,4 @@ If you are doing the trustless upgrade, then: Exchanges shall disable MINA deposits and withdrawals during the state finalization period (the period between _stop-transaction-slot_ and _stop-network-slot_) since any transactions after the _stop-transaction-slot_ will not be part of the upgraded chain. -Remember that although you might be able to submit transactions, the majority of the block producers will be running a node that discards any blocks with transactions. +Note that this assumes the majority of block producers are running the [stop-slot release](/network-upgrades/mesa/glossary#stop-slot-release), which is what enforces the transaction cutoff. If your own node is still on a pre-stop-slot build, you might technically be able to submit transactions, but the block producers running the stop-slot release will discard any blocks containing them. diff --git a/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx index 083632b95..4b5a84664 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/upgrade.mdx @@ -26,7 +26,7 @@ If you are using **Manual mode**: 1. During the upgrade phase (between _stop-network-slot_ and the publishing of the Mesa release), block producers can shut down their nodes. 2. After the publication of the Mesa node release, block producers and SNARK workers should upgrade their nodes and be prepared for block production at the genesis timestamp, which is the slot when the first Mesa block will be produced. -3. It is possible to continue using the same libp2p key after the upgrade. Remember to adjust the new flag to pass the libp2p key to the node. +3. It is possible to continue using the same libp2p key after the upgrade. Pass it to the Mesa daemon with the [`--libp2p-keypair`](/network-upgrades/mesa/upgrade-steps/post-upgrade#flag-and-configuration-reference) flag (see the Flag and Configuration Reference on the Post-Upgrade page). ## Archive Node Operators and Rosetta Operators diff --git a/static/llms-full.txt b/static/llms-full.txt index 99f474dbe..9f79578ae 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5605,7 +5605,7 @@ Make sure to replace `` and `` with your actual PostgreSQL u #### Rollback You can rollback the upgrade process by restoring the database from a backup taken before running the upgrade script. -Another is to run rollback script which is part of the upgrade script. It will drop all tables and other database objects created by the upgrade script. +Another alternative is to run the rollback script, which is part of the upgrade script. It will drop all tables and other database objects created by the upgrade script. It will also update the version table to reflect the rollback. ##### Running the rollback script @@ -5922,7 +5922,7 @@ url: /network-upgrades/mesa # Mesa Upgrade -The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible and requires all nodes to upgrade. +The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible: every consensus-participating Mina daemon (block producers, SNARK coordinators, archive nodes, Rosetta API nodes, and seed nodes) must run a Mesa-compatible release to remain on the network. Wallets, off-chain services, and downstream tooling do not run a daemon and only need to update if they pin to a specific transaction format or version. Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa mainnet release tag URL once published. Until then this filter surfaces all `*mesa*` tags (preflight builds today). */} @@ -5944,6 +5944,14 @@ For the first time in Mina's history, node operators can upgrade through a hard Unlike the Berkeley upgrade (which required up to 48 hours for archive database conversion), the Mesa archive upgrade is a fast schema upgrade that completes in under a minute. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). +### Additional Protocol Improvements + +Mesa also ships a number of smaller MIPs (Mina Improvement Proposals) that affect protocol behavior, including: + +- **Account-update limit increase** — the maximum number of account updates a single zkApp transaction can include is raised, allowing more complex composed transactions in a single proof. + +For the complete list of MIPs landing in Mesa, see the [Mesa upgrade overview on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). {/* TODO(PR #1133): Inline the canonical MIP list here once it is published in the Mesa release notes / mina-improvements repo, instead of relying on the blog post. */} + ## Upgrade Flow — End-to-End Timeline The Mesa upgrade follows four phases. The timeline below shows what happens at each stage, when it happens, and what **you** need to do. @@ -5966,6 +5974,8 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* > **Goal:** Every participant is prepared and running the stop-slot release before the fork begins. +The table below is a high-level summary. The concrete install commands (Debian, Docker, etc.) and per-role checklists live in [Upgrade Steps — Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade) and the relevant [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) page — start there once you know your role and deployment style. + | Actor | What to do | |---|---| | **All operators** | Verify [hardware requirements](/network-upgrades/mesa/requirements) (32 GB RAM, 8-core CPU with AVX/BMI2). Back up keys. | @@ -5974,7 +5984,7 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* | **Standalone SNARK Workers** | Workers spawned by a coordinator (`--run-snark-worker`) need no separate action — they inherit the coordinator's binary. Workers run as a separate `mina internal snark-worker` process or container must be redeployed with the Mesa release after the fork. | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | | **Exchanges** | Install stop-slot release. Update integrations (mina-signer, Rosetta API). Test on devnet. Plan deposit/withdrawal freeze window. | -| **zkApp Developers** | Update to the Mesa-compatible o1js version, recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. | +| **zkApp Developers** | Update to the Mesa-compatible o1js version (`o1js@3.0.0-mesa.698ca` for the preflight chain), recompile your contract, and verify it on the [preflight network](/network-upgrades/mesa/preflight-network). Plan to redeploy on Mesa after the fork — every zkApp must be redeployed because the protocol version bump changes the verification key. {/* TODO(PR #1133): Link to the official o1js Mesa upgrade guide once published (cjjdespres #3220525842). */} | :::tip Readiness checklist Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pre-upgrade) to verify every item before proceeding. @@ -5986,7 +5996,9 @@ Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pr > **Goal:** The network reaches consensus on a final state. No new transactions are accepted. -At the predefined **stop-transaction-slot**, nodes stop accepting new user transactions. Block production continues for ~100 more slots with empty blocks (no coinbase, no fees) until the **stop-network-slot** to ensure all nodes converge on the same state. +At the predefined [**stop-transaction-slot**](/network-upgrades/mesa/glossary#stop-transaction-slot), nodes stop accepting new user transactions. Block production continues for ~100 more slots with empty blocks (no coinbase, no fees) until the [**stop-network-slot**](/network-upgrades/mesa/glossary#stop-network-slot) to ensure all nodes converge on the same state. + +{/* TODO(PR #1133, glyh #3198914880): Add a dedicated "Fork Schedule" page that lists the concrete values — Mesa genesis timestamp, stop-transaction-slot (`slot_tx_end`), stop-network-slot (`slot_chain_end`) — and link to it from every glossary anchor used here. Until it exists, links point at the glossary definitions. */} | Actor | What to do | |---|---| @@ -6433,8 +6445,8 @@ mina client status # verify Mesa chain ID | **Block Producers** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Modes](/network-upgrades/mesa/upgrade-modes), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **SNARK Workers / Coordinators** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **Archive Node Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Rosetta API Operators** | [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Appendix](/network-upgrades/mesa/appendix) | +| **Rosetta API Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Appendix](/network-upgrades/mesa/appendix) | ## Network Details @@ -8340,7 +8352,7 @@ If you are doing the trustless upgrade, then: Exchanges shall disable MINA deposits and withdrawals during the state finalization period (the period between _stop-transaction-slot_ and _stop-network-slot_) since any transactions after the _stop-transaction-slot_ will not be part of the upgraded chain. -Remember that although you might be able to submit transactions, the majority of the block producers will be running a node that discards any blocks with transactions. +Note that this assumes the majority of block producers are running the [stop-slot release](/network-upgrades/mesa/glossary#stop-slot-release), which is what enforces the transaction cutoff. If your own node is still on a pre-stop-slot build, you might technically be able to submit transactions, but the block producers running the stop-slot release will discard any blocks containing them. --- url: /network-upgrades/mesa/upgrade-steps/upgrade @@ -8362,7 +8374,7 @@ If you are using **Manual mode**: 1. During the upgrade phase (between _stop-network-slot_ and the publishing of the Mesa release), block producers can shut down their nodes. 2. After the publication of the Mesa node release, block producers and SNARK workers should upgrade their nodes and be prepared for block production at the genesis timestamp, which is the slot when the first Mesa block will be produced. -3. It is possible to continue using the same libp2p key after the upgrade. Remember to adjust the new flag to pass the libp2p key to the node. +3. It is possible to continue using the same libp2p key after the upgrade. Pass it to the Mesa daemon with the [`--libp2p-keypair`](/network-upgrades/mesa/upgrade-steps/post-upgrade#flag-and-configuration-reference) flag (see the Flag and Configuration Reference on the Post-Upgrade page). ## Archive Node Operators and Rosetta Operators From a72fe43c7e2102efc19acb6a79f7a0c5e833b9ba Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 14:03:01 +0200 Subject: [PATCH 30/45] =?UTF-8?q?Mesa=20timings:=201h=20=E2=86=92=203h=20a?= =?UTF-8?q?fter=20release,=205h=20finalization=20(exact,=20not=20approx)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cjjdespres confirmed both fork-window intervals are exact, not approximate (#3220498212): stop-transaction-slot → stop-network-slot is exactly 5 hours (100 slots), and stop-network-slot → Mesa genesis timestamp is exactly 3 hours after the Mesa release is published. The docs previously claimed the Mesa genesis was ~1 hour after release, which was wrong (yamimaio #3228460881, #3228677488, #3230200067). Update every reference accordingly: mesa/index.mdx: - Timeline table: "~5 hours" → "Exactly 5 hours"; "~1 hour" → "Exactly 3 hours" - Phase 2 heading: "(~5 hours)" → "(exactly 5 hours)" - Phase 4 intro: "At approximately 1 hour" → "Exactly 3 hours" - Alice example: "About 1 hour" → "Exactly 3 hours" - Carlos example: "About 1 hour later" → "Exactly 3 hours after the Mesa release is published" (also clarifies which clock is starting) - Alice State Finalization narrative: "for ~100 slots (~5 hours)" → "for 100 slots (exactly 5 hours)" mesa/glossary.mdx: - Stop-Transaction-Slot: "approximately 100 more slots" → "exactly 100 more slots (5 hours)" - State Finalization: "approximately 100 slots (~5 hours)" → "100 slots, which is exactly 5 hours" - Mesa Genesis Timestamp: "approximately 1 hour after the Mesa release is published" → "exactly 3 hours after the Mesa release is published" mesa/upgrade-modes-details.mdx: - "The gap between these two slots (approximately 100 slots)" → "exactly 100 slots (5 hours)" mesa/upgrade-steps/post-upgrade.mdx: - "approximately 1 hour after the publishing of the Mesa node release" → "Exactly 3 hours after the publishing of the Mesa node release" Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/glossary.mdx | 6 ++--- docs/network-upgrades/mesa/index.mdx | 14 +++++------ .../mesa/upgrade-modes-details.mdx | 2 +- .../mesa/upgrade-steps/post-upgrade.mdx | 2 +- static/llms-full.txt | 24 +++++++++---------- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/docs/network-upgrades/mesa/glossary.mdx b/docs/network-upgrades/mesa/glossary.mdx index 54bc54fb5..9a4b6b161 100644 --- a/docs/network-upgrades/mesa/glossary.mdx +++ b/docs/network-upgrades/mesa/glossary.mdx @@ -34,7 +34,7 @@ The Mina release (version 3.x.x) that node operators install **before** the fork ### Stop-Transaction-Slot {#stop-transaction-slot} -A predefined global slot number baked into the [stop-slot release](#stop-slot-release). When the network reaches this slot, nodes stop accepting new user transactions. Block production continues with empty blocks (no user commands, no coinbase, no fee transfers) for approximately 100 more slots until the [stop-network-slot](#stop-network-slot). This is the point where exchanges must disable deposits and withdrawals. +A predefined global slot number baked into the [stop-slot release](#stop-slot-release). When the network reaches this slot, nodes stop accepting new user transactions. Block production continues with empty blocks (no user commands, no coinbase, no fee transfers) for exactly 100 more slots (5 hours) until the [stop-network-slot](#stop-network-slot). This is the point where exchanges must disable deposits and withdrawals. Referred to as `slot_tx_end` in the Mina codebase and daemon configuration. @@ -46,11 +46,11 @@ Referred to as `slot_chain_end` in the Mina codebase and daemon configuration. ### State Finalization -The stabilization period between the [stop-transaction-slot](#stop-transaction-slot) and the [stop-network-slot](#stop-network-slot) — approximately 100 slots (~5 hours). During this window, empty blocks are produced so that all nodes converge on the same final state. No operator action is required; nodes should remain running. See [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). +The stabilization period between the [stop-transaction-slot](#stop-transaction-slot) and the [stop-network-slot](#stop-network-slot) — 100 slots, which is exactly 5 hours. During this window, empty blocks are produced so that all nodes converge on the same final state. No operator action is required; nodes should remain running. See [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). ### Mesa Genesis Timestamp -The predefined time (approximately 1 hour after the Mesa release is published) at which the first block is produced on the new Mesa chain. This marks the start of the upgraded network. +The predefined time at which the first block is produced on the new Mesa chain — exactly 3 hours after the Mesa release is published. This marks the start of the upgraded network. ### Mesa Release diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 6776ede61..1d1c14182 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -56,8 +56,8 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* | Milestone | When | What happens | |---|---|---| | **stop-transaction-slot** | Hours before the fork | Network stops accepting new transactions | -| **stop-network-slot** | ~5 hours after stop-transaction-slot | Block production halts entirely | -| **Mesa genesis timestamp** | ~1 hour after Mesa release is published | First Mesa block is produced | +| **stop-network-slot** | Exactly 5 hours after stop-transaction-slot | Block production halts entirely | +| **Mesa genesis timestamp** | Exactly 3 hours after the Mesa release is published | First Mesa block is produced | --- @@ -83,7 +83,7 @@ Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pr --- -### Phase 2: State Finalization — hours before the fork (~5 hours) +### Phase 2: State Finalization — hours before the fork (exactly 5 hours) > **Goal:** The network reaches consensus on a final state. No new transactions are accepted. @@ -126,7 +126,7 @@ At the **stop-network-slot**, block production stops entirely. o1Labs exports th > **Goal:** Block production resumes on the Mesa network. Normal operations return. -At approximately **1 hour** after the Mesa release is published, at the predefined Mesa genesis timestamp, the first Mesa block is produced. +Exactly **3 hours** after the Mesa release is published, at the predefined Mesa genesis timestamp, the first Mesa block is produced. | Actor | What to do | |---|---| @@ -224,7 +224,7 @@ She starts her node normally. The automode dispatcher runs the pre-fork binary u > For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). -**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for ~100 slots (~5 hours) until all nodes agree on the final state. +**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for 100 slots (exactly 5 hours) until all nodes agree on the final state. > For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). @@ -232,7 +232,7 @@ She starts her node normally. The automode dispatcher runs the pre-fork binary u > For what happens if you chose manual mode instead, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). For details on the restart mechanism, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements). -**After the fork (Post-Upgrade)** — About 1 hour after the Mesa release is published, the first Mesa block is produced. Alice verifies: +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, the first Mesa block is produced. Alice verifies: ```bash # Check if the activated file exists (path depends on your config directory and network ID) @@ -303,7 +303,7 @@ docker run --name mina -d \ > For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). -**After the fork (Post-Upgrade)** — About 1 hour later, block production starts. Carlos verifies: +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, block production starts. Carlos verifies: ```bash docker exec mina mina client status # confirms Mesa chain ID diff --git a/docs/network-upgrades/mesa/upgrade-modes-details.mdx b/docs/network-upgrades/mesa/upgrade-modes-details.mdx index 0ee84b216..4c82e5254 100644 --- a/docs/network-upgrades/mesa/upgrade-modes-details.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes-details.mdx @@ -36,7 +36,7 @@ Both modes rely on two critical slot numbers baked into the stop-slot release (3 | **stop-transaction-slot** | The network stops accepting transactions. Blocks produced after this slot are empty — no user commands, no coinbase rewards, no fee transfers. This begins the State Finalization period. | | **stop-network-slot** | The network stops producing and accepting blocks entirely. The chain halts. This is the point where the fork happens. | -The gap between these two slots (approximately 100 slots) is the **State Finalization** period. It ensures all nodes converge on the same final state before the fork. +The gap between these two slots is exactly 100 slots (5 hours) — the **State Finalization** period. It ensures all nodes converge on the same final state before the fork. :::tip For block producers You **will not earn block rewards** during State Finalization (no coinbase), but you **must keep your node running** to maintain network stability and block density. If you are in the Delegation Program, uptime tracking continues during this phase. diff --git a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx index 639b4d4d9..d203f9c97 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx @@ -17,7 +17,7 @@ import TabItem from '@theme/TabItem'; # Post-Upgrade -At approximately 1 hour after the publishing of the Mesa node release, at a predefined slot (Mesa genesis timestamp), block production starts and the network is successfully upgraded. +Exactly 3 hours after the publishing of the Mesa node release, at the predefined Mesa genesis timestamp slot, block production starts and the network is successfully upgraded. This page helps you **verify your node is healthy** and running on the Mesa chain. diff --git a/static/llms-full.txt b/static/llms-full.txt index 9f79578ae..72427567f 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5818,7 +5818,7 @@ The Mina release (version 3.x.x) that node operators install **before** the fork ### Stop-Transaction-Slot {#stop-transaction-slot} -A predefined global slot number baked into the [stop-slot release](#stop-slot-release). When the network reaches this slot, nodes stop accepting new user transactions. Block production continues with empty blocks (no user commands, no coinbase, no fee transfers) for approximately 100 more slots until the [stop-network-slot](#stop-network-slot). This is the point where exchanges must disable deposits and withdrawals. +A predefined global slot number baked into the [stop-slot release](#stop-slot-release). When the network reaches this slot, nodes stop accepting new user transactions. Block production continues with empty blocks (no user commands, no coinbase, no fee transfers) for exactly 100 more slots (5 hours) until the [stop-network-slot](#stop-network-slot). This is the point where exchanges must disable deposits and withdrawals. Referred to as `slot_tx_end` in the Mina codebase and daemon configuration. @@ -5830,11 +5830,11 @@ Referred to as `slot_chain_end` in the Mina codebase and daemon configuration. ### State Finalization -The stabilization period between the [stop-transaction-slot](#stop-transaction-slot) and the [stop-network-slot](#stop-network-slot) — approximately 100 slots (~5 hours). During this window, empty blocks are produced so that all nodes converge on the same final state. No operator action is required; nodes should remain running. See [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). +The stabilization period between the [stop-transaction-slot](#stop-transaction-slot) and the [stop-network-slot](#stop-network-slot) — 100 slots, which is exactly 5 hours. During this window, empty blocks are produced so that all nodes converge on the same final state. No operator action is required; nodes should remain running. See [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). ### Mesa Genesis Timestamp -The predefined time (approximately 1 hour after the Mesa release is published) at which the first block is produced on the new Mesa chain. This marks the start of the upgraded network. +The predefined time at which the first block is produced on the new Mesa chain — exactly 3 hours after the Mesa release is published. This marks the start of the upgraded network. ### Mesa Release @@ -5965,8 +5965,8 @@ The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization* | Milestone | When | What happens | |---|---|---| | **stop-transaction-slot** | Hours before the fork | Network stops accepting new transactions | -| **stop-network-slot** | ~5 hours after stop-transaction-slot | Block production halts entirely | -| **Mesa genesis timestamp** | ~1 hour after Mesa release is published | First Mesa block is produced | +| **stop-network-slot** | Exactly 5 hours after stop-transaction-slot | Block production halts entirely | +| **Mesa genesis timestamp** | Exactly 3 hours after the Mesa release is published | First Mesa block is produced | --- @@ -5992,7 +5992,7 @@ Use the detailed [Pre-Upgrade checklist](/network-upgrades/mesa/upgrade-steps/pr --- -### Phase 2: State Finalization — hours before the fork (~5 hours) +### Phase 2: State Finalization — hours before the fork (exactly 5 hours) > **Goal:** The network reaches consensus on a final state. No new transactions are accepted. @@ -6035,7 +6035,7 @@ At the **stop-network-slot**, block production stops entirely. o1Labs exports th > **Goal:** Block production resumes on the Mesa network. Normal operations return. -At approximately **1 hour** after the Mesa release is published, at the predefined Mesa genesis timestamp, the first Mesa block is produced. +Exactly **3 hours** after the Mesa release is published, at the predefined Mesa genesis timestamp, the first Mesa block is produced. | Actor | What to do | |---|---| @@ -6133,7 +6133,7 @@ She starts her node normally. The automode dispatcher runs the pre-fork binary u > For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). -**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for ~100 slots (~5 hours) until all nodes agree on the final state. +**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for 100 slots (exactly 5 hours) until all nodes agree on the final state. > For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). @@ -6141,7 +6141,7 @@ She starts her node normally. The automode dispatcher runs the pre-fork binary u > For what happens if you chose manual mode instead, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). For details on the restart mechanism, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements). -**After the fork (Post-Upgrade)** — About 1 hour after the Mesa release is published, the first Mesa block is produced. Alice verifies: +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, the first Mesa block is produced. Alice verifies: ```bash # Check if the activated file exists (path depends on your config directory and network ID) @@ -6212,7 +6212,7 @@ docker run --name mina -d \ > For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). -**After the fork (Post-Upgrade)** — About 1 hour later, block production starts. Carlos verifies: +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, block production starts. Carlos verifies: ```bash docker exec mina mina client status # confirms Mesa chain ID @@ -7105,7 +7105,7 @@ Both modes rely on two critical slot numbers baked into the stop-slot release (3 | **stop-transaction-slot** | The network stops accepting transactions. Blocks produced after this slot are empty — no user commands, no coinbase rewards, no fee transfers. This begins the State Finalization period. | | **stop-network-slot** | The network stops producing and accepting blocks entirely. The chain halts. This is the point where the fork happens. | -The gap between these two slots (approximately 100 slots) is the **State Finalization** period. It ensures all nodes converge on the same final state before the fork. +The gap between these two slots is exactly 100 slots (5 hours) — the **State Finalization** period. It ensures all nodes converge on the same final state before the fork. :::tip For block producers You **will not earn block rewards** during State Finalization (no coinbase), but you **must keep your node running** to maintain network stability and block density. If you are in the Delegation Program, uptime tracking continues during this phase. @@ -7665,7 +7665,7 @@ url: /network-upgrades/mesa/upgrade-steps/post-upgrade # Post-Upgrade -At approximately 1 hour after the publishing of the Mesa node release, at a predefined slot (Mesa genesis timestamp), block production starts and the network is successfully upgraded. +Exactly 3 hours after the publishing of the Mesa node release, at the predefined Mesa genesis timestamp slot, block production starts and the network is successfully upgraded. This page helps you **verify your node is healthy** and running on the Mesa chain. From d6aeb93e40f2e3074808ba887bc200a6982d751b Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 14:19:27 +0200 Subject: [PATCH 31/45] 4a: trim mesa/index.mdx; move Upgrade Examples to its own page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Section 4a of PR #1133 review feedback — mesa/index.mdx had grown to ~560 lines because it duplicated content available on the upgrade-modes subpage and embedded six full operator walkthroughs. Changes: - Remove the duplicated `## Upgrade Modes` body (yamimaio #3228587051, glyh #3198926587, yamimaio #3228586289). Replace with a 4-line teaser pointing at the existing upgrade-modes and upgrade-modes-details pages, which already cover the same ground in more detail. - Remove the entire `### Upgrade Examples` section (six `
        ` walkthroughs: Alice, Carlos, Diana, Eve, Frank, Bob) from mesa/index.mdx (yamimaio #3228615826). - Create a new page `docs/network-upgrades/mesa/upgrade-steps/examples.mdx` that hosts the consolidated walkthroughs. Drop the Diana (Debian manual) example — Carlos's Docker manual example already covers manual mode end-to-end (yamimaio #3228675810). The remaining five examples cover automode, manual, archive, zkApp, and exchange. - Add a short `## Examples` pointer section in mesa/index.mdx that links to the new page. - Register the new page in sidebars.js under the Upgrade Steps category. mesa/index.mdx is now ~200 lines (down from ~560). Quick Reference and Network Details remain. Regenerated static/llms-full.txt (383 pages, was 382). Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 350 +--- .../mesa/upgrade-steps/examples.mdx | 296 +++ sidebars.js | 1 + static/llms-full.txt | 1806 ++++++++--------- 4 files changed, 1176 insertions(+), 1277 deletions(-) create mode 100644 docs/network-upgrades/mesa/upgrade-steps/examples.mdx diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 1d1c14182..f462321c8 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -180,355 +180,13 @@ For step-by-step instructions, see [Upgrade Steps](/network-upgrades/mesa/upgrad ## Upgrade Modes -There are two ways to upgrade your daemon node: +The Mesa upgrade supports two modes for daemon node operators: **[Automode](/network-upgrades/mesa/upgrade-modes)** (recommended — node handles the fork transition automatically) and **[Manual](/network-upgrades/mesa/upgrade-modes)** (operator stops the node, installs the Mesa release, and restarts). -- **[Automode](/network-upgrades/mesa/upgrade-modes) (Recommended):** The daemon handles the fork transition automatically. You install the stop-slot release and the node takes care of the rest — no manual intervention during the fork. -- **[Manual](/network-upgrades/mesa/upgrade-modes):** You manually stop your node after the network halts, install the Mesa release, and restart. This gives you full control. +See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for the full comparison, requirements, and the persistent-filesystem / process-restart constraints that automode imposes. For low-level details on the dispatcher and dual-binary architecture, see [Upgrade Modes — Details](/network-upgrades/mesa/upgrade-modes-details). -For in-depth technical details on the dispatcher and dual-binary architecture, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). - -:::caution Automode requires a process restart and persistent filesystem -When the fork activates, the automode daemon **shuts down cleanly** (exit code 0) after writing the Mesa configuration and an `activated` marker file to the config directory. It does **not** restart itself — your process manager must restart it. On restart, the dispatcher detects the `activated` file and launches the Mesa binary automatically. - -This means two things are required: -- **Persistent filesystem**: The config directory (e.g., `~/.mina-config` or the Docker volume at `/root/.mina-config`) **must survive across restarts**. If it is wiped, the `activated` file and generated Mesa config are lost, and the node cannot transition to Mesa. -- **Automatic restart policy**: Your process manager must be configured to restart the daemon after a clean exit: - - **systemd**: Use `Restart=always` in your service file (this is the default in the Mina systemd unit) - - **Docker**: Use `--restart=always` or `--restart=unless-stopped` when creating the container - - **Kubernetes / Helm**: Ensure your pod has `restartPolicy: Always` (the k8s default). If you use a custom `livenessProbe` or a Helm chart with its own restart logic, verify it does not treat exit code 0 as a failure that triggers a full volume wipe or pod replacement. -::: - -:::info Dispatcher limitation (current implementation) -The automode dispatcher only supports the `daemon` subcommand and `mina client status` command. Other subcommands (e.g. `mina accounts list`, `mina ledger export`) will fail with an error. This is because, for non-daemon commands, the dispatcher does not have access to the config directory location and therefore cannot determine whether the node is running Berkeley or Mesa. It is the user's responsibility to invoke the correct version-specific binary directly: `mina-berkeley` or `mina-mesa` (or the full paths `/usr/lib/mina/berkeley/mina` and `/usr/lib/mina/mesa/mina`). This limitation may be removed in a future release. -::: - ---- - -### Upgrade Examples - -The examples below walk through the entire upgrade for different roles and setups. Each follows the same four phases. Click to expand. - -
        -Example: Block Producer Upgrading with Automode (Debian) - -Imagine you are **Alice**, a block producer running on a Debian server. Here is what your upgrade looks like end to end. - -**Weeks before the fork** — Alice checks [hardware requirements](/network-upgrades/mesa/requirements) and installs the automode packages: - -```bash -sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x -``` - -She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. - -> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). - -**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for 100 slots (exactly 5 hours) until all nodes agree on the final state. - -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). - -**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Alice's daemon generates the Mesa configuration, writes the `activated` marker file, and **shuts down cleanly** (exit code 0). Because Alice uses systemd with `Restart=always`, the daemon restarts automatically. On restart, the dispatcher detects the `activated` file and launches the Mesa binary. Alice does **nothing** — this all happens automatically. - -> For what happens if you chose manual mode instead, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). For details on the restart mechanism, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements). - -**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, the first Mesa block is produced. Alice verifies: - -```bash -# Check if the activated file exists (path depends on your config directory and network ID) -ls ~/.mina-config/auto-fork-mesa-mainnet/activated - -# Confirm Mesa chain ID -mina client status -``` - -:::note Dispatcher and non-daemon commands -The automode dispatcher only supports the `daemon` subcommand and `client status` command — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. -::: - -She's done. Her node is producing blocks on Mesa. - -> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). - -
        - -
        -Example: Block Producer — Manual Mode (Docker) - -**Carlos** runs a block producer using Docker and prefers manual control over the upgrade. - -**Weeks before the fork** — Carlos pulls the stop-slot Docker image and starts his node: - -```bash -docker pull minaprotocol/mina-daemon:-bullseye-mainnet - -docker run --name mina -d \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ - --file-log-rotations 500 \ - --log-json -``` - -> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). - -**Hours before the fork (State Finalization)** — Carlos keeps his node running. He does **nothing** during this phase. - -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). - -**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Carlos waits for the Mesa release announcement, then swaps to the new image. - -> Throughout these examples, `` is a placeholder for the Mesa release tag announced for your target network. For the **preflight** network the current value is published on [Preflight Network](/network-upgrades/mesa/preflight-network); for **devnet/mainnet** the value will be published with the corresponding release announcement. - -```bash -docker stop mina && docker rm mina - -docker pull minaprotocol/mina-daemon:-bullseye-mainnet - -docker run --name mina -d \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ - --file-log-rotations 500 \ - --log-json -``` - -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). - -**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, block production starts. Carlos verifies: - -```bash -docker exec mina mina client status # confirms Mesa chain ID -``` - -> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). - -
        - -
        -Example: Block Producer — Manual Mode (Debian) - -**Diana** runs a block producer on a Debian server using systemd and prefers to upgrade manually. - -**Weeks before the fork** — Diana installs the stop-slot release: - -```bash -sudo apt-get update -sudo apt-get install mina-mainnet=3.x.x -``` - -She restarts her node via systemd and confirms it syncs. - -> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). - -**Hours before the fork (State Finalization)** — Diana keeps her node running. No action required. - -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). - -**Fork day (Upgrade)** — The network halts. Diana waits for the Mesa release announcement, then upgrades: - -```bash -sudo systemctl stop mina - -sudo apt-get update -sudo apt-get install mina-mainnet=4.x.x - -# Restart with the same flags (libp2p key can be reused) -sudo systemctl start mina -``` - -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). - -**After the fork (Post-Upgrade)** — Block production resumes. Diana verifies: - -```bash -mina client status # confirms Mesa chain ID -``` - -> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). - -
        - -
        -Example: Archive Node / Explorer Operator - -**Eve** runs an archive node, a Rosetta API instance, and a block explorer. She needs to upgrade both the daemon and the database. - -**Weeks before the fork** — Eve installs the stop-slot release and decides on her upgrade method: - -```bash -sudo apt-get update -sudo apt-get install mina-mainnet=3.x.x -``` - -She chooses the **trustless** path — running the upgrade script early, while her archive is still online: - -```bash -# Back up the database first -pg_dump -U archive_db > berkeley-archive-backup.sql - -# Download and run the upgrade script (completes in under 1 minute) -curl -O https://raw.githubusercontent.com/MinaProtocol/mina/refs/heads/mesa/src/app/archive/upgrade_to_mesa.sql -psql -U -d archive_db -f upgrade_to_mesa.sql - -# Verify -psql -U -d archive_db -c "SELECT * FROM version;" -``` - -The script is backward-compatible — her existing Berkeley archive node keeps working normally after the upgrade. - -> For the full archive upgrade guide, see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). - -**Hours before the fork (State Finalization)** — Eve keeps her archive node running to capture all finalized blocks. - -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). - -**Fork day (Upgrade)** — The network halts. Eve installs the Mesa archive release and points it at her already-upgraded database: - -```bash -sudo systemctl stop mina-archive -sudo systemctl stop mina - -sudo apt-get update -sudo apt-get install mina-archive-mainnet=4.x.x mina-mainnet=4.x.x - -# Start archive process pointing to the upgraded DB -mina-archive run \ - --postgres-uri postgres://:@localhost:5432/archive_db \ - --server-port 3086 \ - --log-json --log-level DEBUG - -# Start the non-block-producing daemon connected to the archive -mina daemon \ - --archive-address localhost:3086 \ - --config-directory ~/.mina-config \ - --libp2p-keypair ~/keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ - --file-log-rotations 500 \ - --log-json -``` - -She also restarts Rosetta: - -```bash -docker run --name rosetta --rm -d \ - -p 3088:3088 \ - --entrypoint '' \ - minaprotocol/mina-rosetta:-bullseye-mainnet \ - /usr/local/bin/mina-rosetta \ - --archive-uri "postgres://:@localhost:5432/archive_db" \ - --graphql-uri "http://localhost:3085/graphql" \ - --log-json --port 3088 -``` - -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). - -**After the fork (Post-Upgrade)** — Block production resumes. Eve verifies data integrity: - -```bash -# Check the archive is in sync -mina client status - -# Run the verification toolbox -mina-archive-hardfork-toolbox verify-upgrade \ - --postgres-uri postgres://:@localhost:5432/archive_db \ - --protocol-version \ - --migration-version -``` - -She checks her explorer UI to confirm new Mesa blocks are appearing and the historical data is intact. - -> For the full validation workflow, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) and the [Archive Hardfork Toolbox](/network-upgrades/mesa/archive-upgrade#verification-with-the-archive-hardfork-toolbox). - -
        - -
        -Example: zkApp Developer - -**Frank** maintains a zkApp deployed on mainnet. His contract uses on-chain state and he wants to take advantage of Mesa's expanded 32-field state. - -**Weeks before the fork** — Frank updates his o1js dependency to the Mesa-compatible version and tests his zkApp on the [preflight network](/network-upgrades/mesa/preflight-network): - -```bash -npm install o1js@3.0.0-mesa.698ca -``` - -This is the first o1js release that targets the Mesa transaction protocol. `o1js@latest` currently resolves to a pre-Mesa version and will produce transactions the post-fork preflight network rejects. See [Preflight Network](/network-upgrades/mesa/preflight-network) for the matching daemon/archive/rosetta release. - -He verifies that: -- His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network -- Transactions execute end-to-end against the redeployed contract -- If he plans to use the expanded state fields (indexes `8–31`), his updated contract version compiles and deploys on preflight - -> For details on testing with the preflight network, see [Preflight Network](/network-upgrades/mesa/preflight-network). - -**Hours before the fork (State Finalization)** — Frank does **nothing**. His deployed zkApp keeps running on the Berkeley chain. No transactions can be submitted during this phase anyway. - -**Fork day (Upgrade)** — Frank does **nothing during the network halt**. His zkApp account and on-chain state values carry over to the Mesa chain automatically (including state fields at indexes `0–7`). However, the verification key generated for Berkeley is no longer valid under the Mesa protocol — the contract cannot process transactions on Mesa until it is redeployed. - -**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank **must redeploy his zkApp** before it can accept transactions, regardless of whether he uses the new state fields: - -```bash -# Required for every zkApp — the Mesa protocol version bump invalidates the Berkeley verification key -zkapp deploy --network mainnet -``` - -If he is also adopting the expanded `8–31` state slots, this same deployment step ships the updated contract version that declares the new fields. - -> For post-upgrade details, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). - -
        - -
        -Example: Exchange Upgrading to Mesa - -**Bob** is an exchange operator. His main concern is avoiding lost deposits. - -**Weeks before the fork** — Bob tests his integration (Rosetta API, mina-signer) on the [preflight network](/network-upgrades/mesa/preflight-network). He reviews [schema changes](/network-upgrades/mesa/appendix) and installs the stop-slot release: - -```bash -sudo apt-get install mina-mainnet=3.x.x -``` - -> For the full exchange pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). - -**Hours before the fork** — Before the _stop-transaction-slot_ arrives, Bob **disables MINA deposits and withdrawals** on his platform and notifies customers about the maintenance window. - -:::danger -Any transactions submitted after the stop-transaction-slot **will not exist on the Mesa chain**. This is the most critical step for exchanges. -::: - -**Fork day** — The network halts. Bob waits for the Mesa release announcement, then upgrades: - -```bash -sudo systemctl stop mina -sudo apt-get update -sudo apt-get install mina-mainnet=4.x.x -sudo systemctl start mina -``` - -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). - -**After the fork** — Block production resumes. Bob verifies his node is on the Mesa chain, confirms Rosetta API is working, then **re-enables MINA deposits and withdrawals**. - -```bash -mina client status # verify Mesa chain ID -# test a small internal transfer before opening to customers -``` - -> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). - -
        +## Examples +End-to-end walkthroughs of the four phases for different roles (block producer automode/manual, archive node, zkApp developer, exchange) live on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. ## Quick Reference by Operator Type | Operator Type | Key Pages | diff --git a/docs/network-upgrades/mesa/upgrade-steps/examples.mdx b/docs/network-upgrades/mesa/upgrade-steps/examples.mdx new file mode 100644 index 000000000..cb3f9d3ec --- /dev/null +++ b/docs/network-upgrades/mesa/upgrade-steps/examples.mdx @@ -0,0 +1,296 @@ +--- +title: Examples +sidebar_label: Examples +hide_title: true +description: End-to-end Mesa upgrade walkthroughs by role and deployment style — block producer (automode/manual), archive node, zkApp developer, and exchange. +keywords: + - Mesa + - upgrade + - examples + - block producer + - archive node + - zkApp + - exchange +--- + +# Examples + +The walkthroughs below follow concrete operators through the four Mesa upgrade phases ([Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade), [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization), [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade)) for different roles and setups. Click to expand the example that matches your situation. + +
        +Example: Block Producer Upgrading with Automode (Debian) + +Imagine you are **Alice**, a block producer running on a Debian server. Here is what your upgrade looks like end to end. + +**Weeks before the fork** — Alice checks [hardware requirements](/network-upgrades/mesa/requirements) and installs the automode packages: + +```bash +sudo apt-get update +sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x +``` + +She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. + +> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). + +**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for 100 slots (exactly 5 hours) until all nodes agree on the final state. + +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). + +**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Alice's daemon generates the Mesa configuration, writes the `activated` marker file, and **shuts down cleanly** (exit code 0). Because Alice uses systemd with `Restart=always`, the daemon restarts automatically. On restart, the dispatcher detects the `activated` file and launches the Mesa binary. Alice does **nothing** — this all happens automatically. + +> For what happens if you chose manual mode instead, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). For details on the restart mechanism, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements). + +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, the first Mesa block is produced. Alice verifies: + +```bash +# Check if the activated file exists (path depends on your config directory and network ID) +ls ~/.mina-config/auto-fork-mesa-mainnet/activated + +# Confirm Mesa chain ID +mina client status +``` + +:::note Dispatcher and non-daemon commands +The automode dispatcher only supports the `daemon` subcommand and `client status` command — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. +::: + +She's done. Her node is producing blocks on Mesa. + +> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
        + +
        +Example: Block Producer — Manual Mode (Docker) + +**Carlos** runs a block producer using Docker and prefers manual control over the upgrade. + +**Weeks before the fork** — Carlos pulls the stop-slot Docker image and starts his node: + +```bash +docker pull minaprotocol/mina-daemon:-bullseye-mainnet + +docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:-bullseye-mainnet \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --file-log-rotations 500 \ + --log-json +``` + +> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). + +**Hours before the fork (State Finalization)** — Carlos keeps his node running. He does **nothing** during this phase. + +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). + +**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Carlos waits for the Mesa release announcement, then swaps to the new image. + +> Throughout these examples, `` is a placeholder for the Mesa release tag announced for your target network. For the **preflight** network the current value is published on [Preflight Network](/network-upgrades/mesa/preflight-network); for **devnet/mainnet** the value will be published with the corresponding release announcement. + +```bash +docker stop mina && docker rm mina + +docker pull minaprotocol/mina-daemon:-bullseye-mainnet + +docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:-bullseye-mainnet \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --file-log-rotations 500 \ + --log-json +``` + +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). + +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, block production starts. Carlos verifies: + +```bash +docker exec mina mina client status # confirms Mesa chain ID +``` + +> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
        + +
        +Example: Archive Node / Explorer Operator + +**Eve** runs an archive node, a Rosetta API instance, and a block explorer. She needs to upgrade both the daemon and the database. + +**Weeks before the fork** — Eve installs the stop-slot release and decides on her upgrade method: + +```bash +sudo apt-get update +sudo apt-get install mina-mainnet=3.x.x +``` + +She chooses the **trustless** path — running the upgrade script early, while her archive is still online: + +```bash +# Back up the database first +pg_dump -U archive_db > berkeley-archive-backup.sql + +# Download and run the upgrade script (completes in under 1 minute) +curl -O https://raw.githubusercontent.com/MinaProtocol/mina/refs/heads/mesa/src/app/archive/upgrade_to_mesa.sql +psql -U -d archive_db -f upgrade_to_mesa.sql + +# Verify +psql -U -d archive_db -c "SELECT * FROM version;" +``` + +The script is backward-compatible — her existing Berkeley archive node keeps working normally after the upgrade. + +> For the full archive upgrade guide, see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). + +**Hours before the fork (State Finalization)** — Eve keeps her archive node running to capture all finalized blocks. + +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). + +**Fork day (Upgrade)** — The network halts. Eve installs the Mesa archive release and points it at her already-upgraded database: + +```bash +sudo systemctl stop mina-archive +sudo systemctl stop mina + +sudo apt-get update +sudo apt-get install mina-archive-mainnet=4.x.x mina-mainnet=4.x.x + +# Start archive process pointing to the upgraded DB +mina-archive run \ + --postgres-uri postgres://:@localhost:5432/archive_db \ + --server-port 3086 \ + --log-json --log-level DEBUG + +# Start the non-block-producing daemon connected to the archive +mina daemon \ + --archive-address localhost:3086 \ + --config-directory ~/.mina-config \ + --libp2p-keypair ~/keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --file-log-rotations 500 \ + --log-json +``` + +She also restarts Rosetta: + +```bash +docker run --name rosetta --rm -d \ + -p 3088:3088 \ + --entrypoint '' \ + minaprotocol/mina-rosetta:-bullseye-mainnet \ + /usr/local/bin/mina-rosetta \ + --archive-uri "postgres://:@localhost:5432/archive_db" \ + --graphql-uri "http://localhost:3085/graphql" \ + --log-json --port 3088 +``` + +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). + +**After the fork (Post-Upgrade)** — Block production resumes. Eve verifies data integrity: + +```bash +# Check the archive is in sync +mina client status + +# Run the verification toolbox +mina-archive-hardfork-toolbox verify-upgrade \ + --postgres-uri postgres://:@localhost:5432/archive_db \ + --protocol-version \ + --migration-version +``` + +She checks her explorer UI to confirm new Mesa blocks are appearing and the historical data is intact. + +> For the full validation workflow, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) and the [Archive Hardfork Toolbox](/network-upgrades/mesa/archive-upgrade#verification-with-the-archive-hardfork-toolbox). + +
        + +
        +Example: zkApp Developer + +**Frank** maintains a zkApp deployed on mainnet. His contract uses on-chain state and he wants to take advantage of Mesa's expanded 32-field state. + +**Weeks before the fork** — Frank updates his o1js dependency to the Mesa-compatible version and tests his zkApp on the [preflight network](/network-upgrades/mesa/preflight-network): + +```bash +npm install o1js@3.0.0-mesa.698ca +``` + +This is the first o1js release that targets the Mesa transaction protocol. `o1js@latest` currently resolves to a pre-Mesa version and will produce transactions the post-fork preflight network rejects. See [Preflight Network](/network-upgrades/mesa/preflight-network) for the matching daemon/archive/rosetta release. + +He verifies that: +- His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network +- Transactions execute end-to-end against the redeployed contract +- If he plans to use the expanded state fields (indexes `8–31`), his updated contract version compiles and deploys on preflight + +> For details on testing with the preflight network, see [Preflight Network](/network-upgrades/mesa/preflight-network). + +**Hours before the fork (State Finalization)** — Frank does **nothing**. His deployed zkApp keeps running on the Berkeley chain. No transactions can be submitted during this phase anyway. + +**Fork day (Upgrade)** — Frank does **nothing during the network halt**. His zkApp account and on-chain state values carry over to the Mesa chain automatically (including state fields at indexes `0–7`). However, the verification key generated for Berkeley is no longer valid under the Mesa protocol — the contract cannot process transactions on Mesa until it is redeployed. + +**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank **must redeploy his zkApp** before it can accept transactions, regardless of whether he uses the new state fields: + +```bash +# Required for every zkApp — the Mesa protocol version bump invalidates the Berkeley verification key +zkapp deploy --network mainnet +``` + +If he is also adopting the expanded `8–31` state slots, this same deployment step ships the updated contract version that declares the new fields. + +> For post-upgrade details, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
        + +
        +Example: Exchange Upgrading to Mesa + +**Bob** is an exchange operator. His main concern is avoiding lost deposits. + +**Weeks before the fork** — Bob tests his integration (Rosetta API, mina-signer) on the [preflight network](/network-upgrades/mesa/preflight-network). He reviews [schema changes](/network-upgrades/mesa/appendix) and installs the stop-slot release: + +```bash +sudo apt-get install mina-mainnet=3.x.x +``` + +> For the full exchange pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). + +**Hours before the fork** — Before the _stop-transaction-slot_ arrives, Bob **disables MINA deposits and withdrawals** on his platform and notifies customers about the maintenance window. + +:::danger +Any transactions submitted after the stop-transaction-slot **will not exist on the Mesa chain**. This is the most critical step for exchanges. +::: + +**Fork day** — The network halts. Bob waits for the Mesa release announcement, then upgrades: + +```bash +sudo systemctl stop mina +sudo apt-get update +sudo apt-get install mina-mainnet=4.x.x +sudo systemctl start mina +``` + +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). + +**After the fork** — Block production resumes. Bob verifies his node is on the Mesa chain, confirms Rosetta API is working, then **re-enables MINA deposits and withdrawals**. + +```bash +mina client status # verify Mesa chain ID +# test a small internal transfer before opening to customers +``` + +> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). + +
        diff --git a/sidebars.js b/sidebars.js index 8626312b2..b8e0ec084 100644 --- a/sidebars.js +++ b/sidebars.js @@ -70,6 +70,7 @@ module.exports = { 'network-upgrades/mesa/upgrade-steps/state-finalization', 'network-upgrades/mesa/upgrade-steps/upgrade', 'network-upgrades/mesa/upgrade-steps/post-upgrade', + 'network-upgrades/mesa/upgrade-steps/examples', ], }, 'network-upgrades/mesa/archive-upgrade', diff --git a/static/llms-full.txt b/static/llms-full.txt index 72427567f..9e9d0d5b1 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -6089,1384 +6089,1328 @@ For step-by-step instructions, see [Upgrade Steps](/network-upgrades/mesa/upgrad ## Upgrade Modes -There are two ways to upgrade your daemon node: +The Mesa upgrade supports two modes for daemon node operators: **[Automode](/network-upgrades/mesa/upgrade-modes)** (recommended — node handles the fork transition automatically) and **[Manual](/network-upgrades/mesa/upgrade-modes)** (operator stops the node, installs the Mesa release, and restarts). -- **[Automode](/network-upgrades/mesa/upgrade-modes) (Recommended):** The daemon handles the fork transition automatically. You install the stop-slot release and the node takes care of the rest — no manual intervention during the fork. -- **[Manual](/network-upgrades/mesa/upgrade-modes):** You manually stop your node after the network halts, install the Mesa release, and restart. This gives you full control. +See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for the full comparison, requirements, and the persistent-filesystem / process-restart constraints that automode imposes. For low-level details on the dispatcher and dual-binary architecture, see [Upgrade Modes — Details](/network-upgrades/mesa/upgrade-modes-details). -For in-depth technical details on the dispatcher and dual-binary architecture, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). - -:::caution Automode requires a process restart and persistent filesystem -When the fork activates, the automode daemon **shuts down cleanly** (exit code 0) after writing the Mesa configuration and an `activated` marker file to the config directory. It does **not** restart itself — your process manager must restart it. On restart, the dispatcher detects the `activated` file and launches the Mesa binary automatically. - -This means two things are required: -- **Persistent filesystem**: The config directory (e.g., `~/.mina-config` or the Docker volume at `/root/.mina-config`) **must survive across restarts**. If it is wiped, the `activated` file and generated Mesa config are lost, and the node cannot transition to Mesa. -- **Automatic restart policy**: Your process manager must be configured to restart the daemon after a clean exit: - - **systemd**: Use `Restart=always` in your service file (this is the default in the Mina systemd unit) - - **Docker**: Use `--restart=always` or `--restart=unless-stopped` when creating the container - - **Kubernetes / Helm**: Ensure your pod has `restartPolicy: Always` (the k8s default). If you use a custom `livenessProbe` or a Helm chart with its own restart logic, verify it does not treat exit code 0 as a failure that triggers a full volume wipe or pod replacement. -::: +## Examples -:::info Dispatcher limitation (current implementation) -The automode dispatcher only supports the `daemon` subcommand and `mina client status` command. Other subcommands (e.g. `mina accounts list`, `mina ledger export`) will fail with an error. This is because, for non-daemon commands, the dispatcher does not have access to the config directory location and therefore cannot determine whether the node is running Berkeley or Mesa. It is the user's responsibility to invoke the correct version-specific binary directly: `mina-berkeley` or `mina-mesa` (or the full paths `/usr/lib/mina/berkeley/mina` and `/usr/lib/mina/mesa/mina`). This limitation may be removed in a future release. -::: +End-to-end walkthroughs of the four phases for different roles (block producer automode/manual, archive node, zkApp developer, exchange) live on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. +## Quick Reference by Operator Type ---- +| Operator Type | Key Pages | +|---|---| +| **Block Producers** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Modes](/network-upgrades/mesa/upgrade-modes), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **SNARK Workers / Coordinators** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Archive Node Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Rosetta API Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | +| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Appendix](/network-upgrades/mesa/appendix) | -### Upgrade Examples +## Network Details -The examples below walk through the entire upgrade for different roles and setups. Each follows the same four phases. Click to expand. +The values below describe the **current Mainnet (pre-fork)** chain. They will change after the Mesa fork activates — the post-fork Chain ID, Git SHA-1, and node build link will be published in the Mesa release announcement. -
        -Example: Block Producer Upgrading with Automode (Debian) +``` +Chain ID (Mainnet, pre-fork) +a7351abc7ddf2ea92d1b38cc8e636c271c1dfd2c081c637f62ebc2af34eb7cc1 -Imagine you are **Alice**, a block producer running on a Debian server. Here is what your upgrade looks like end to end. +Git SHA-1 (Mainnet, pre-fork) +ae112d3a96fe71b4ccccf3c54e7b7494db4898a4 -**Weeks before the fork** — Alice checks [hardware requirements](/network-upgrades/mesa/requirements) and installs the automode packages: +Seed List +https://bootnodes.minaprotocol.com/networks/mainnet.txt -```bash -sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x +Node build +https://github.com/MinaProtocol/mina/releases?q=mesa ``` -She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. +{/* TODO(PR #1133): When the Mesa mainnet release is cut, add the post-fork Chain ID, Git SHA-1, and the specific release tag URL alongside the pre-fork values above. For the current preflight values, see [Preflight Network](/network-upgrades/mesa/preflight-network). */} -> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). +--- +url: /network-upgrades/mesa/preflight-network +--- -**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for 100 slots (exactly 5 hours) until all nodes agree on the final state. +# Connect to Mesa Preflight Network -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). +The Mesa preflight network is a testing environment for validating the Mesa upgrade before deployment to devnet and mainnet. This network allows node operators and developers to test their infrastructure and applications with the new Mesa release. -**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Alice's daemon generates the Mesa configuration, writes the `activated` marker file, and **shuts down cleanly** (exit code 0). Because Alice uses systemd with `Restart=always`, the daemon restarts automatically. On restart, the dispatcher detects the `activated` file and launches the Mesa binary. Alice does **nothing** — this all happens automatically. +:::tip Mesa preflight hard fork completed -> For what happens if you chose manual mode instead, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). For details on the restart mechanism, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements). +The Mesa preflight network hard-forked at **2026-04-27 13:00 UTC**. The post-fork chain is now running the Mesa release **`4.0.0-preflight-3f038cb`**, which bumps the **transaction protocol version to 5.0.0**. -**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, the first Mesa block is produced. Alice verifies: +The transaction protocol bump is a breaking wire-format change: any node still running a pre-fork build (including the stop-slot release `4.0.0-preflight-stop-2967b39` and the original preflight build `4.0.0-preflight1-b649c79`) will reject the new transaction format and is no longer compatible with the network. Upgrade to **`4.0.0-preflight-3f038cb`** to resume participation. -```bash -# Check if the activated file exists (path depends on your config directory and network ID) -ls ~/.mina-config/auto-fork-mesa-mainnet/activated +zkApp developers must rebuild and redeploy against **`o1js@3.0.0-mesa.698ca`** — the first o1js release that targets transaction protocol v5.0.0. Transactions produced by earlier o1js versions will be rejected by post-fork nodes. -# Confirm Mesa chain ID -mina client status -``` +A dedicated **Upgrade Steps** page covering the post-fork operator checklist will be linked from the Mesa Upgrade sidebar once it ships. -:::note Dispatcher and non-daemon commands -The automode dispatcher only supports the `daemon` subcommand and `client status` command — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. ::: -She's done. Her node is producing blocks on Mesa. - -> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). +:::caution Preflight Network Notice -
        +The preflight network is intended for testing purposes only. This network may experience instability, breaking changes, and unexpected behavior. Data on this network should not be considered persistent or reliable. -
        -Example: Block Producer — Manual Mode (Docker) +::: -**Carlos** runs a block producer using Docker and prefers manual control over the upgrade. +## Available Build Versions -**Weeks before the fork** — Carlos pulls the stop-slot Docker image and starts his node: +The Mesa preflight network uses the following build versions: -```bash -docker pull minaprotocol/mina-daemon:-bullseye-mainnet +**Current version (install this):** `4.0.0-preflight-3f038cb` — post-hard-fork release. Implements transaction protocol version **5.0.0** and is the only build compatible with the post-fork chain. -docker run --name mina -d \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ - --file-log-rotations 500 \ - --log-json -``` +**Compatible o1js release:** `o1js@3.0.0-mesa.698ca` — the matching SDK for transaction protocol v5.0.0. Install with `npm install o1js@3.0.0-mesa.698ca` (or the equivalent for your package manager) when developing or redeploying zkApps against the post-fork preflight network. -> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). +**Previous versions (historical, do not install on new nodes):** -**Hours before the fork (State Finalization)** — Carlos keeps his node running. He does **nothing** during this phase. +- `4.0.0-preflight-stop-2967b39` — stop-slot release used to carry nodes up to the fork. Pre-fork transaction protocol; incompatible with the post-fork chain. +- `4.0.0-preflight1-b649c79` — original preflight build. Listed for reference only. -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). +### Docker Images -**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Carlos waits for the Mesa release announcement, then swaps to the new image. +Docker images are available for both `amd64` and `arm64` architectures, on the `bookworm` and `noble` base distributions: -> Throughout these examples, `` is a placeholder for the Mesa release tag announced for your target network. For the **preflight** network the current value is published on [Preflight Network](/network-upgrades/mesa/preflight-network); for **devnet/mainnet** the value will be published with the corresponding release announcement. +- **Mina Daemon:** `gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa` +- **Archive Node:** `gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-3f038cb-bookworm-mesa` +- **Rosetta:** `gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-3f038cb-bookworm-mesa` -```bash -docker stop mina && docker rm mina +For `noble`, swap `bookworm` for `noble` in the tag (e.g. `mina-daemon:4.0.0-preflight-3f038cb-noble-mesa`). -docker pull minaprotocol/mina-daemon:-bullseye-mainnet +### Debian Packages -docker run --name mina -d \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ - --file-log-rotations 500 \ - --log-json -``` +Debian packages are available from the unstable repository: -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). +**Repository:** `unstable.apt.packages.minaprotocol.com` +**Channel:** `preflight` +**Codenames:** `bookworm`, `noble` -**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, block production starts. Carlos verifies: +Available packages (each at version `4.0.0-preflight-3f038cb`): -```bash -docker exec mina mina client status # confirms Mesa chain ID -``` +- `mina-mesa` +- `mina-archive-mesa` +- `mina-rosetta-mesa` -> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). +For detailed information about the Debian repository structure and configuration, please refer to the [Debian Repository documentation](https://unstable.apt.packages.minaprotocol.com/). -
        +## Connecting to the Network -
        -Example: Block Producer — Manual Mode (Debian) +To connect your node to the Mesa preflight network, you must use the preflight network seed peer list. -**Diana** runs a block producer on a Debian server using systemd and prefers to upgrade manually. +### Required Parameter -**Weeks before the fork** — Diana installs the stop-slot release: +Add the following parameter to your mina daemon command: ```bash -sudo apt-get update -sudo apt-get install mina-mainnet=3.x.x +--peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt ``` -She restarts her node via systemd and confirms it syncs. - -> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). - -**Hours before the fork (State Finalization)** — Diana keeps her node running. No action required. - -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). +### Example: Running with Docker -**Fork day (Upgrade)** — The network halts. Diana waits for the Mesa release announcement, then upgrades: +To start a Mina daemon node using Docker: ```bash -sudo systemctl stop mina - -sudo apt-get update -sudo apt-get install mina-mainnet=4.x.x - -# Restart with the same flags (libp2p key can be reused) -sudo systemctl start mina +docker run --name mina-mesa-preflight -d \ + -p 8302:8302 \ + --restart=always \ + gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa \ + daemon \ + --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt ``` -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). - -**After the fork (Post-Upgrade)** — Block production resumes. Diana verifies: +For production deployments, you'll want to mount configuration directories and add additional flags: ```bash -mina client status # confirms Mesa chain ID +docker run --name mina-mesa-preflight -d \ + -p 8302:8302 \ + --restart=always \ + -v $(pwd)/.mina-config:/root/.mina-config \ + gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa \ + daemon \ + --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ + --libp2p-keypair /data/.mina-config/keys/libp2p-key ``` -> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). +### Example: Running with Debian Package -
        +First, install dependencies and configure the repository: -
        -Example: Archive Node / Explorer Operator +```bash +# Step 1: Install dependencies +sudo apt-get install -y lsb-release ca-certificates wget gnupg -**Eve** runs an archive node, a Rosetta API instance, and a block explorer. She needs to upgrade both the daemon and the database. +# Step 2: Import the GPG key +wget -q https://unstable.apt.packages.minaprotocol.com/repo-signing-key.gpg \ + -O /etc/apt/trusted.gpg.d/minaprotocol.gpg -**Weeks before the fork** — Eve installs the stop-slot release and decides on her upgrade method: +# Step 3: Add the unstable repository with preflight channel +echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) preflight" | \ + sudo tee /etc/apt/sources.list.d/mina-preflight.list -```bash +# Step 4: Update and install sudo apt-get update -sudo apt-get install mina-mainnet=3.x.x +sudo apt-get install -y mina-mesa=4.0.0-preflight-3f038cb ``` -She chooses the **trustless** path — running the upgrade script early, while her archive is still online: +Then start the daemon: ```bash -# Back up the database first -pg_dump -U archive_db > berkeley-archive-backup.sql +mina daemon \ + --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ + --libp2p-keypair ~/.mina-config/keys/libp2p-key +``` -# Download and run the upgrade script (completes in under 1 minute) -curl -O https://raw.githubusercontent.com/MinaProtocol/mina/refs/heads/mesa/src/app/archive/upgrade_to_mesa.sql -psql -U -d archive_db -f upgrade_to_mesa.sql +### Running Archive Node -# Verify -psql -U -d archive_db -c "SELECT * FROM version;" -``` +:::info Upgrading from Berkeley to Mesa -The script is backward-compatible — her existing Berkeley archive node keeps working normally after the upgrade. +If you have an existing Berkeley archive database that you want to upgrade to Mesa, please refer to the comprehensive [Archive Upgrade](archive-upgrade) guide for detailed instructions on: +- Upgrade prerequisites and requirements +- Running the upgrade script +- Rollback procedures +- Database schema changes +- Verification steps -> For the full archive upgrade guide, see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). +::: -**Hours before the fork (State Finalization)** — Eve keeps her archive node running to capture all finalized blocks. +#### Installing and Running Mesa Archive Node -> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). +An archive node stores the full history of the blockchain and provides a GraphQL API for querying historical data. It requires a PostgreSQL database. -**Fork day (Upgrade)** — The network halts. Eve installs the Mesa archive release and points it at her already-upgraded database: +**Installation with Debian:** ```bash -sudo systemctl stop mina-archive -sudo systemctl stop mina +# Step 1: Install dependencies +sudo apt-get install -y lsb-release ca-certificates wget gnupg postgresql postgresql-contrib + +# Step 2: Import the GPG key +wget -q https://unstable.apt.packages.minaprotocol.com/repo-signing-key.gpg \ + -O /etc/apt/trusted.gpg.d/minaprotocol.gpg + +# Step 3: Add the repository +echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) preflight" | \ + sudo tee /etc/apt/sources.list.d/mina-preflight.list +# Step 4: Install mina-archive-mesa sudo apt-get update -sudo apt-get install mina-archive-mainnet=4.x.x mina-mainnet=4.x.x +sudo apt-get install -y mina-archive-mesa=4.0.0-preflight-3f038cb -# Start archive process pointing to the upgraded DB -mina-archive run \ - --postgres-uri postgres://:@localhost:5432/archive_db \ - --server-port 3086 \ - --log-json --log-level DEBUG +# Step 5: Create PostgreSQL database +sudo -u postgres createdb archive +sudo -u postgres createuser archive_user +sudo -u postgres psql -c "ALTER USER archive_user WITH PASSWORD 'your-secure-password';" +sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE archive TO archive_user;" -# Start the non-block-producing daemon connected to the archive -mina daemon \ - --archive-address localhost:3086 \ - --config-directory ~/.mina-config \ - --libp2p-keypair ~/keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --generate-genesis-proof true \ - --file-log-rotations 500 \ - --log-json +# Step 6: Start the archive node +mina-archive run \ + --postgres-uri postgresql://archive_user:your-secure-password@localhost:5432/archive \ + --server-port 3086 ``` -She also restarts Rosetta: +**Using Docker:** ```bash -docker run --name rosetta --rm -d \ - -p 3088:3088 \ - --entrypoint '' \ - minaprotocol/mina-rosetta:-bullseye-mainnet \ - /usr/local/bin/mina-rosetta \ - --archive-uri "postgres://:@localhost:5432/archive_db" \ - --graphql-uri "http://localhost:3085/graphql" \ - --log-json --port 3088 +# Start the archive node (assumes you have a PostgreSQL server running) +docker run --name mina-archive-mesa -d \ + -p 3086:3086 \ + --restart=always \ + gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-3f038cb-bookworm-mesa \ + mina-archive run \ + --postgres-uri postgresql://archive_user:your-secure-password@postgres-host:5432/archive \ + --server-port 3086 ``` -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). +**Connecting Mina Daemon to Archive:** -**After the fork (Post-Upgrade)** — Block production resumes. Eve verifies data integrity: +Configure your mina daemon to send blocks to the archive node: ```bash -# Check the archive is in sync -mina client status - -# Run the verification toolbox -mina-archive-hardfork-toolbox verify-upgrade \ - --postgres-uri postgres://:@localhost:5432/archive_db \ - --protocol-version \ - --migration-version +mina daemon \ + --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ + --archive-address localhost:3086 ``` -She checks her explorer UI to confirm new Mesa blocks are appearing and the historical data is intact. - -> For the full validation workflow, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) and the [Archive Hardfork Toolbox](/network-upgrades/mesa/archive-upgrade#verification-with-the-archive-hardfork-toolbox). - -
        - -
        -Example: zkApp Developer +### Installing and Running Rosetta -**Frank** maintains a zkApp deployed on mainnet. His contract uses on-chain state and he wants to take advantage of Mesa's expanded 32-field state. +Rosetta is a standardized API for blockchain integration. The Rosetta API requires both a mina daemon and an archive node. -**Weeks before the fork** — Frank updates his o1js dependency to the Mesa-compatible version and tests his zkApp on the [preflight network](/network-upgrades/mesa/preflight-network): +**Installation with Debian:** ```bash -npm install o1js@3.0.0-mesa.698ca -``` - -This is the first o1js release that targets the Mesa transaction protocol. `o1js@latest` currently resolves to a pre-Mesa version and will produce transactions the post-fork preflight network rejects. See [Preflight Network](/network-upgrades/mesa/preflight-network) for the matching daemon/archive/rosetta release. +# Step 1: Install dependencies (if not already done) +sudo apt-get install -y lsb-release ca-certificates wget gnupg -He verifies that: -- His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network -- Transactions execute end-to-end against the redeployed contract -- If he plans to use the expanded state fields (indexes `8–31`), his updated contract version compiles and deploys on preflight +# Step 2: Import the GPG key (if not already done) +wget -q https://unstable.apt.packages.minaprotocol.com/repo-signing-key.gpg \ + -O /etc/apt/trusted.gpg.d/minaprotocol.gpg -> For details on testing with the preflight network, see [Preflight Network](/network-upgrades/mesa/preflight-network). +# Step 3: Add the repository (if not already done) +echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) preflight" | \ + sudo tee /etc/apt/sources.list.d/mina-preflight.list -**Hours before the fork (State Finalization)** — Frank does **nothing**. His deployed zkApp keeps running on the Berkeley chain. No transactions can be submitted during this phase anyway. +# Step 4: Install mina-rosetta-mesa +sudo apt-get update +sudo apt-get install -y mina-rosetta-mesa=4.0.0-preflight-3f038cb -**Fork day (Upgrade)** — Frank does **nothing during the network halt**. His zkApp account and on-chain state values carry over to the Mesa chain automatically (including state fields at indexes `0–7`). However, the verification key generated for Berkeley is no longer valid under the Mesa protocol — the contract cannot process transactions on Mesa until it is redeployed. +# Step 5: Start Rosetta +# Rosetta connects to both the mina daemon and archive node +mina-rosetta \ + --port 3087 \ + --archive-uri http://localhost:3086/graphql \ + --graphql-uri http://localhost:3085/graphql +``` -**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank **must redeploy his zkApp** before it can accept transactions, regardless of whether he uses the new state fields: +**Using Docker:** ```bash -# Required for every zkApp — the Mesa protocol version bump invalidates the Berkeley verification key -zkapp deploy --network mainnet +docker run --name mina-rosetta-mesa -d \ + -p 3087:3087 \ + --restart=always \ + gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-3f038cb-bookworm-mesa \ + --port 3087 \ + --archive-uri http://archive-host:3086/graphql \ + --graphql-uri http://mina-daemon-host:3085/graphql ``` -If he is also adopting the expanded `8–31` state slots, this same deployment step ships the updated contract version that declares the new fields. - -> For post-upgrade details, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). - -
        +**Note:** Rosetta requires: +- A running mina daemon (GraphQL endpoint, typically port 3085) +- A running archive node (GraphQL endpoint, typically port 3086) +- Both must be fully synced for Rosetta to function properly -
        -Example: Exchange Upgrading to Mesa +## Nightly Builds -**Bob** is an exchange operator. His main concern is avoiding lost deposits. +In addition to the preflight release builds, nightly builds are also available for testing the latest changes. -**Weeks before the fork** — Bob tests his integration (Rosetta API, mina-signer) on the [preflight network](/network-upgrades/mesa/preflight-network). He reviews [schema changes](/network-upgrades/mesa/appendix) and installs the stop-slot release: +**Repository:** `nightly.apt.packages.minaprotocol.com` -```bash -sudo apt-get install mina-mainnet=3.x.x -``` +Nightly builds are available for both Debian packages and Docker images. These builds represent the latest development state and may be even more unstable than preflight releases. -> For the full exchange pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). +For more information about nightly builds and repository configuration, see the [Debian Repository documentation](https://nightly.apt.packages.minaprotocol.com/). -**Hours before the fork** — Before the _stop-transaction-slot_ arrives, Bob **disables MINA deposits and withdrawals** on his platform and notifies customers about the maintenance window. +## Verification -:::danger -Any transactions submitted after the stop-transaction-slot **will not exist on the Mesa chain**. This is the most critical step for exchanges. -::: +After starting your node, verify connectivity to the preflight network: -**Fork day** — The network halts. Bob waits for the Mesa release announcement, then upgrades: +### Check Node Status ```bash -sudo systemctl stop mina -sudo apt-get update -sudo apt-get install mina-mainnet=4.x.x -sudo systemctl start mina -``` - -> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). - -**After the fork** — Block production resumes. Bob verifies his node is on the Mesa chain, confirms Rosetta API is working, then **re-enables MINA deposits and withdrawals**. +# For Docker +docker exec -it mina-mesa-preflight mina client status -```bash -mina client status # verify Mesa chain ID -# test a small internal transfer before opening to customers +# For Debian installation +mina client status ``` -> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). - -
        - -## Quick Reference by Operator Type - -| Operator Type | Key Pages | -|---|---| -| **Block Producers** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Modes](/network-upgrades/mesa/upgrade-modes), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **SNARK Workers / Coordinators** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Archive Node Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Rosetta API Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Appendix](/network-upgrades/mesa/appendix) | - -## Network Details +### Monitor Logs -The values below describe the **current Mainnet (pre-fork)** chain. They will change after the Mesa fork activates — the post-fork Chain ID, Git SHA-1, and node build link will be published in the Mesa release announcement. +```bash +# For Docker +docker logs -f mina-mesa-preflight +# For systemd service (Debian) +journalctl -u mina -f ``` -Chain ID (Mainnet, pre-fork) -a7351abc7ddf2ea92d1b38cc8e636c271c1dfd2c081c637f62ebc2af34eb7cc1 -Git SHA-1 (Mainnet, pre-fork) -ae112d3a96fe71b4ccccf3c54e7b7494db4898a4 +## Support and Feedback -Seed List -https://bootnodes.minaprotocol.com/networks/mainnet.txt +If you encounter issues or have feedback about the Mesa preflight network: -Node build -https://github.com/MinaProtocol/mina/releases?q=mesa -``` +1. Check the [Mina Protocol Discord](https://discord.gg/minaprotocol) for community support +2. Report issues on the [Mina GitHub repository](https://github.com/MinaProtocol/mina/issues) +3. Join the Mesa upgrade discussions in the community channels -{/* TODO(PR #1133): When the Mesa mainnet release is cut, add the post-fork Chain ID, Git SHA-1, and the specific release tag URL alongside the pre-fork values above. For the current preflight values, see [Preflight Network](/network-upgrades/mesa/preflight-network). */} +## Next Steps + +- Explore additional Mesa upgrade documentation +- Test your applications and infrastructure against the preflight network +- Provide feedback to help improve the Mesa upgrade process --- -url: /network-upgrades/mesa/preflight-network +url: /network-upgrades/mesa/replayer --- -# Connect to Mesa Preflight Network +# Archive Replayer -The Mesa preflight network is a testing environment for validating the Mesa upgrade before deployment to devnet and mainnet. This network allows node operators and developers to test their infrastructure and applications with the new Mesa release. +The `mina-replayer` is a tool that replays all transactions from a Mina archive database, applying them sequentially to reconstruct the ledger state. It is an **ongoing verification tool** — not limited to upgrade time. You can run it at any point to confirm your archive database faithfully represents the canonical chain. -:::tip Mesa preflight hard fork completed +During the Mesa hard fork, the replayer serves a critical role: it verifies that the archive database is consistent and produces the ledger checkpoint needed to bootstrap the new chain. After the upgrade, it continues to be useful for detecting data corruption, missing blocks, or schema issues in your archive. -The Mesa preflight network hard-forked at **2026-04-27 13:00 UTC**. The post-fork chain is now running the Mesa release **`4.0.0-preflight-3f038cb`**, which bumps the **transaction protocol version to 5.0.0**. +## What the Replayer Does -The transaction protocol bump is a breaking wire-format change: any node still running a pre-fork build (including the stop-slot release `4.0.0-preflight-stop-2967b39` and the original preflight build `4.0.0-preflight1-b649c79`) will reject the new transaction format and is no longer compatible with the network. Upgrade to **`4.0.0-preflight-3f038cb`** to resume participation. +The replayer reads transactions from the archive database in order (respecting global slot and sequence number) and applies them to a starting ledger. At each step, it verifies the computed Merkle root matches what the archive recorded. This catches any data corruption, missing transactions, or schema issues in your archive. -zkApp developers must rebuild and redeploy against **`o1js@3.0.0-mesa.698ca`** — the first o1js release that targets transaction protocol v5.0.0. Transactions produced by earlier o1js versions will be rejected by post-fork nodes. +For hard forks specifically, the replayer: -A dedicated **Upgrade Steps** page covering the post-fork operator checklist will be linked from the Mesa Upgrade sidebar once it ships. +1. Replays all transactions from genesis (or a checkpoint) up to the fork point +2. Stops at the `slot_chain_end` (the stop-network-slot where the old chain halts) +3. Exports the final ledger state as a JSON checkpoint — this is the genesis ledger for the Mesa chain +4. The exported checkpoint can be compared against the official fork config to verify your archive matches the canonical state -::: +## Prerequisites -:::caution Preflight Network Notice +- A PostgreSQL database with Mina archive data (Berkeley mainnet) +- The `mina-replayer` binary (shipped with the Mina daemon package or built from source) +- An input JSON file specifying the starting ledger +- For hard fork replay: a stop-slot configuration file with the fork parameters -The preflight network is intended for testing purposes only. This network may experience instability, breaking changes, and unexpected behavior. Data on this network should not be considered persistent or reliable. +### Building from Source -::: +```bash +dune build src/app/replayer/replayer.exe --profile=dev +# Binary output: _build/default/src/app/replayer/replayer.exe +``` -## Available Build Versions +## Basic Usage -The Mesa preflight network uses the following build versions: +The replayer requires two arguments: an input file and a database connection. -**Current version (install this):** `4.0.0-preflight-3f038cb` — post-hard-fork release. Implements transaction protocol version **5.0.0** and is the only build compatible with the post-fork chain. +```bash +mina-replayer \ + --archive-uri postgres://:@:/ \ + --input-file input.json +``` -**Compatible o1js release:** `o1js@3.0.0-mesa.698ca` — the matching SDK for transaction protocol v5.0.0. Install with `npm install o1js@3.0.0-mesa.698ca` (or the equivalent for your package manager) when developing or redeploying zkApps against the post-fork preflight network. +### Required Flags -**Previous versions (historical, do not install on new nodes):** +| Flag | Description | +|---|---| +| `--archive-uri` | PostgreSQL connection string for the archive database | +| `--input-file` | JSON file specifying the starting ledger and target state | -- `4.0.0-preflight-stop-2967b39` — stop-slot release used to carry nodes up to the fork. Pre-fork transaction protocol; incompatible with the post-fork chain. -- `4.0.0-preflight1-b649c79` — original preflight build. Listed for reference only. +### Optional Flags -### Docker Images +| Flag | Description | +|---|---| +| `--output-file` | Write the final ledger state to this file | +| `--continue-on-error` | Don't stop on transaction application errors | +| `--checkpoint-interval` | Create intermediate checkpoint files every N blocks | +| `--checkpoint-output-folder` | Directory for checkpoint files | +| `--checkpoint-file-prefix` | Filename prefix for checkpoint files | +| `--genesis-ledger-dir` | Directory containing the genesis ledger | +| `--log-json` | Output logs in JSON format | +| `--log-level` | Console log level (e.g., `info`, `debug`, `spam`) | +| `--log-file` | Write logs to a file | -Docker images are available for both `amd64` and `arm64` architectures, on the `bookworm` and `noble` base distributions: +## Hard Fork Replay (Mesa) -- **Mina Daemon:** `gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa` -- **Archive Node:** `gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-3f038cb-bookworm-mesa` -- **Rosetta:** `gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-3f038cb-bookworm-mesa` +To replay the archive through the Berkeley-to-Mesa hard fork, you need additional flags that tell the replayer where the fork happens and what format to export. -For `noble`, swap `bookworm` for `noble` in the tag (e.g. `mina-daemon:4.0.0-preflight-3f038cb-noble-mesa`). +### Hard Fork Flags -### Debian Packages +| Flag | Description | +|---|---| +| `--hard-fork-target mesa` | Specifies the target fork (Mesa) | +| `--stop-slot-config-file` | JSON file with the fork parameters (stop slots, epoch data) | +| `--hard-fork-output-file` | Output file for the post-fork genesis ledger checkpoint | -Debian packages are available from the unstable repository: +### Input File Format -**Repository:** `unstable.apt.packages.minaprotocol.com` -**Channel:** `preflight` -**Codenames:** `bookworm`, `noble` - -Available packages (each at version `4.0.0-preflight-3f038cb`): - -- `mina-mesa` -- `mina-archive-mesa` -- `mina-rosetta-mesa` - -For detailed information about the Debian repository structure and configuration, please refer to the [Debian Repository documentation](https://unstable.apt.packages.minaprotocol.com/). +The input file tells the replayer where to start. For a full replay from genesis: -## Connecting to the Network +```json +{ + "genesis_ledger": { + "add_genesis_winner": false, + "s3_data_hash": "", + "hash": "" + } +} +``` -To connect your node to the Mesa preflight network, you must use the preflight network seed peer list. +If resuming from a previous checkpoint, include `start_slot_since_genesis` and any prior epoch data. -### Required Parameter +### Stop-Slot Configuration File -Add the following parameter to your mina daemon command: +The stop-slot config defines the fork parameters. This file uses the same format as the daemon runtime config: -```bash ---peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt +```json +{ + "genesis": { + "genesis_state_timestamp": "2026-02-24T19:30:00Z" + }, + "ledger": { + "add_genesis_winner": false, + "s3_data_hash": "", + "hash": "" + }, + "daemon": { + "slot_tx_end": 1900, + "slot_chain_end": 1920, + "hard_fork_genesis_slot_delta": 40 + }, + "epoch_data": { + "staking": { + "seed": "", + "s3_data_hash": "", + "hash": "" + }, + "next": { + "seed": "", + "s3_data_hash": "", + "hash": "" + } + } +} ``` -### Example: Running with Docker - -To start a Mina daemon node using Docker: - -```bash -docker run --name mina-mesa-preflight -d \ - -p 8302:8302 \ - --restart=always \ - gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa \ - daemon \ - --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt -``` +Key fields in `daemon`: +- **`slot_tx_end`** — the stop-transaction-slot (no more transactions accepted after this slot) +- **`slot_chain_end`** — the stop-network-slot (chain halts here, this is the fork point) +- **`hard_fork_genesis_slot_delta`** — slot offset for the Mesa genesis relative to the fork point -For production deployments, you'll want to mount configuration directories and add additional flags: +### Running the Hard Fork Replay ```bash -docker run --name mina-mesa-preflight -d \ - -p 8302:8302 \ - --restart=always \ - -v $(pwd)/.mina-config:/root/.mina-config \ - gcr.io/o1labs-192920/mina-daemon:4.0.0-preflight-3f038cb-bookworm-mesa \ - daemon \ - --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ - --libp2p-keypair /data/.mina-config/keys/libp2p-key +mina-replayer \ + --archive-uri postgres://:@:/ \ + --input-file input.json \ + --hard-fork-target mesa \ + --stop-slot-config-file stop-slot-config.json \ + --hard-fork-output-file output.json \ + --log-json \ + --log-level info ``` -### Example: Running with Debian Package +The replayer will: +1. Start from the genesis ledger (or checkpoint) specified in `input.json` +2. Replay all transactions from the archive, applying user commands, internal commands, and zkApp transactions +3. Stop at the `slot_chain_end` — blocks at or beyond this slot are excluded +4. Apply the hard fork migration to produce the post-fork ledger +5. Write the result to `output.json` -First, install dependencies and configure the repository: +### Output Format -```bash -# Step 1: Install dependencies -sudo apt-get install -y lsb-release ca-certificates wget gnupg +The output file contains the genesis configuration for the Mesa chain: -# Step 2: Import the GPG key -wget -q https://unstable.apt.packages.minaprotocol.com/repo-signing-key.gpg \ - -O /etc/apt/trusted.gpg.d/minaprotocol.gpg +```json +{ + "start_slot_since_genesis": 1960, + "genesis_ledger": { + "hash": "", + "s3_data_hash": "", + "add_genesis_winner": false + } +} +``` -# Step 3: Add the unstable repository with preflight channel -echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) preflight" | \ - sudo tee /etc/apt/sources.list.d/mina-preflight.list +The `start_slot_since_genesis` is the Mesa genesis slot, computed from the fork point plus `hard_fork_genesis_slot_delta`. -# Step 4: Update and install -sudo apt-get update -sudo apt-get install -y mina-mesa=4.0.0-preflight-3f038cb -``` +## Verifying Your Archive Against the Official Fork Config -Then start the daemon: +After producing the replayer output, compare it to the official fork configuration published with the Mesa release: ```bash -mina daemon \ - --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ - --libp2p-keypair ~/.mina-config/keys/libp2p-key +# Compare ledger hashes (ignoring s3_data_hash which may differ due to non-deterministic RocksDB metadata) +diff \ + <(jq -S 'del(.genesis_ledger.s3_data_hash)' output.json) \ + <(jq -S 'del(.genesis_ledger.s3_data_hash)' official-mesa-fork-config.json) ``` -### Running Archive Node - -:::info Upgrading from Berkeley to Mesa - -If you have an existing Berkeley archive database that you want to upgrade to Mesa, please refer to the comprehensive [Archive Upgrade](archive-upgrade) guide for detailed instructions on: -- Upgrade prerequisites and requirements -- Running the upgrade script -- Rollback procedures -- Database schema changes -- Verification steps +If the diff is empty, your archive database correctly represents the canonical chain state at the fork point. +:::tip Why ignore s3_data_hash? +The `s3_data_hash` is a SHA3-256 hash of the gzipped RocksDB ledger directory. RocksDB includes non-deterministic metadata (timestamps, sequence numbers, compaction state) and gzip headers may also differ across runs. The logical ledger contents are identical even when this hash differs — the `hash` field (the Merkle root) is the authoritative check. ::: -#### Installing and Running Mesa Archive Node +## Replay Modes -An archive node stores the full history of the blockchain and provides a GraphQL API for querying historical data. It requires a PostgreSQL database. +### Full Replay (Genesis to Fork) -**Installation with Debian:** +This is the most thorough verification. It replays every transaction from genesis through the fork point, catching any inconsistency in the entire archive history. ```bash -# Step 1: Install dependencies -sudo apt-get install -y lsb-release ca-certificates wget gnupg postgresql postgresql-contrib - -# Step 2: Import the GPG key -wget -q https://unstable.apt.packages.minaprotocol.com/repo-signing-key.gpg \ - -O /etc/apt/trusted.gpg.d/minaprotocol.gpg - -# Step 3: Add the repository -echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) preflight" | \ - sudo tee /etc/apt/sources.list.d/mina-preflight.list - -# Step 4: Install mina-archive-mesa -sudo apt-get update -sudo apt-get install -y mina-archive-mesa=4.0.0-preflight-3f038cb +mina-replayer \ + --archive-uri \ + --input-file genesis-input.json \ + --hard-fork-target mesa \ + --stop-slot-config-file stop-slot-config.json \ + --hard-fork-output-file output.json +``` -# Step 5: Create PostgreSQL database -sudo -u postgres createdb archive -sudo -u postgres createuser archive_user -sudo -u postgres psql -c "ALTER USER archive_user WITH PASSWORD 'your-secure-password';" -sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE archive TO archive_user;" +**Use this mode when:** you want full confidence that your archive is correct, or you are an infrastructure operator responsible for publishing the fork config. -# Step 6: Start the archive node -mina-archive run \ - --postgres-uri postgresql://archive_user:your-secure-password@localhost:5432/archive \ - --server-port 3086 -``` +### Replay from Checkpoint (Mesa Post-Fork) -**Using Docker:** +If you already have a checkpoint at or near the fork point, you can replay just the Mesa portion — starting from the hardfork checkpoint and replaying Mesa blocks. ```bash -# Start the archive node (assumes you have a PostgreSQL server running) -docker run --name mina-archive-mesa -d \ - -p 3086:3086 \ - --restart=always \ - gcr.io/o1labs-192920/mina-archive:4.0.0-preflight-3f038cb-bookworm-mesa \ - mina-archive run \ - --postgres-uri postgresql://archive_user:your-secure-password@postgres-host:5432/archive \ - --server-port 3086 +mina-replayer \ + --archive-uri \ + --input-file mesa-checkpoint.json ``` -**Connecting Mina Daemon to Archive:** +**Use this mode when:** you want to verify that your archive is correctly capturing Mesa blocks after the fork, without re-replaying the entire Berkeley history. -Configure your mina daemon to send blocks to the archive node: +## Using Checkpoints for Long Replays + +For mainnet, a full replay from genesis can take a long time. Use checkpoints to break it into resumable segments: ```bash -mina daemon \ - --peer-list-url https://storage.googleapis.com/o1labs-gitops-infrastructure/mina-mesa-network/mina-mesa-network-seeds.txt \ - --archive-address localhost:3086 +mina-replayer \ + --archive-uri \ + --input-file input.json \ + --checkpoint-interval 10000 \ + --checkpoint-output-folder ./checkpoints \ + --checkpoint-file-prefix mainnet-replay ``` -### Installing and Running Rosetta +This creates a checkpoint file every 10,000 blocks. If the replay is interrupted, restart from the latest checkpoint by using it as the `--input-file`. -Rosetta is a standardized API for blockchain integration. The Rosetta API requires both a mina daemon and an archive node. +## Troubleshooting -**Installation with Debian:** +### Merkle root mismatch -```bash -# Step 1: Install dependencies (if not already done) -sudo apt-get install -y lsb-release ca-certificates wget gnupg +The replayer verifies the computed ledger Merkle root against the archive at each block. A mismatch means your archive has missing or incorrect data. Check for: +- Missing blocks (`mina-missing-blocks-auditor`) +- Database corruption +- Incomplete schema upgrade -# Step 2: Import the GPG key (if not already done) -wget -q https://unstable.apt.packages.minaprotocol.com/repo-signing-key.gpg \ - -O /etc/apt/trusted.gpg.d/minaprotocol.gpg +### "No blocks found before slot_chain_end" -# Step 3: Add the repository (if not already done) -echo "deb https://unstable.apt.packages.minaprotocol.com $(lsb_release -cs) preflight" | \ - sudo tee /etc/apt/sources.list.d/mina-preflight.list +The replayer could not find any blocks in the archive before the fork point. Verify: +- Your archive database contains blocks up to the fork slot +- The `slot_chain_end` in your stop-slot config is correct -# Step 4: Install mina-rosetta-mesa -sudo apt-get update -sudo apt-get install -y mina-rosetta-mesa=4.0.0-preflight-3f038cb +### Continue on error -# Step 5: Start Rosetta -# Rosetta connects to both the mina daemon and archive node -mina-rosetta \ - --port 3087 \ - --archive-uri http://localhost:3086/graphql \ - --graphql-uri http://localhost:3085/graphql +If you want to see all errors rather than stopping at the first one: +```bash +mina-replayer --continue-on-error --archive-uri --input-file input.json ``` -**Using Docker:** +## Further Reading -```bash -docker run --name mina-rosetta-mesa -d \ - -p 3087:3087 \ - --restart=always \ - gcr.io/o1labs-192920/mina-rosetta:4.0.0-preflight-3f038cb-bookworm-mesa \ - --port 3087 \ - --archive-uri http://archive-host:3086/graphql \ - --graphql-uri http://mina-daemon-host:3085/graphql -``` +- [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) — schema upgrade and hardfork toolbox +- [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation) — post-upgrade verification procedures +- [Replayer source code](https://github.com/MinaProtocol/mina/tree/compatible/src/app/replayer) +- [Mesa hard fork replayer test (genesis to fork)](https://github.com/MinaProtocol/mina/pull/18613) +- [Mesa hard fork replayer test (post-fork)](https://github.com/MinaProtocol/mina/pull/18614) -**Note:** Rosetta requires: -- A running mina daemon (GraphQL endpoint, typically port 3085) -- A running archive node (GraphQL endpoint, typically port 3086) -- Both must be fully synced for Rosetta to function properly +--- +url: /network-upgrades/mesa/requirements +--- -## Nightly Builds +# Requirements -In addition to the preflight release builds, nightly builds are also available for testing the latest changes. +## Hardware Requirements -**Repository:** `nightly.apt.packages.minaprotocol.com` +Please note the following are the hardware requirements for each node type after the upgrade: -Nightly builds are available for both Debian packages and Docker images. These builds represent the latest development state and may be even more unstable than preflight releases. +| Node Type | Memory | CPU | Storage | Network | +|--|--|--|--|--| +| Mina Daemon Node | 32 GB RAM | 8 core processor with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | +| SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| SNARK Worker (per worker) | 8 GB RAM | 6 core/12 threads with BMI2 and AVX CPU instruction set are required | 1 GB | 1 Mbps Internet Connection | +| Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| Rosetta API standalone Docker image | 8 GB RAM | 2 core processor | 16 GB | 1 Mbps Internet Connection | +| Rosetta API + Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +| Mina Seed Node | 64 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -For more information about nightly builds and repository configuration, see the [Debian Repository documentation](https://nightly.apt.packages.minaprotocol.com/). +## Mina Daemon Requirements -## Verification +### IP and Port configuration -After starting your node, verify connectivity to the preflight network: +**IP:** -### Check Node Status +By default, the Mina Daemon will attempt to retrieve its public IP address from the system. If you are running the node behind a NAT or firewall, you can set the `--external-ip` flag to specify the public IP address. -```bash -# For Docker -docker exec -it mina-mesa-preflight mina client status +**Port:** -# For Debian installation -mina client status -``` +Nodes must expose a port publicly to communicate with other peers. +Mina uses by default the port `8302` which is the default libp2p port. -### Monitor Logs +You can use a different port by setting the `--external-port` flag. -```bash -# For Docker -docker logs -f mina-mesa-preflight +### Node Auto-restart -# For systemd service (Debian) -journalctl -u mina -f -``` +Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service) section, which covers both `systemctl enable` for systemd and `--restart=always` for Docker. -## Support and Feedback +## Seed Peer Requirements -If you encounter issues or have feedback about the Mesa preflight network: +### Generation of libp2p keypair -1. Check the [Mina Protocol Discord](https://discord.gg/minaprotocol) for community support -2. Report issues on the [Mina GitHub repository](https://github.com/MinaProtocol/mina/issues) -3. Join the Mesa upgrade discussions in the community channels +To ensure connectivity across the network, it is essential that all seed nodes start with the **same** `libp2p` keypair. +This consistency allows other nodes in the network to reliably connect. +Although the same libp2p keys can be reused from before the upgrade, if you need to manually generate new libp2p keys, use the following command: -## Next Steps +``` +mina libp2p generate-keypair --privkey-path +``` -- Explore additional Mesa upgrade documentation -- Test your applications and infrastructure against the preflight network -- Provide feedback to help improve the Mesa upgrade process +Further information on [generating key pairs](/node-operators/validator-node/generating-a-keypair) on Mina Protocol. --- -url: /network-upgrades/mesa/replayer +url: /network-upgrades/mesa/upgrade-modes-details --- -# Archive Replayer +# Upgrade Modes - Details -The `mina-replayer` is a tool that replays all transactions from a Mina archive database, applying them sequentially to reconstruct the ledger state. It is an **ongoing verification tool** — not limited to upgrade time. You can run it at any point to confirm your archive database faithfully represents the canonical chain. +This page explains **how the two upgrade modes work under the hood**. If you just want to know which mode to pick and what to do, see [Upgrade Modes](/network-upgrades/mesa/upgrade-modes). This page is for operators who want to understand the mechanism before trusting it with their nodes. -During the Mesa hard fork, the replayer serves a critical role: it verifies that the archive database is consistent and produces the ledger checkpoint needed to bootstrap the new chain. After the upgrade, it continues to be useful for detecting data corruption, missing blocks, or schema issues in your archive. +## The Big Picture -## What the Replayer Does +During the Mesa hard fork, the network transitions from the current chain (referred to internally as "berkeley") to the new Mesa chain. Both upgrade modes use the same **stop-slot mechanism** to halt the old chain at a predetermined slot. The difference is what happens next: -The replayer reads transactions from the archive database in order (respecting global slot and sequence number) and applies them to a starting ledger. At each step, it verifies the computed Merkle root matches what the archive recorded. This catches any data corruption, missing transactions, or schema issues in your archive. +- **Automode**: the node automatically switches to the Mesa binary and resumes. No operator action needed. +- **Manual mode**: the operator stops the old node, installs the Mesa release, and starts it themselves. -For hard forks specifically, the replayer: +Both modes reach the same end state — a node running on the Mesa network, producing blocks after the Mesa genesis timestamp. -1. Replays all transactions from genesis (or a checkpoint) up to the fork point -2. Stops at the `slot_chain_end` (the stop-network-slot where the old chain halts) -3. Exports the final ledger state as a JSON checkpoint — this is the genesis ledger for the Mesa chain -4. The exported checkpoint can be compared against the official fork config to verify your archive matches the canonical state +## Stop-Slot Mechanism -## Prerequisites +Both modes rely on two critical slot numbers baked into the stop-slot release (3.x.x): -- A PostgreSQL database with Mina archive data (Berkeley mainnet) -- The `mina-replayer` binary (shipped with the Mina daemon package or built from source) -- An input JSON file specifying the starting ledger -- For hard fork replay: a stop-slot configuration file with the fork parameters +| Slot | What happens | +|---|---| +| **stop-transaction-slot** | The network stops accepting transactions. Blocks produced after this slot are empty — no user commands, no coinbase rewards, no fee transfers. This begins the State Finalization period. | +| **stop-network-slot** | The network stops producing and accepting blocks entirely. The chain halts. This is the point where the fork happens. | -### Building from Source +The gap between these two slots is exactly 100 slots (5 hours) — the **State Finalization** period. It ensures all nodes converge on the same final state before the fork. -```bash -dune build src/app/replayer/replayer.exe --profile=dev -# Binary output: _build/default/src/app/replayer/replayer.exe -``` +:::tip For block producers +You **will not earn block rewards** during State Finalization (no coinbase), but you **must keep your node running** to maintain network stability and block density. If you are in the Delegation Program, uptime tracking continues during this phase. +::: -## Basic Usage +## Automode — How It Works Internally -The replayer requires two arguments: an input file and a database connection. +### Dual-Binary Architecture -```bash -mina-replayer \ - --archive-uri postgres://:@:/ \ - --input-file input.json -``` +The automode release ships with **two complete sets of Mina binaries** in a single package: -### Required Flags +| Component | Path | Purpose | +|---|---|---| +| **Pre-fork binary** (`mina-{network}-prefork-mesa`) | `{RUNTIMES_BASE_PATH}/berkeley/mina` | Runs the current chain up to the stop-network-slot | +| **Post-fork binary** (`mina-{network}-postfork-mesa`) | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | +| **Dispatcher** (`mina-dispatch`) | `/usr/local/bin/mina-dispatch` | Routes your commands to the correct binary | -| Flag | Description | -|---|---| -| `--archive-uri` | PostgreSQL connection string for the archive database | -| `--input-file` | JSON file specifying the starting ledger and target state | +When you install the automode package (or use the [automode Docker image](/network-upgrades/mesa/glossary#automode-image)), all three components are installed together. -### Optional Flags +### The Dispatcher -| Flag | Description | -|---|---| -| `--output-file` | Write the final ledger state to this file | -| `--continue-on-error` | Don't stop on transaction application errors | -| `--checkpoint-interval` | Create intermediate checkpoint files every N blocks | -| `--checkpoint-output-folder` | Directory for checkpoint files | -| `--checkpoint-file-prefix` | Filename prefix for checkpoint files | -| `--genesis-ledger-dir` | Directory containing the genesis ledger | -| `--log-json` | Output logs in JSON format | -| `--log-level` | Console log level (e.g., `info`, `debug`, `spam`) | -| `--log-file` | Write logs to a file | +The dispatcher (`mina-dispatch`) is a shell script that acts as a transparent wrapper around the real `mina` binary. When you run a `mina` command, the dispatcher decides which binary to execute: -## Hard Fork Replay (Mesa) +- **`daemon` subcommand** — routes based on the activation state file: + ``` + Does the activation state file exist? + → NO: route to the pre-fork (berkeley) binary + → YES: route to the post-fork (mesa) binary + ``` +- **`client` subcommand** — always routes to the post-fork (mesa) binary, regardless of activation state. This works because the GraphQL schema did not change between Berkeley and Mesa. +- **`--version`** — passed through without processing. -To replay the archive through the Berkeley-to-Mesa hard fork, you need additional flags that tell the replayer where the fork happens and what format to export. +The **activation state file** is located at `{MINA_HARDFORK_STATE_DIR}/auto-fork-mesa-{network_id}/activated` (e.g., `~/.mina-config/auto-fork-mesa-mainnet/activated` on the host, or `/root/.mina-config/auto-fork-mesa-mainnet/activated` in Docker). This file is created by the daemon itself when it detects that the network has reached the stop-network-slot. -### Hard Fork Flags +### Dispatcher Limitations -| Flag | Description | -|---|---| -| `--hard-fork-target mesa` | Specifies the target fork (Mesa) | -| `--stop-slot-config-file` | JSON file with the fork parameters (stop slots, epoch data) | -| `--hard-fork-output-file` | Output file for the post-fork genesis ledger checkpoint | +:::info Current implementation — may change in future releases +This limitation exists because, for most subcommands, the dispatcher does not receive the config directory location as an argument. Without access to the config directory, it cannot check for the `activated` state file and therefore cannot determine whether the node is running Berkeley or Mesa. +::: -### Input File Format +The dispatcher supports the following subcommands: -The input file tells the replayer where to start. For a full replay from genesis: +| Subcommand | Routing behavior | +|---|---| +| `daemon` | Routes to pre-fork or post-fork binary based on activation state | +| `client` | Always routes to the post-fork (mesa) binary | +| `--version` | Passed through without processing | + +Any other subcommand (e.g., `accounts list`, `ledger export`) will fail with an error: -```json -{ - "genesis_ledger": { - "add_genesis_winner": false, - "s3_data_hash": "", - "hash": "" - } -} +``` +mina-dispatch ERROR: unsupported subcommand 'accounts' for automatic hardfork handling ``` -If resuming from a previous checkpoint, include `start_slot_since_genesis` and any prior epoch data. +For unsupported subcommands, invoke the correct version-specific binary directly: -### Stop-Slot Configuration File +| Binary | When to use | Path | +|---|---|---| +| `mina-berkeley` | Before the fork (or to query pre-fork state) | `/usr/lib/mina/berkeley/mina` | +| `mina-mesa` | After the fork | `/usr/lib/mina/mesa/mina` | -The stop-slot config defines the fork parameters. This file uses the same format as the daemon runtime config: +```bash +# These work at any time — they bypass the dispatcher +mina-berkeley client status +mina-mesa accounts list +mina-mesa ledger export -```json -{ - "genesis": { - "genesis_state_timestamp": "2026-02-24T19:30:00Z" - }, - "ledger": { - "add_genesis_winner": false, - "s3_data_hash": "", - "hash": "" - }, - "daemon": { - "slot_tx_end": 1900, - "slot_chain_end": 1920, - "hard_fork_genesis_slot_delta": 40 - }, - "epoch_data": { - "staking": { - "seed": "", - "s3_data_hash": "", - "hash": "" - }, - "next": { - "seed": "", - "s3_data_hash": "", - "hash": "" - } - } -} +# Full paths also work for any binary in either runtime +/usr/lib/mina/mesa/mina client status ``` -Key fields in `daemon`: -- **`slot_tx_end`** — the stop-transaction-slot (no more transactions accepted after this slot) -- **`slot_chain_end`** — the stop-network-slot (chain halts here, this is the fork point) -- **`hard_fork_genesis_slot_delta`** — slot offset for the Mesa genesis relative to the fork point +:::note About `client` routing +The `client` subcommand (e.g., `mina client status`) is always routed to the mesa binary because it communicates with the running daemon over GraphQL, and the GraphQL schema did not change between Berkeley and Mesa. This means `mina client status` works through the dispatcher at any point — before or after the fork — as long as a daemon is running. +::: -### Running the Hard Fork Replay +### What the Dispatcher Does for `daemon` Commands -```bash -mina-replayer \ - --archive-uri postgres://:@:/ \ - --input-file input.json \ - --hard-fork-target mesa \ - --stop-slot-config-file stop-slot-config.json \ - --hard-fork-output-file output.json \ - --log-json \ - --log-level info -``` +When the dispatcher routes a `daemon` command to the Mesa binary, it automatically adjusts your command-line arguments: -The replayer will: -1. Start from the genesis ledger (or checkpoint) specified in `input.json` -2. Replay all transactions from the archive, applying user commands, internal commands, and zkApp transactions -3. Stop at the `slot_chain_end` — blocks at or beyond this slot are excluded -4. Apply the hard fork migration to produce the post-fork ledger -5. Write the result to `output.json` +1. **Config files**: Your existing `-config-file` arguments are kept, and the Mesa-specific configuration is **appended as the last** `-config-file` entry. This ensures Mesa settings take precedence. +2. **Genesis ledger directory**: Any `--genesis-ledger-dir` argument is rewritten to point to the Mesa ledger directory. +3. **Hardfork handling flag**: The `--hardfork-handling` argument is **removed** (it is not supported on the Mesa chain). -### Output Format +### Automode Timeline -The output file contains the genesis configuration for the Mesa chain: +Here is what happens from a block producer's perspective when using automode: -```json -{ - "start_slot_since_genesis": 1960, - "genesis_ledger": { - "hash": "", - "s3_data_hash": "", - "add_genesis_winner": false - } -} -``` +Automode upgrade flow diagram showing four phases: pre-upgrade, state finalization, automatic upgrade with process restart, and post-upgrade -The `start_slot_since_genesis` is the Mesa genesis slot, computed from the fork point plus `hard_fork_genesis_slot_delta`. +### Restart and Filesystem Requirements -## Verifying Your Archive Against the Official Fork Config +The automode transition involves a **process restart**. When the daemon reaches the stop-network-slot, it: -After producing the replayer output, compare it to the official fork configuration published with the Mesa release: +1. Generates the Mesa configuration (`daemon.json`) and genesis ledger tarballs in the config directory +2. Writes an `activated` sentinel file to mark the fork as complete +3. **Exits with code 0** (clean shutdown) -```bash -# Compare ledger hashes (ignoring s3_data_hash which may differ due to non-deterministic RocksDB metadata) -diff \ - <(jq -S 'del(.genesis_ledger.s3_data_hash)' output.json) \ - <(jq -S 'del(.genesis_ledger.s3_data_hash)' official-mesa-fork-config.json) -``` +The daemon does **not** restart itself. Your process manager must detect the exit and restart the process. On restart, the dispatcher sees the `activated` file and launches the Mesa binary with the auto-generated config. -If the diff is empty, your archive database correctly represents the canonical chain state at the fork point. +**This means two things are critical:** -:::tip Why ignore s3_data_hash? -The `s3_data_hash` is a SHA3-256 hash of the gzipped RocksDB ledger directory. RocksDB includes non-deterministic metadata (timestamps, sequence numbers, compaction state) and gzip headers may also differ across runs. The logical ledger contents are identical even when this hash differs — the `hash` field (the Merkle root) is the authoritative check. -::: +**Persistent config directory** — The config directory (typically `~/.mina-config` or `/root/.mina-config` in Docker) **must survive across restarts**. It contains the `activated` file and the generated Mesa configuration. If this directory is ephemeral or gets wiped on restart, the node will restart into the Berkeley binary and fail to join the Mesa network. -## Replay Modes +**Automatic restart on clean exit** — Your process manager must be configured to restart the daemon after exit code 0: -### Full Replay (Genesis to Fork) +| Platform | Configuration | Notes | +|---|---|---| +| **systemd** | `Restart=always` | Default in the Mina systemd unit (`mina.service`). Restarts after 30 seconds. | +| **Docker** | `--restart=always` or `--restart=unless-stopped` | Set when creating the container. The default (`no`) will **not** restart. | +| **Kubernetes** | `restartPolicy: Always` | The k8s default for pods. Ensure your liveness probes and Helm chart configuration do not treat exit code 0 as a failure that triggers a volume wipe or full pod replacement. The config directory volume **must** be a `PersistentVolumeClaim`, not `emptyDir`. | -This is the most thorough verification. It replays every transaction from genesis through the fork point, catching any inconsistency in the entire archive history. +:::danger For Kubernetes / Helm users +If your Helm chart or pod spec uses `emptyDir` for the config directory, the `activated` file and generated Mesa config will be lost when the pod restarts. Use a `PersistentVolumeClaim` instead. Also verify that your restart logic does not re-initialize the config directory from scratch — the auto-generated Mesa config must be preserved. +::: + +### Automode Docker Image + +If you run your node with Docker, use the **automode** image (`mina-daemon-auto-hardfork`): -```bash -mina-replayer \ - --archive-uri \ - --input-file genesis-input.json \ - --hard-fork-target mesa \ - --stop-slot-config-file stop-slot-config.json \ - --hard-fork-output-file output.json +``` +minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} ``` -**Use this mode when:** you want full confidence that your archive is correct, or you are an infrastructure operator responsible for publishing the fork config. +This image: +- Installs both the pre-fork and post-fork Debian packages +- Sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher +- Sets `MINA_HARDFORK_STATE_DIR=/root/.mina-config` for the activation state file -### Replay from Checkpoint (Mesa Post-Fork) +You start it with the same flags you normally use. The dispatcher handles the rest. -If you already have a checkpoint at or near the fork point, you can replay just the Mesa portion — starting from the hardfork checkpoint and replaying Mesa blocks. +### Automode Debian Packages + +If you run your node directly on a server (not Docker), install **both** automode Debian packages: ```bash -mina-replayer \ - --archive-uri \ - --input-file mesa-checkpoint.json +sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa ``` -**Use this mode when:** you want to verify that your archive is correctly capturing Mesa blocks after the fork, without re-replaying the entire Berkeley history. +Both packages are required for automode to work: +- `mina-{network}-prefork-mesa` — the pre-fork binary that runs the current chain up to the stop-network-slot +- `mina-{network}-postfork-mesa` — the post-fork binary that runs the Mesa chain after the fork -## Using Checkpoints for Long Replays +The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the required configuration in `/etc/default/mina-dispatch`. -For mainnet, a full replay from genesis can take a long time. Use checkpoints to break it into resumable segments: +:::caution +The dispatcher reads its configuration from `/etc/default/mina-dispatch`. This file must exist and be owned by root. Do not modify it unless you know what you are doing. +::: -```bash -mina-replayer \ - --archive-uri \ - --input-file input.json \ - --checkpoint-interval 10000 \ - --checkpoint-output-folder ./checkpoints \ - --checkpoint-file-prefix mainnet-replay -``` +## Manual Mode — How It Works -This creates a checkpoint file every 10,000 blocks. If the replay is interrupted, restart from the latest checkpoint by using it as the `--input-file`. +Manual mode is the traditional upgrade approach, similar to the Berkeley upgrade. You are in full control of every step. -## Troubleshooting +### Manual Mode Timeline -### Merkle root mismatch +Manual mode upgrade flow diagram showing four phases: pre-upgrade, state finalization, manual upgrade with 5 operator steps, and post-upgrade -The replayer verifies the computed ledger Merkle root against the archive at each block. A mismatch means your archive has missing or incorrect data. Check for: -- Missing blocks (`mina-missing-blocks-auditor`) -- Database corruption -- Incomplete schema upgrade +### Manual Mode — What Gets Installed -### "No blocks found before slot_chain_end" +When you install the Mesa release manually, the package includes: +- The Mesa `mina` binary +- A new runtime configuration JSON for the Mesa network +- New genesis and epoch ledger tarballs -The replayer could not find any blocks in the archive before the fork point. Verify: -- Your archive database contains blocks up to the fork slot -- The `slot_chain_end` in your stop-slot config is correct +These replace the pre-fork components. There is no dispatcher involved — you are running the Mesa binary directly. -### Continue on error +### Manual Mode — Updating Your Flags -If you want to see all errors rather than stopping at the first one: -```bash -mina-replayer --continue-on-error --archive-uri --input-file input.json -``` +When switching from the pre-fork to the Mesa binary, you need to update your startup flags: -## Further Reading +1. **Remove** `--hardfork-handling` if you were using it +2. **Update** your `--genesis-ledger-dir` to point to the Mesa ledger directory (included in the package) +3. **Update** your `-config-file` to use the Mesa configuration +4. **Keep** your existing `--block-producer-key`, `--libp2p-keypair`, and other operator-specific flags -- [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) — schema upgrade and hardfork toolbox -- [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade#in-depth-validation) — post-upgrade verification procedures -- [Replayer source code](https://github.com/MinaProtocol/mina/tree/compatible/src/app/replayer) -- [Mesa hard fork replayer test (genesis to fork)](https://github.com/MinaProtocol/mina/pull/18613) -- [Mesa hard fork replayer test (post-fork)](https://github.com/MinaProtocol/mina/pull/18614) +See [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) for exact flag values. ---- -url: /network-upgrades/mesa/requirements ---- +### Docker (Manual Mode) -# Requirements +For manual mode with Docker, use the **hardfork** image (not auto-hardfork): -## Hardware Requirements +``` +minaprotocol/mina-daemon-hardfork:{version}-{codename}-{network} +``` -Please note the following are the hardware requirements for each node type after the upgrade: +This image includes both pre-fork and post-fork packages but uses a dedicated hardfork entrypoint that requires manual intervention to complete the transition. -| Node Type | Memory | CPU | Storage | Network | -|--|--|--|--|--| -| Mina Daemon Node | 32 GB RAM | 8 core processor with BMI2 and AVX CPU instruction set are required | 64 GB | 1 Mbps Internet Connection | -| SNARK Coordinator | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| SNARK Worker (per worker) | 8 GB RAM | 6 core/12 threads with BMI2 and AVX CPU instruction set are required | 1 GB | 1 Mbps Internet Connection | -| Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| Rosetta API standalone Docker image | 8 GB RAM | 2 core processor | 16 GB | 1 Mbps Internet Connection | -| Rosetta API + Archive Node | 32 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | -| Mina Seed Node | 64 GB RAM | 8 core processor | 64 GB | 1 Mbps Internet Connection | +## Which Mode Should I Pick? -## Mina Daemon Requirements +### Choose Automode if: -### IP and Port configuration +- You want zero intervention during the fork window +- You are comfortable with the dispatcher managing binary routing +- You run a standard block producer or SNARK coordinator setup +- You want to minimize the risk of missing the Mesa genesis timestamp -**IP:** +### Choose Manual mode if: -By default, the Mina Daemon will attempt to retrieve its public IP address from the system. If you are running the node behind a NAT or firewall, you can set the `--external-ip` flag to specify the public IP address. +- You have custom deployment automation that controls which binary runs +- You want to inspect the Mesa release before starting it +- You run a non-standard setup where automatic argument rewriting could cause issues +- You need to coordinate the upgrade with other infrastructure changes -**Port:** +### Key Differences at a Glance -Nodes must expose a port publicly to communicate with other peers. -Mina uses by default the port `8302` which is the default libp2p port. +| | Automode | Manual | +|---|---|---| +| Packages installed | Pre-fork + post-fork + dispatcher | Pre-fork only (Mesa installed later) | +| Binary switching | Automatic via dispatcher | You stop old, install new, start new | +| Flag changes at fork | Handled by dispatcher | You update flags yourself | +| Downtime at fork | Seconds (automatic transition) | Minutes to hours (depends on you) | +| Docker image | `mina-daemon-auto-hardfork` | `mina-daemon-hardfork` | +| Risk of missing genesis | Very low | Depends on how fast you act | -You can use a different port by setting the `--external-port` flag. +:::info For block producers worried about missed blocks +With **automode**, your node transitions automatically at the stop-network-slot. As long as your node was running during State Finalization, it will be ready to produce blocks at the Mesa genesis timestamp without any action from you. -### Node Auto-restart +With **manual mode**, the time between the stop-network-slot and when you restart your node on Mesa is downtime. If the Mesa genesis timestamp arrives before you finish the upgrade, you will miss blocks until your node catches up. +::: -Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service) section, which covers both `systemctl enable` for systemd and `--restart=always` for Docker. +## Troubleshooting Automode -## Seed Peer Requirements +### How do I know which binary my node is using? -### Generation of libp2p keypair +Check whether the activation state file exists. The file is located at: -To ensure connectivity across the network, it is essential that all seed nodes start with the **same** `libp2p` keypair. -This consistency allows other nodes in the network to reliably connect. -Although the same libp2p keys can be reused from before the upgrade, if you need to manually generate new libp2p keys, use the following command: +`{config-directory}/auto-fork-mesa-{network_id}/activated` + +Where: +- `{config-directory}` is the path passed via `--config-directory` (defaults to `~/.mina-config` on the host, or `/root/.mina-config` in Docker) +- `{network_id}` is the network name (e.g., `mainnet` or `devnet`) + +For example, on a typical mainnet setup: +```bash +ls ~/.mina-config/auto-fork-mesa-mainnet/activated ``` -mina libp2p generate-keypair --privkey-path + +- **File does not exist**: your node is using the pre-fork (Berkeley) binary +- **File exists**: your node has transitioned to the Mesa binary + +### Can I run non-daemon commands or use a specific binary version? + +As described in the [Dispatcher Limitations](#dispatcher-limitations) section, the dispatcher supports `daemon`, `client`, and `--version`. For any other command — including `accounts list`, `ledger export`, and other CLI operations — **you must use the version-specific binary directly**: + +| Binary | Description | Full path | +|---|---|---| +| `mina-berkeley` | Pre-fork binary (current chain) | `/usr/lib/mina/berkeley/mina` | +| `mina-mesa` | Post-fork binary (Mesa chain) | `/usr/lib/mina/mesa/mina` | + +```bash +# Use mina-mesa for all non-daemon commands after the fork +mina-mesa client status +mina-mesa accounts list +mina-mesa ledger export + +# Use mina-berkeley for pre-fork queries +mina-berkeley client status ``` -Further information on [generating key pairs](/node-operators/validator-node/generating-a-keypair) on Mina Protocol. +These symlinks (`mina-berkeley`, `mina-mesa`) are installed globally by the automode packages and are always available. They bypass the dispatcher entirely and run the binary directly, so they work regardless of the activation state. ---- -url: /network-upgrades/mesa/upgrade-modes-details ---- +:::caution Do not manipulate the activation state file +While it is technically possible to force the dispatcher to use a specific runtime by creating or removing the `activated` file, **this is strongly discouraged**. Manually manipulating the state file while the network is live can put your node on the wrong chain. If you need to run a specific version, use `mina-berkeley` or `mina-mesa` directly instead. +::: -# Upgrade Modes - Details +### Debug mode -This page explains **how the two upgrade modes work under the hood**. If you just want to know which mode to pick and what to do, see [Upgrade Modes](/network-upgrades/mesa/upgrade-modes). This page is for operators who want to understand the mechanism before trusting it with their nodes. +Set `MINA_DISPATCHER_DEBUG=1` in your environment to see which binary and arguments the dispatcher is using: -## The Big Picture +```bash +MINA_DISPATCHER_DEBUG=1 mina daemon ... +``` -During the Mesa hard fork, the network transitions from the current chain (referred to internally as "berkeley") to the new Mesa chain. Both upgrade modes use the same **stop-slot mechanism** to halt the old chain at a predetermined slot. The difference is what happens next: +For a dry run (print the command without executing): -- **Automode**: the node automatically switches to the Mesa binary and resumes. No operator action needed. -- **Manual mode**: the operator stops the old node, installs the Mesa release, and starts it themselves. +```bash +MINA_DISPATCHER_DRYRUN=1 mina daemon ... +``` -Both modes reach the same end state — a node running on the Mesa network, producing blocks after the Mesa genesis timestamp. +--- +url: /network-upgrades/mesa/upgrade-modes +--- -## Stop-Slot Mechanism +# Upgrade Modes -Both modes rely on two critical slot numbers baked into the stop-slot release (3.x.x): +The Mesa upgrade supports two modes for daemon node operators: **Automode** and **Manual**. Both modes run in parallel during the upgrade process and reach the same end state — a node running on the Mesa network. -| Slot | What happens | -|---|---| -| **stop-transaction-slot** | The network stops accepting transactions. Blocks produced after this slot are empty — no user commands, no coinbase rewards, no fee transfers. This begins the State Finalization period. | -| **stop-network-slot** | The network stops producing and accepting blocks entirely. The chain halts. This is the point where the fork happens. | +## Automode (Recommended) -The gap between these two slots is exactly 100 slots (5 hours) — the **State Finalization** period. It ensures all nodes converge on the same final state before the fork. +Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. -:::tip For block producers -You **will not earn block rewards** during State Finalization (no coinbase), but you **must keep your node running** to maintain network stability and block density. If you are in the Delegation Program, uptime tracking continues during this phase. -::: +### How it works -## Automode — How It Works Internally +1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. +2. Your node participates normally in block production through the State Finalization phase. +3. When the network reaches the _stop-network-slot_, the node automatically: + - Stops producing blocks on the old chain + - Transitions to the Mesa network configuration + - Begins producing blocks on the Mesa network once the genesis timestamp is reached +4. No manual intervention is required during the fork. -### Dual-Binary Architecture +### Who should use Automode -The automode release ships with **two complete sets of Mina binaries** in a single package: +- Block producers who want a hands-off upgrade experience +- SNARK coordinators (run as a Mina daemon) +- Operators who want to minimize downtime and operational risk -| Component | Path | Purpose | -|---|---|---| -| **Pre-fork binary** (`mina-{network}-prefork-mesa`) | `{RUNTIMES_BASE_PATH}/berkeley/mina` | Runs the current chain up to the stop-network-slot | -| **Post-fork binary** (`mina-{network}-postfork-mesa`) | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | -| **Dispatcher** (`mina-dispatch`) | `/usr/local/bin/mina-dispatch` | Routes your commands to the correct binary | +Automode is **not** available for the following — operators of these node types must use Manual mode: -When you install the automode package (or use the [automode Docker image](/network-upgrades/mesa/glossary#automode-image)), all three components are installed together. +- **Archive nodes** — schema upgrade is a separate manual step (see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade)) +- **Rosetta API nodes** — upgrade alongside the archive node they depend on +- **Standalone SNARK workers** — `mina internal snark-worker` processes/containers run separately from any daemon; they must be stopped and redeployed with the Mesa binary after the fork. (Workers spawned by a coordinator inherit the coordinator's upgrade automatically.) -### The Dispatcher +### Requirements -The dispatcher (`mina-dispatch`) is a shell script that acts as a transparent wrapper around the real `mina` binary. When you run a `mina` command, the dispatcher decides which binary to execute: +- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ +- Ensure your node remains running through the State Finalization phase +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) -- **`daemon` subcommand** — routes based on the activation state file: - ``` - Does the activation state file exist? - → NO: route to the pre-fork (berkeley) binary - → YES: route to the post-fork (mesa) binary - ``` -- **`client` subcommand** — always routes to the post-fork (mesa) binary, regardless of activation state. This works because the GraphQL schema did not change between Berkeley and Mesa. -- **`--version`** — passed through without processing. +:::info +Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). +::: -The **activation state file** is located at `{MINA_HARDFORK_STATE_DIR}/auto-fork-mesa-{network_id}/activated` (e.g., `~/.mina-config/auto-fork-mesa-mainnet/activated` on the host, or `/root/.mina-config/auto-fork-mesa-mainnet/activated` in Docker). This file is created by the daemon itself when it detects that the network has reached the stop-network-slot. +## Manual Mode -### Dispatcher Limitations +Manual mode gives operators full control over each step of the upgrade process. -:::info Current implementation — may change in future releases -This limitation exists because, for most subcommands, the dispatcher does not receive the config directory location as an argument. Without access to the config directory, it cannot check for the `activated` state file and therefore cannot determine whether the node is running Berkeley or Mesa. -::: +### How it works -The dispatcher supports the following subcommands: +1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. +2. Your node participates normally through the State Finalization phase. +3. When the network halts at the _stop-network-slot_, you: + - Stop your node + - Wait for the Mesa release to be published + - Install the Mesa release + - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) +4. Your node begins participating in the Mesa network once the genesis timestamp is reached. -| Subcommand | Routing behavior | -|---|---| -| `daemon` | Routes to pre-fork or post-fork binary based on activation state | -| `client` | Always routes to the post-fork (mesa) binary | -| `--version` | Passed through without processing | +### Who should use Manual mode -Any other subcommand (e.g., `accounts list`, `ledger export`) will fail with an error: +- Operators who need full control over the upgrade process +- Operators with custom deployment pipelines that require explicit upgrade steps +- Operators who want to validate the Mesa build before restarting -``` -mina-dispatch ERROR: unsupported subcommand 'accounts' for automatic hardfork handling -``` +### Requirements -For unsupported subcommands, invoke the correct version-specific binary directly: +- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ +- Be prepared to act promptly when the Mesa release is published to minimize downtime +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) -| Binary | When to use | Path | +## Comparison + +| Aspect | Automode | Manual | |---|---|---| -| `mina-berkeley` | Before the fork (or to query pre-fork state) | `/usr/lib/mina/berkeley/mina` | -| `mina-mesa` | After the fork | `/usr/lib/mina/mesa/mina` | +| Operator intervention during fork | None | Stop, install, restart | +| Downtime | Minimal (automatic transition) | Depends on operator response time | +| Applies to | Daemon nodes only | All node types | +| Control | Automated | Full manual control | +| Risk | Lower (fewer manual steps) | Higher (depends on operator timing) | -```bash -# These work at any time — they bypass the dispatcher -mina-berkeley client status -mina-mesa accounts list -mina-mesa ledger export +For in-depth technical details on how the upgrade mechanism works internally, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). -# Full paths also work for any binary in either runtime -/usr/lib/mina/mesa/mina client status -``` +--- +url: /network-upgrades/mesa/upgrade-steps/examples +--- -:::note About `client` routing -The `client` subcommand (e.g., `mina client status`) is always routed to the mesa binary because it communicates with the running daemon over GraphQL, and the GraphQL schema did not change between Berkeley and Mesa. This means `mina client status` works through the dispatcher at any point — before or after the fork — as long as a daemon is running. -::: +# Examples -### What the Dispatcher Does for `daemon` Commands +The walkthroughs below follow concrete operators through the four Mesa upgrade phases ([Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade), [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization), [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade)) for different roles and setups. Click to expand the example that matches your situation. -When the dispatcher routes a `daemon` command to the Mesa binary, it automatically adjusts your command-line arguments: +
        +Example: Block Producer Upgrading with Automode (Debian) -1. **Config files**: Your existing `-config-file` arguments are kept, and the Mesa-specific configuration is **appended as the last** `-config-file` entry. This ensures Mesa settings take precedence. -2. **Genesis ledger directory**: Any `--genesis-ledger-dir` argument is rewritten to point to the Mesa ledger directory. -3. **Hardfork handling flag**: The `--hardfork-handling` argument is **removed** (it is not supported on the Mesa chain). +Imagine you are **Alice**, a block producer running on a Debian server. Here is what your upgrade looks like end to end. -### Automode Timeline +**Weeks before the fork** — Alice checks [hardware requirements](/network-upgrades/mesa/requirements) and installs the automode packages: -Here is what happens from a block producer's perspective when using automode: +```bash +sudo apt-get update +sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x +``` -Automode upgrade flow diagram showing four phases: pre-upgrade, state finalization, automatic upgrade with process restart, and post-upgrade +She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. -### Restart and Filesystem Requirements +> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). -The automode transition involves a **process restart**. When the daemon reaches the stop-network-slot, it: +**Hours before the fork (State Finalization)** — The network reaches the _stop-transaction-slot_. Alice's node keeps producing blocks — she does **nothing**. Empty blocks are produced for 100 slots (exactly 5 hours) until all nodes agree on the final state. -1. Generates the Mesa configuration (`daemon.json`) and genesis ledger tarballs in the config directory -2. Writes an `activated` sentinel file to mark the fork as complete -3. **Exits with code 0** (clean shutdown) +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). -The daemon does **not** restart itself. Your process manager must detect the exit and restart the process. On restart, the dispatcher sees the `activated` file and launches the Mesa binary with the auto-generated config. +**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Alice's daemon generates the Mesa configuration, writes the `activated` marker file, and **shuts down cleanly** (exit code 0). Because Alice uses systemd with `Restart=always`, the daemon restarts automatically. On restart, the dispatcher detects the `activated` file and launches the Mesa binary. Alice does **nothing** — this all happens automatically. -**This means two things are critical:** +> For what happens if you chose manual mode instead, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). For details on the restart mechanism, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements). -**Persistent config directory** — The config directory (typically `~/.mina-config` or `/root/.mina-config` in Docker) **must survive across restarts**. It contains the `activated` file and the generated Mesa configuration. If this directory is ephemeral or gets wiped on restart, the node will restart into the Berkeley binary and fail to join the Mesa network. +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, the first Mesa block is produced. Alice verifies: -**Automatic restart on clean exit** — Your process manager must be configured to restart the daemon after exit code 0: +```bash +# Check if the activated file exists (path depends on your config directory and network ID) +ls ~/.mina-config/auto-fork-mesa-mainnet/activated -| Platform | Configuration | Notes | -|---|---|---| -| **systemd** | `Restart=always` | Default in the Mina systemd unit (`mina.service`). Restarts after 30 seconds. | -| **Docker** | `--restart=always` or `--restart=unless-stopped` | Set when creating the container. The default (`no`) will **not** restart. | -| **Kubernetes** | `restartPolicy: Always` | The k8s default for pods. Ensure your liveness probes and Helm chart configuration do not treat exit code 0 as a failure that triggers a volume wipe or full pod replacement. The config directory volume **must** be a `PersistentVolumeClaim`, not `emptyDir`. | +# Confirm Mesa chain ID +mina client status +``` -:::danger For Kubernetes / Helm users -If your Helm chart or pod spec uses `emptyDir` for the config directory, the `activated` file and generated Mesa config will be lost when the pod restarts. Use a `PersistentVolumeClaim` instead. Also verify that your restart logic does not re-initialize the config directory from scratch — the auto-generated Mesa config must be preserved. +:::note Dispatcher and non-daemon commands +The automode dispatcher only supports the `daemon` subcommand and `client status` command — it cannot determine the active runtime for other commands because they don't pass the config directory. For commands like `accounts list`, or `ledger export`, use the correct version-specific binary directly: `mina-mesa` (after the fork) or `mina-berkeley` (before the fork). The full paths `/usr/lib/mina/mesa/mina` and `/usr/lib/mina/berkeley/mina` also work. This limitation may be removed in a future release. ::: -### Automode Docker Image - -If you run your node with Docker, use the **automode** image (`mina-daemon-auto-hardfork`): +She's done. Her node is producing blocks on Mesa. -``` -minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} -``` +> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). -This image: -- Installs both the pre-fork and post-fork Debian packages -- Sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher -- Sets `MINA_HARDFORK_STATE_DIR=/root/.mina-config` for the activation state file +
        -You start it with the same flags you normally use. The dispatcher handles the rest. +
        +Example: Block Producer — Manual Mode (Docker) -### Automode Debian Packages +**Carlos** runs a block producer using Docker and prefers manual control over the upgrade. -If you run your node directly on a server (not Docker), install **both** automode Debian packages: +**Weeks before the fork** — Carlos pulls the stop-slot Docker image and starts his node: ```bash -sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa +docker pull minaprotocol/mina-daemon:-bullseye-mainnet + +docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:-bullseye-mainnet \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --file-log-rotations 500 \ + --log-json ``` -Both packages are required for automode to work: -- `mina-{network}-prefork-mesa` — the pre-fork binary that runs the current chain up to the stop-network-slot -- `mina-{network}-postfork-mesa` — the post-fork binary that runs the Mesa chain after the fork +> For full pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). -The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the required configuration in `/etc/default/mina-dispatch`. +**Hours before the fork (State Finalization)** — Carlos keeps his node running. He does **nothing** during this phase. -:::caution -The dispatcher reads its configuration from `/etc/default/mina-dispatch`. This file must exist and be owned by root. Do not modify it unless you know what you are doing. -::: +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). -## Manual Mode — How It Works +**Fork day (Upgrade)** — The network halts at the _stop-network-slot_. Carlos waits for the Mesa release announcement, then swaps to the new image. -Manual mode is the traditional upgrade approach, similar to the Berkeley upgrade. You are in full control of every step. +> Throughout these examples, `` is a placeholder for the Mesa release tag announced for your target network. For the **preflight** network the current value is published on [Preflight Network](/network-upgrades/mesa/preflight-network); for **devnet/mainnet** the value will be published with the corresponding release announcement. -### Manual Mode Timeline +```bash +docker stop mina && docker rm mina -Manual mode upgrade flow diagram showing four phases: pre-upgrade, state finalization, manual upgrade with 5 operator steps, and post-upgrade +docker pull minaprotocol/mina-daemon:-bullseye-mainnet -### Manual Mode — What Gets Installed +docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:-bullseye-mainnet \ + daemon \ + --block-producer-key /keys/my-wallet \ + --config-directory /root/.mina-config \ + --libp2p-keypair /keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --file-log-rotations 500 \ + --log-json +``` -When you install the Mesa release manually, the package includes: -- The Mesa `mina` binary -- A new runtime configuration JSON for the Mesa network -- New genesis and epoch ledger tarballs +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). -These replace the pre-fork components. There is no dispatcher involved — you are running the Mesa binary directly. +**After the fork (Post-Upgrade)** — Exactly 3 hours after the Mesa release is published, block production starts. Carlos verifies: -### Manual Mode — Updating Your Flags +```bash +docker exec mina mina client status # confirms Mesa chain ID +``` -When switching from the pre-fork to the Mesa binary, you need to update your startup flags: +> For post-upgrade flags and monitoring, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). -1. **Remove** `--hardfork-handling` if you were using it -2. **Update** your `--genesis-ledger-dir` to point to the Mesa ledger directory (included in the package) -3. **Update** your `-config-file` to use the Mesa configuration -4. **Keep** your existing `--block-producer-key`, `--libp2p-keypair`, and other operator-specific flags +
        -See [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) for exact flag values. +
        +Example: Archive Node / Explorer Operator -### Docker (Manual Mode) +**Eve** runs an archive node, a Rosetta API instance, and a block explorer. She needs to upgrade both the daemon and the database. -For manual mode with Docker, use the **hardfork** image (not auto-hardfork): +**Weeks before the fork** — Eve installs the stop-slot release and decides on her upgrade method: +```bash +sudo apt-get update +sudo apt-get install mina-mainnet=3.x.x ``` -minaprotocol/mina-daemon-hardfork:{version}-{codename}-{network} -``` - -This image includes both pre-fork and post-fork packages but uses a dedicated hardfork entrypoint that requires manual intervention to complete the transition. - -## Which Mode Should I Pick? -### Choose Automode if: +She chooses the **trustless** path — running the upgrade script early, while her archive is still online: -- You want zero intervention during the fork window -- You are comfortable with the dispatcher managing binary routing -- You run a standard block producer or SNARK coordinator setup -- You want to minimize the risk of missing the Mesa genesis timestamp +```bash +# Back up the database first +pg_dump -U archive_db > berkeley-archive-backup.sql -### Choose Manual mode if: +# Download and run the upgrade script (completes in under 1 minute) +curl -O https://raw.githubusercontent.com/MinaProtocol/mina/refs/heads/mesa/src/app/archive/upgrade_to_mesa.sql +psql -U -d archive_db -f upgrade_to_mesa.sql -- You have custom deployment automation that controls which binary runs -- You want to inspect the Mesa release before starting it -- You run a non-standard setup where automatic argument rewriting could cause issues -- You need to coordinate the upgrade with other infrastructure changes +# Verify +psql -U -d archive_db -c "SELECT * FROM version;" +``` -### Key Differences at a Glance +The script is backward-compatible — her existing Berkeley archive node keeps working normally after the upgrade. -| | Automode | Manual | -|---|---|---| -| Packages installed | Pre-fork + post-fork + dispatcher | Pre-fork only (Mesa installed later) | -| Binary switching | Automatic via dispatcher | You stop old, install new, start new | -| Flag changes at fork | Handled by dispatcher | You update flags yourself | -| Downtime at fork | Seconds (automatic transition) | Minutes to hours (depends on you) | -| Docker image | `mina-daemon-auto-hardfork` | `mina-daemon-hardfork` | -| Risk of missing genesis | Very low | Depends on how fast you act | +> For the full archive upgrade guide, see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). -:::info For block producers worried about missed blocks -With **automode**, your node transitions automatically at the stop-network-slot. As long as your node was running during State Finalization, it will be ready to produce blocks at the Mesa genesis timestamp without any action from you. +**Hours before the fork (State Finalization)** — Eve keeps her archive node running to capture all finalized blocks. -With **manual mode**, the time between the stop-network-slot and when you restart your node on Mesa is downtime. If the Mesa genesis timestamp arrives before you finish the upgrade, you will miss blocks until your node catches up. -::: +> For details on this phase, see [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization). -## Troubleshooting Automode +**Fork day (Upgrade)** — The network halts. Eve installs the Mesa archive release and points it at her already-upgraded database: -### How do I know which binary my node is using? +```bash +sudo systemctl stop mina-archive +sudo systemctl stop mina -Check whether the activation state file exists. The file is located at: +sudo apt-get update +sudo apt-get install mina-archive-mainnet=4.x.x mina-mainnet=4.x.x -`{config-directory}/auto-fork-mesa-{network_id}/activated` +# Start archive process pointing to the upgraded DB +mina-archive run \ + --postgres-uri postgres://:@localhost:5432/archive_db \ + --server-port 3086 \ + --log-json --log-level DEBUG -Where: -- `{config-directory}` is the path passed via `--config-directory` (defaults to `~/.mina-config` on the host, or `/root/.mina-config` in Docker) -- `{network_id}` is the network name (e.g., `mainnet` or `devnet`) +# Start the non-block-producing daemon connected to the archive +mina daemon \ + --archive-address localhost:3086 \ + --config-directory ~/.mina-config \ + --libp2p-keypair ~/keys/libp2p-key \ + --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ + --file-log-rotations 500 \ + --log-json +``` -For example, on a typical mainnet setup: +She also restarts Rosetta: ```bash -ls ~/.mina-config/auto-fork-mesa-mainnet/activated +docker run --name rosetta --rm -d \ + -p 3088:3088 \ + --entrypoint '' \ + minaprotocol/mina-rosetta:-bullseye-mainnet \ + /usr/local/bin/mina-rosetta \ + --archive-uri "postgres://:@localhost:5432/archive_db" \ + --graphql-uri "http://localhost:3085/graphql" \ + --log-json --port 3088 ``` -- **File does not exist**: your node is using the pre-fork (Berkeley) binary -- **File exists**: your node has transitioned to the Mesa binary - -### Can I run non-daemon commands or use a specific binary version? - -As described in the [Dispatcher Limitations](#dispatcher-limitations) section, the dispatcher supports `daemon`, `client`, and `--version`. For any other command — including `accounts list`, `ledger export`, and other CLI operations — **you must use the version-specific binary directly**: +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). -| Binary | Description | Full path | -|---|---|---| -| `mina-berkeley` | Pre-fork binary (current chain) | `/usr/lib/mina/berkeley/mina` | -| `mina-mesa` | Post-fork binary (Mesa chain) | `/usr/lib/mina/mesa/mina` | +**After the fork (Post-Upgrade)** — Block production resumes. Eve verifies data integrity: ```bash -# Use mina-mesa for all non-daemon commands after the fork -mina-mesa client status -mina-mesa accounts list -mina-mesa ledger export +# Check the archive is in sync +mina client status -# Use mina-berkeley for pre-fork queries -mina-berkeley client status +# Run the verification toolbox +mina-archive-hardfork-toolbox verify-upgrade \ + --postgres-uri postgres://:@localhost:5432/archive_db \ + --protocol-version \ + --migration-version ``` -These symlinks (`mina-berkeley`, `mina-mesa`) are installed globally by the automode packages and are always available. They bypass the dispatcher entirely and run the binary directly, so they work regardless of the activation state. +She checks her explorer UI to confirm new Mesa blocks are appearing and the historical data is intact. -:::caution Do not manipulate the activation state file -While it is technically possible to force the dispatcher to use a specific runtime by creating or removing the `activated` file, **this is strongly discouraged**. Manually manipulating the state file while the network is live can put your node on the wrong chain. If you need to run a specific version, use `mina-berkeley` or `mina-mesa` directly instead. -::: +> For the full validation workflow, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) and the [Archive Hardfork Toolbox](/network-upgrades/mesa/archive-upgrade#verification-with-the-archive-hardfork-toolbox). -### Debug mode +
        -Set `MINA_DISPATCHER_DEBUG=1` in your environment to see which binary and arguments the dispatcher is using: +
        +Example: zkApp Developer -```bash -MINA_DISPATCHER_DEBUG=1 mina daemon ... -``` +**Frank** maintains a zkApp deployed on mainnet. His contract uses on-chain state and he wants to take advantage of Mesa's expanded 32-field state. -For a dry run (print the command without executing): +**Weeks before the fork** — Frank updates his o1js dependency to the Mesa-compatible version and tests his zkApp on the [preflight network](/network-upgrades/mesa/preflight-network): ```bash -MINA_DISPATCHER_DRYRUN=1 mina daemon ... +npm install o1js@3.0.0-mesa.698ca ``` ---- -url: /network-upgrades/mesa/upgrade-modes ---- - -# Upgrade Modes +This is the first o1js release that targets the Mesa transaction protocol. `o1js@latest` currently resolves to a pre-Mesa version and will produce transactions the post-fork preflight network rejects. See [Preflight Network](/network-upgrades/mesa/preflight-network) for the matching daemon/archive/rosetta release. -The Mesa upgrade supports two modes for daemon node operators: **Automode** and **Manual**. Both modes run in parallel during the upgrade process and reach the same end state — a node running on the Mesa network. +He verifies that: +- His contract recompiles cleanly against Mesa-compatible o1js and deploys on the preflight Mesa network +- Transactions execute end-to-end against the redeployed contract +- If he plans to use the expanded state fields (indexes `8–31`), his updated contract version compiles and deploys on preflight -## Automode (Recommended) +> For details on testing with the preflight network, see [Preflight Network](/network-upgrades/mesa/preflight-network). -Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. +**Hours before the fork (State Finalization)** — Frank does **nothing**. His deployed zkApp keeps running on the Berkeley chain. No transactions can be submitted during this phase anyway. -### How it works +**Fork day (Upgrade)** — Frank does **nothing during the network halt**. His zkApp account and on-chain state values carry over to the Mesa chain automatically (including state fields at indexes `0–7`). However, the verification key generated for Berkeley is no longer valid under the Mesa protocol — the contract cannot process transactions on Mesa until it is redeployed. -1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. -2. Your node participates normally in block production through the State Finalization phase. -3. When the network reaches the _stop-network-slot_, the node automatically: - - Stops producing blocks on the old chain - - Transitions to the Mesa network configuration - - Begins producing blocks on the Mesa network once the genesis timestamp is reached -4. No manual intervention is required during the fork. +**After the fork (Post-Upgrade)** — Block production resumes on Mesa. Frank **must redeploy his zkApp** before it can accept transactions, regardless of whether he uses the new state fields: -### Who should use Automode +```bash +# Required for every zkApp — the Mesa protocol version bump invalidates the Berkeley verification key +zkapp deploy --network mainnet +``` -- Block producers who want a hands-off upgrade experience -- SNARK coordinators (run as a Mina daemon) -- Operators who want to minimize downtime and operational risk +If he is also adopting the expanded `8–31` state slots, this same deployment step ships the updated contract version that declares the new fields. -Automode is **not** available for the following — operators of these node types must use Manual mode: +> For post-upgrade details, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). -- **Archive nodes** — schema upgrade is a separate manual step (see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade)) -- **Rosetta API nodes** — upgrade alongside the archive node they depend on -- **Standalone SNARK workers** — `mina internal snark-worker` processes/containers run separately from any daemon; they must be stopped and redeployed with the Mesa binary after the fork. (Workers spawned by a coordinator inherit the coordinator's upgrade automatically.) +
        -### Requirements +
        +Example: Exchange Upgrading to Mesa -- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ -- Ensure your node remains running through the State Finalization phase -- Meet the [hardware requirements](/network-upgrades/mesa/requirements) +**Bob** is an exchange operator. His main concern is avoiding lost deposits. -:::info -Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). -::: +**Weeks before the fork** — Bob tests his integration (Rosetta API, mina-signer) on the [preflight network](/network-upgrades/mesa/preflight-network). He reviews [schema changes](/network-upgrades/mesa/appendix) and installs the stop-slot release: -## Manual Mode +```bash +sudo apt-get install mina-mainnet=3.x.x +``` -Manual mode gives operators full control over each step of the upgrade process. +> For the full exchange pre-upgrade checklist, see [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). -### How it works +**Hours before the fork** — Before the _stop-transaction-slot_ arrives, Bob **disables MINA deposits and withdrawals** on his platform and notifies customers about the maintenance window. -1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. -2. Your node participates normally through the State Finalization phase. -3. When the network halts at the _stop-network-slot_, you: - - Stop your node - - Wait for the Mesa release to be published - - Install the Mesa release - - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) -4. Your node begins participating in the Mesa network once the genesis timestamp is reached. +:::danger +Any transactions submitted after the stop-transaction-slot **will not exist on the Mesa chain**. This is the most critical step for exchanges. +::: -### Who should use Manual mode +**Fork day** — The network halts. Bob waits for the Mesa release announcement, then upgrades: -- Operators who need full control over the upgrade process -- Operators with custom deployment pipelines that require explicit upgrade steps -- Operators who want to validate the Mesa build before restarting +```bash +sudo systemctl stop mina +sudo apt-get update +sudo apt-get install mina-mainnet=4.x.x +sudo systemctl start mina +``` -### Requirements +> For detailed upgrade instructions, see [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade). -- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ -- Be prepared to act promptly when the Mesa release is published to minimize downtime -- Meet the [hardware requirements](/network-upgrades/mesa/requirements) +**After the fork** — Block production resumes. Bob verifies his node is on the Mesa chain, confirms Rosetta API is working, then **re-enables MINA deposits and withdrawals**. -## Comparison +```bash +mina client status # verify Mesa chain ID +# test a small internal transfer before opening to customers +``` -| Aspect | Automode | Manual | -|---|---|---| -| Operator intervention during fork | None | Stop, install, restart | -| Downtime | Minimal (automatic transition) | Depends on operator response time | -| Applies to | Daemon nodes only | All node types | -| Control | Automated | Full manual control | -| Risk | Lower (fewer manual steps) | Higher (depends on operator timing) | +> For post-upgrade flags and configurations, see [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). -For in-depth technical details on how the upgrade mechanism works internally, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). +
        --- url: /network-upgrades/mesa/upgrade-steps From c5fcc2e679b7d3b367afd836e6f8a1d9dac3601f Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 14:22:02 +0200 Subject: [PATCH 32/45] =?UTF-8?q?4b:=20upgrade-modes-details=20cleanup=20?= =?UTF-8?q?=E2=80=94=20split=20Troubleshooting,=20Appendix=20category,=20d?= =?UTF-8?q?edupe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Section 4b of PR #1133 review feedback. yamimaio observed that upgrade-modes-details.mdx mixed three different audiences (operators, mechanism deep-dive, troubleshooting) and duplicated content already on upgrade-modes.mdx. Restructure: New page: - docs/network-upgrades/mesa/troubleshooting.mdx (yamimaio #3230085149) — operator-facing troubleshooting: how to tell which binary is active, `mina-berkeley` / `mina-mesa` direct invocation, dispatcher debug/dryrun env vars. Moved out of upgrade-modes-details. upgrade-modes.mdx — promote operator-critical info that was buried in the details page: - New `:::danger Automode requires a persistent config directory and an automatic restart policy:::` callout (yamimaio #3230050702) — the persistence + restart-policy requirement is now visible from the page operators land on. - New "Installing automode" subsection (yamimaio #3230066033) — the Debian `apt-get install …prefork-mesa …postfork-mesa` and Docker `mina-daemon-auto-hardfork` install commands now live here, not in the details page. upgrade-modes-details.mdx — strip duplicated/operator content: - Remove "Which Mode Should I Pick?" section (yamimaio #3230074109) — the side-by-side comparison already exists in upgrade-modes.mdx#comparison. Replace with a short pointer. - Remove "Troubleshooting Automode" section — now lives on the new troubleshooting page; replace with a pointer. - Collapse "Automode Docker Image" + "Automode Debian Packages" install sections into a single "How automode is packaged" paragraph that names which artifact contributes what to the mechanism (the operator-facing install commands moved to upgrade-modes.mdx). sidebars.js (yamimaio #3228596882): - Convert the Mesa "Appendix" sidebar item into a Category with two items: the existing appendix page (schema details) and upgrade-modes-details (now treated as a deep-dive appendix). - Move upgrade-modes-details out of its old top-level slot. - Insert the new Troubleshooting page above the Appendix category. Regenerated static/llms-full.txt (384 pages, was 383). Co-Authored-By: Claude Opus 4.7 (1M context) --- .../network-upgrades/mesa/troubleshooting.mdx | 75 ++++++ .../mesa/upgrade-modes-details.mdx | 124 +--------- docs/network-upgrades/mesa/upgrade-modes.mdx | 25 ++ sidebars.js | 11 +- static/llms-full.txt | 215 ++++++++---------- 5 files changed, 218 insertions(+), 232 deletions(-) create mode 100644 docs/network-upgrades/mesa/troubleshooting.mdx diff --git a/docs/network-upgrades/mesa/troubleshooting.mdx b/docs/network-upgrades/mesa/troubleshooting.mdx new file mode 100644 index 000000000..8aef2503c --- /dev/null +++ b/docs/network-upgrades/mesa/troubleshooting.mdx @@ -0,0 +1,75 @@ +--- +title: Troubleshooting +sidebar_label: Troubleshooting +hide_title: true +description: Troubleshooting the Mesa upgrade — checking which binary your node is running, dispatcher behavior, and debug mode for automode operators. +keywords: + - Mesa + - upgrade + - troubleshooting + - automode + - dispatcher + - debug +--- + +# Troubleshooting + +This page collects common operator questions and debugging tips for the Mesa upgrade. For low-level architecture and dispatcher internals, see [Upgrade Modes — Details](/network-upgrades/mesa/upgrade-modes-details). + +## How do I know which binary my node is using? + +Check whether the activation state file exists. The file is located at: + +`{config-directory}/auto-fork-mesa-{network_id}/activated` + +Where: +- `{config-directory}` is the path passed via `--config-directory` (defaults to `~/.mina-config` on the host, or `/root/.mina-config` in Docker) +- `{network_id}` is the network name (e.g., `mainnet` or `devnet`) + +For example, on a typical mainnet setup: + +```bash +ls ~/.mina-config/auto-fork-mesa-mainnet/activated +``` + +- **File does not exist**: your node is using the pre-fork (Berkeley) binary +- **File exists**: your node has transitioned to the Mesa binary + +## Can I run non-daemon commands or use a specific binary version? + +As described in [Dispatcher Limitations](/network-upgrades/mesa/upgrade-modes-details#dispatcher-limitations), the dispatcher supports `daemon`, `client`, and `--version`. For any other command — including `accounts list`, `ledger export`, and other CLI operations — **you must use the version-specific binary directly**: + +| Binary | Description | Full path | +|---|---|---| +| `mina-berkeley` | Pre-fork binary (current chain) | `/usr/lib/mina/berkeley/mina` | +| `mina-mesa` | Post-fork binary (Mesa chain) | `/usr/lib/mina/mesa/mina` | + +```bash +# Use mina-mesa for all non-daemon commands after the fork +mina-mesa client status +mina-mesa accounts list +mina-mesa ledger export + +# Use mina-berkeley for pre-fork queries +mina-berkeley client status +``` + +These symlinks (`mina-berkeley`, `mina-mesa`) are installed globally by the automode packages and are always available. They bypass the dispatcher entirely and run the binary directly, so they work regardless of the activation state. + +:::caution Do not manipulate the activation state file +While it is technically possible to force the dispatcher to use a specific runtime by creating or removing the `activated` file, **this is strongly discouraged**. Manually manipulating the state file while the network is live can put your node on the wrong chain. If you need to run a specific version, use `mina-berkeley` or `mina-mesa` directly instead. +::: + +## Debug mode + +Set `MINA_DISPATCHER_DEBUG=1` in your environment to see which binary and arguments the dispatcher is using: + +```bash +MINA_DISPATCHER_DEBUG=1 mina daemon ... +``` + +For a dry run (print the command without executing): + +```bash +MINA_DISPATCHER_DRYRUN=1 mina daemon ... +``` diff --git a/docs/network-upgrades/mesa/upgrade-modes-details.mdx b/docs/network-upgrades/mesa/upgrade-modes-details.mdx index 4c82e5254..100265a39 100644 --- a/docs/network-upgrades/mesa/upgrade-modes-details.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes-details.mdx @@ -152,34 +152,13 @@ The daemon does **not** restart itself. Your process manager must detect the exi If your Helm chart or pod spec uses `emptyDir` for the config directory, the `activated` file and generated Mesa config will be lost when the pod restarts. Use a `PersistentVolumeClaim` instead. Also verify that your restart logic does not re-initialize the config directory from scratch — the auto-generated Mesa config must be preserved. ::: -### Automode Docker Image +### How automode is packaged -If you run your node with Docker, use the **automode** image (`mina-daemon-auto-hardfork`): +Operator install instructions (Debian packages, Docker image) live on [Upgrade Modes — Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). The detail worth keeping here is what each artifact contributes to the mechanism described above: -``` -minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} -``` - -This image: -- Installs both the pre-fork and post-fork Debian packages -- Sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher -- Sets `MINA_HARDFORK_STATE_DIR=/root/.mina-config` for the activation state file - -You start it with the same flags you normally use. The dispatcher handles the rest. - -### Automode Debian Packages - -If you run your node directly on a server (not Docker), install **both** automode Debian packages: - -```bash -sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa -``` - -Both packages are required for automode to work: -- `mina-{network}-prefork-mesa` — the pre-fork binary that runs the current chain up to the stop-network-slot -- `mina-{network}-postfork-mesa` — the post-fork binary that runs the Mesa chain after the fork - -The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the required configuration in `/etc/default/mina-dispatch`. +- The `mina-{network}-prefork-mesa` Debian package supplies the pre-fork binary (`/usr/lib/mina/berkeley/mina`). +- The `mina-{network}-postfork-mesa` Debian package supplies the post-fork binary (`/usr/lib/mina/mesa/mina`), the dispatcher (`/usr/local/bin/mina-dispatch`), and the dispatcher configuration (`/etc/default/mina-dispatch`). +- The `minaprotocol/mina-daemon-auto-hardfork` Docker image bundles both packages and sets `MINA_APP=/usr/local/bin/mina-dispatch` and `MINA_HARDFORK_STATE_DIR=/root/.mina-config` in the entrypoint. :::caution The dispatcher reads its configuration from `/etc/default/mina-dispatch`. This file must exist and be owned by root. Do not modify it unless you know what you are doing. @@ -223,95 +202,10 @@ minaprotocol/mina-daemon-hardfork:{version}-{codename}-{network} This image includes both pre-fork and post-fork packages but uses a dedicated hardfork entrypoint that requires manual intervention to complete the transition. -## Which Mode Should I Pick? - -### Choose Automode if: - -- You want zero intervention during the fork window -- You are comfortable with the dispatcher managing binary routing -- You run a standard block producer or SNARK coordinator setup -- You want to minimize the risk of missing the Mesa genesis timestamp +## Which mode should I pick? -### Choose Manual mode if: +The "who should use" criteria for each mode and the side-by-side comparison live on [Upgrade Modes](/network-upgrades/mesa/upgrade-modes#comparison) — this page intentionally stays focused on the underlying mechanism so the two documents do not drift. -- You have custom deployment automation that controls which binary runs -- You want to inspect the Mesa release before starting it -- You run a non-standard setup where automatic argument rewriting could cause issues -- You need to coordinate the upgrade with other infrastructure changes +## Operator troubleshooting -### Key Differences at a Glance - -| | Automode | Manual | -|---|---|---| -| Packages installed | Pre-fork + post-fork + dispatcher | Pre-fork only (Mesa installed later) | -| Binary switching | Automatic via dispatcher | You stop old, install new, start new | -| Flag changes at fork | Handled by dispatcher | You update flags yourself | -| Downtime at fork | Seconds (automatic transition) | Minutes to hours (depends on you) | -| Docker image | `mina-daemon-auto-hardfork` | `mina-daemon-hardfork` | -| Risk of missing genesis | Very low | Depends on how fast you act | - -:::info For block producers worried about missed blocks -With **automode**, your node transitions automatically at the stop-network-slot. As long as your node was running during State Finalization, it will be ready to produce blocks at the Mesa genesis timestamp without any action from you. - -With **manual mode**, the time between the stop-network-slot and when you restart your node on Mesa is downtime. If the Mesa genesis timestamp arrives before you finish the upgrade, you will miss blocks until your node catches up. -::: - -## Troubleshooting Automode - -### How do I know which binary my node is using? - -Check whether the activation state file exists. The file is located at: - -`{config-directory}/auto-fork-mesa-{network_id}/activated` - -Where: -- `{config-directory}` is the path passed via `--config-directory` (defaults to `~/.mina-config` on the host, or `/root/.mina-config` in Docker) -- `{network_id}` is the network name (e.g., `mainnet` or `devnet`) - -For example, on a typical mainnet setup: - -```bash -ls ~/.mina-config/auto-fork-mesa-mainnet/activated -``` - -- **File does not exist**: your node is using the pre-fork (Berkeley) binary -- **File exists**: your node has transitioned to the Mesa binary - -### Can I run non-daemon commands or use a specific binary version? - -As described in the [Dispatcher Limitations](#dispatcher-limitations) section, the dispatcher supports `daemon`, `client`, and `--version`. For any other command — including `accounts list`, `ledger export`, and other CLI operations — **you must use the version-specific binary directly**: - -| Binary | Description | Full path | -|---|---|---| -| `mina-berkeley` | Pre-fork binary (current chain) | `/usr/lib/mina/berkeley/mina` | -| `mina-mesa` | Post-fork binary (Mesa chain) | `/usr/lib/mina/mesa/mina` | - -```bash -# Use mina-mesa for all non-daemon commands after the fork -mina-mesa client status -mina-mesa accounts list -mina-mesa ledger export - -# Use mina-berkeley for pre-fork queries -mina-berkeley client status -``` - -These symlinks (`mina-berkeley`, `mina-mesa`) are installed globally by the automode packages and are always available. They bypass the dispatcher entirely and run the binary directly, so they work regardless of the activation state. - -:::caution Do not manipulate the activation state file -While it is technically possible to force the dispatcher to use a specific runtime by creating or removing the `activated` file, **this is strongly discouraged**. Manually manipulating the state file while the network is live can put your node on the wrong chain. If you need to run a specific version, use `mina-berkeley` or `mina-mesa` directly instead. -::: - -### Debug mode - -Set `MINA_DISPATCHER_DEBUG=1` in your environment to see which binary and arguments the dispatcher is using: - -```bash -MINA_DISPATCHER_DEBUG=1 mina daemon ... -``` - -For a dry run (print the command without executing): - -```bash -MINA_DISPATCHER_DRYRUN=1 mina daemon ... -``` +Operator-facing troubleshooting (how to tell which binary is active, dispatcher debug mode, when to use `mina-berkeley` vs `mina-mesa` directly) has moved to its own page: [Troubleshooting](/network-upgrades/mesa/troubleshooting). diff --git a/docs/network-upgrades/mesa/upgrade-modes.mdx b/docs/network-upgrades/mesa/upgrade-modes.mdx index 2e335462d..d8df2c814 100644 --- a/docs/network-upgrades/mesa/upgrade-modes.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes.mdx @@ -51,6 +51,31 @@ Automode is **not** available for the following — operators of these node type Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). ::: +:::danger Automode requires a persistent config directory and an automatic restart policy +At the fork, the daemon **exits cleanly** (exit code 0) after writing the Mesa configuration and an `activated` marker to the config directory. It does **not** restart itself. Your process manager must restart it, and the config directory must survive that restart for the dispatcher to find the `activated` marker. + +- **Persistent config directory**: `~/.mina-config` (host) or a named Docker volume / Kubernetes `PersistentVolumeClaim` mounted at `/root/.mina-config` (container). An ephemeral `emptyDir` will lose the `activated` file and break the transition. +- **Automatic restart policy**: `Restart=always` on systemd (default in the Mina unit), `--restart=always` on Docker, `restartPolicy: Always` on Kubernetes. + +Failing to meet either requirement means your node will not join the Mesa network at genesis. See [Upgrade Modes — Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements) for the underlying mechanism. +::: + +### Installing automode + +On Debian, install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: + +```bash +sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa +``` + +On Docker, use the `mina-daemon-auto-hardfork` image (the regular `mina-daemon` image is manual-mode only): + +``` +minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} +``` + +The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher automatically. Start it with your normal flags — see the Docker automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + ## Manual Mode Manual mode gives operators full control over each step of the upgrade process. diff --git a/sidebars.js b/sidebars.js index b8e0ec084..97adf31a9 100644 --- a/sidebars.js +++ b/sidebars.js @@ -56,7 +56,6 @@ module.exports = { items: [ 'network-upgrades/mesa/requirements', 'network-upgrades/mesa/upgrade-modes', - 'network-upgrades/mesa/upgrade-modes-details', 'network-upgrades/mesa/docker-compose-quickstart', { type: 'category', @@ -76,7 +75,15 @@ module.exports = { 'network-upgrades/mesa/archive-upgrade', 'network-upgrades/mesa/replayer', 'network-upgrades/mesa/preflight-network', - 'network-upgrades/mesa/appendix', + 'network-upgrades/mesa/troubleshooting', + { + type: 'category', + label: 'Appendix', + items: [ + 'network-upgrades/mesa/appendix', + 'network-upgrades/mesa/upgrade-modes-details', + ], + }, 'network-upgrades/mesa/glossary', ], }, diff --git a/static/llms-full.txt b/static/llms-full.txt index 9e9d0d5b1..fb1b86553 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -6737,6 +6737,72 @@ mina libp2p generate-keypair --privkey-path Further information on [generating key pairs](/node-operators/validator-node/generating-a-keypair) on Mina Protocol. +--- +url: /network-upgrades/mesa/troubleshooting +--- + +# Troubleshooting + +This page collects common operator questions and debugging tips for the Mesa upgrade. For low-level architecture and dispatcher internals, see [Upgrade Modes — Details](/network-upgrades/mesa/upgrade-modes-details). + +## How do I know which binary my node is using? + +Check whether the activation state file exists. The file is located at: + +`{config-directory}/auto-fork-mesa-{network_id}/activated` + +Where: +- `{config-directory}` is the path passed via `--config-directory` (defaults to `~/.mina-config` on the host, or `/root/.mina-config` in Docker) +- `{network_id}` is the network name (e.g., `mainnet` or `devnet`) + +For example, on a typical mainnet setup: + +```bash +ls ~/.mina-config/auto-fork-mesa-mainnet/activated +``` + +- **File does not exist**: your node is using the pre-fork (Berkeley) binary +- **File exists**: your node has transitioned to the Mesa binary + +## Can I run non-daemon commands or use a specific binary version? + +As described in [Dispatcher Limitations](/network-upgrades/mesa/upgrade-modes-details#dispatcher-limitations), the dispatcher supports `daemon`, `client`, and `--version`. For any other command — including `accounts list`, `ledger export`, and other CLI operations — **you must use the version-specific binary directly**: + +| Binary | Description | Full path | +|---|---|---| +| `mina-berkeley` | Pre-fork binary (current chain) | `/usr/lib/mina/berkeley/mina` | +| `mina-mesa` | Post-fork binary (Mesa chain) | `/usr/lib/mina/mesa/mina` | + +```bash +# Use mina-mesa for all non-daemon commands after the fork +mina-mesa client status +mina-mesa accounts list +mina-mesa ledger export + +# Use mina-berkeley for pre-fork queries +mina-berkeley client status +``` + +These symlinks (`mina-berkeley`, `mina-mesa`) are installed globally by the automode packages and are always available. They bypass the dispatcher entirely and run the binary directly, so they work regardless of the activation state. + +:::caution Do not manipulate the activation state file +While it is technically possible to force the dispatcher to use a specific runtime by creating or removing the `activated` file, **this is strongly discouraged**. Manually manipulating the state file while the network is live can put your node on the wrong chain. If you need to run a specific version, use `mina-berkeley` or `mina-mesa` directly instead. +::: + +## Debug mode + +Set `MINA_DISPATCHER_DEBUG=1` in your environment to see which binary and arguments the dispatcher is using: + +```bash +MINA_DISPATCHER_DEBUG=1 mina daemon ... +``` + +For a dry run (print the command without executing): + +```bash +MINA_DISPATCHER_DRYRUN=1 mina daemon ... +``` + --- url: /network-upgrades/mesa/upgrade-modes-details --- @@ -6879,34 +6945,13 @@ The daemon does **not** restart itself. Your process manager must detect the exi If your Helm chart or pod spec uses `emptyDir` for the config directory, the `activated` file and generated Mesa config will be lost when the pod restarts. Use a `PersistentVolumeClaim` instead. Also verify that your restart logic does not re-initialize the config directory from scratch — the auto-generated Mesa config must be preserved. ::: -### Automode Docker Image - -If you run your node with Docker, use the **automode** image (`mina-daemon-auto-hardfork`): - -``` -minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} -``` - -This image: -- Installs both the pre-fork and post-fork Debian packages -- Sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher -- Sets `MINA_HARDFORK_STATE_DIR=/root/.mina-config` for the activation state file - -You start it with the same flags you normally use. The dispatcher handles the rest. +### How automode is packaged -### Automode Debian Packages +Operator install instructions (Debian packages, Docker image) live on [Upgrade Modes — Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). The detail worth keeping here is what each artifact contributes to the mechanism described above: -If you run your node directly on a server (not Docker), install **both** automode Debian packages: - -```bash -sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa -``` - -Both packages are required for automode to work: -- `mina-{network}-prefork-mesa` — the pre-fork binary that runs the current chain up to the stop-network-slot -- `mina-{network}-postfork-mesa` — the post-fork binary that runs the Mesa chain after the fork - -The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the required configuration in `/etc/default/mina-dispatch`. +- The `mina-{network}-prefork-mesa` Debian package supplies the pre-fork binary (`/usr/lib/mina/berkeley/mina`). +- The `mina-{network}-postfork-mesa` Debian package supplies the post-fork binary (`/usr/lib/mina/mesa/mina`), the dispatcher (`/usr/local/bin/mina-dispatch`), and the dispatcher configuration (`/etc/default/mina-dispatch`). +- The `minaprotocol/mina-daemon-auto-hardfork` Docker image bundles both packages and sets `MINA_APP=/usr/local/bin/mina-dispatch` and `MINA_HARDFORK_STATE_DIR=/root/.mina-config` in the entrypoint. :::caution The dispatcher reads its configuration from `/etc/default/mina-dispatch`. This file must exist and be owned by root. Do not modify it unless you know what you are doing. @@ -6950,98 +6995,13 @@ minaprotocol/mina-daemon-hardfork:{version}-{codename}-{network} This image includes both pre-fork and post-fork packages but uses a dedicated hardfork entrypoint that requires manual intervention to complete the transition. -## Which Mode Should I Pick? - -### Choose Automode if: +## Which mode should I pick? -- You want zero intervention during the fork window -- You are comfortable with the dispatcher managing binary routing -- You run a standard block producer or SNARK coordinator setup -- You want to minimize the risk of missing the Mesa genesis timestamp +The "who should use" criteria for each mode and the side-by-side comparison live on [Upgrade Modes](/network-upgrades/mesa/upgrade-modes#comparison) — this page intentionally stays focused on the underlying mechanism so the two documents do not drift. -### Choose Manual mode if: +## Operator troubleshooting -- You have custom deployment automation that controls which binary runs -- You want to inspect the Mesa release before starting it -- You run a non-standard setup where automatic argument rewriting could cause issues -- You need to coordinate the upgrade with other infrastructure changes - -### Key Differences at a Glance - -| | Automode | Manual | -|---|---|---| -| Packages installed | Pre-fork + post-fork + dispatcher | Pre-fork only (Mesa installed later) | -| Binary switching | Automatic via dispatcher | You stop old, install new, start new | -| Flag changes at fork | Handled by dispatcher | You update flags yourself | -| Downtime at fork | Seconds (automatic transition) | Minutes to hours (depends on you) | -| Docker image | `mina-daemon-auto-hardfork` | `mina-daemon-hardfork` | -| Risk of missing genesis | Very low | Depends on how fast you act | - -:::info For block producers worried about missed blocks -With **automode**, your node transitions automatically at the stop-network-slot. As long as your node was running during State Finalization, it will be ready to produce blocks at the Mesa genesis timestamp without any action from you. - -With **manual mode**, the time between the stop-network-slot and when you restart your node on Mesa is downtime. If the Mesa genesis timestamp arrives before you finish the upgrade, you will miss blocks until your node catches up. -::: - -## Troubleshooting Automode - -### How do I know which binary my node is using? - -Check whether the activation state file exists. The file is located at: - -`{config-directory}/auto-fork-mesa-{network_id}/activated` - -Where: -- `{config-directory}` is the path passed via `--config-directory` (defaults to `~/.mina-config` on the host, or `/root/.mina-config` in Docker) -- `{network_id}` is the network name (e.g., `mainnet` or `devnet`) - -For example, on a typical mainnet setup: - -```bash -ls ~/.mina-config/auto-fork-mesa-mainnet/activated -``` - -- **File does not exist**: your node is using the pre-fork (Berkeley) binary -- **File exists**: your node has transitioned to the Mesa binary - -### Can I run non-daemon commands or use a specific binary version? - -As described in the [Dispatcher Limitations](#dispatcher-limitations) section, the dispatcher supports `daemon`, `client`, and `--version`. For any other command — including `accounts list`, `ledger export`, and other CLI operations — **you must use the version-specific binary directly**: - -| Binary | Description | Full path | -|---|---|---| -| `mina-berkeley` | Pre-fork binary (current chain) | `/usr/lib/mina/berkeley/mina` | -| `mina-mesa` | Post-fork binary (Mesa chain) | `/usr/lib/mina/mesa/mina` | - -```bash -# Use mina-mesa for all non-daemon commands after the fork -mina-mesa client status -mina-mesa accounts list -mina-mesa ledger export - -# Use mina-berkeley for pre-fork queries -mina-berkeley client status -``` - -These symlinks (`mina-berkeley`, `mina-mesa`) are installed globally by the automode packages and are always available. They bypass the dispatcher entirely and run the binary directly, so they work regardless of the activation state. - -:::caution Do not manipulate the activation state file -While it is technically possible to force the dispatcher to use a specific runtime by creating or removing the `activated` file, **this is strongly discouraged**. Manually manipulating the state file while the network is live can put your node on the wrong chain. If you need to run a specific version, use `mina-berkeley` or `mina-mesa` directly instead. -::: - -### Debug mode - -Set `MINA_DISPATCHER_DEBUG=1` in your environment to see which binary and arguments the dispatcher is using: - -```bash -MINA_DISPATCHER_DEBUG=1 mina daemon ... -``` - -For a dry run (print the command without executing): - -```bash -MINA_DISPATCHER_DRYRUN=1 mina daemon ... -``` +Operator-facing troubleshooting (how to tell which binary is active, dispatcher debug mode, when to use `mina-berkeley` vs `mina-mesa` directly) has moved to its own page: [Troubleshooting](/network-upgrades/mesa/troubleshooting). --- url: /network-upgrades/mesa/upgrade-modes @@ -7087,6 +7047,31 @@ Automode is **not** available for the following — operators of these node type Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). ::: +:::danger Automode requires a persistent config directory and an automatic restart policy +At the fork, the daemon **exits cleanly** (exit code 0) after writing the Mesa configuration and an `activated` marker to the config directory. It does **not** restart itself. Your process manager must restart it, and the config directory must survive that restart for the dispatcher to find the `activated` marker. + +- **Persistent config directory**: `~/.mina-config` (host) or a named Docker volume / Kubernetes `PersistentVolumeClaim` mounted at `/root/.mina-config` (container). An ephemeral `emptyDir` will lose the `activated` file and break the transition. +- **Automatic restart policy**: `Restart=always` on systemd (default in the Mina unit), `--restart=always` on Docker, `restartPolicy: Always` on Kubernetes. + +Failing to meet either requirement means your node will not join the Mesa network at genesis. See [Upgrade Modes — Details](/network-upgrades/mesa/upgrade-modes-details#restart-and-filesystem-requirements) for the underlying mechanism. +::: + +### Installing automode + +On Debian, install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: + +```bash +sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa +``` + +On Docker, use the `mina-daemon-auto-hardfork` image (the regular `mina-daemon` image is manual-mode only): + +``` +minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} +``` + +The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher automatically. Start it with your normal flags — see the Docker automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + ## Manual Mode Manual mode gives operators full control over each step of the upgrade process. From 47ddfe3abe291db3a11d2836420cb27285603c02 Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 14:23:19 +0200 Subject: [PATCH 33/45] 4c: strip duplicated "By Role" section from upgrade-steps/index.mdx MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address Section 4c of PR #1133 review feedback (yamimaio #3230147631). The "What You Need to Do — By Role" section duplicated content available elsewhere: - The per-role AI-generated timeline diagrams duplicated the same images already removed from mesa/index.mdx in commit 412c6a13. - The Block Producer code snippets (Docker automode, Debian automode, Docker manual, Debian manual) duplicated either the Alice/Carlos examples now on the new examples.mdx page (4a) or the install commands now on upgrade-modes.mdx (4b). - The SNARK Worker subsection duplicated the coordinator-spawned vs standalone explanation already on the SNARK Worker tab of pre-upgrade.mdx (commit b85eb94e). - The Archive Node / Exchange subsections were one-line pointers to pages they already linked to. Replace the whole section with a short "Walkthroughs by role" pointer block: per-phase pages cover what every role does at each step, examples.mdx covers end-to-end narrative walkthroughs by role, and role-specific quick links point to the relevant sub-pages (upgrade-modes for daemon, pre-upgrade for SNARK workers, archive-upgrade for archive operators, post-upgrade for exchanges). The exchange danger admonition is retained — it's the only piece of content here that didn't have a single canonical home elsewhere. File shrinks from 203 lines to ~45. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../mesa/upgrade-steps/index.mdx | 173 +----------------- static/llms-full.txt | 173 +----------------- 2 files changed, 16 insertions(+), 330 deletions(-) diff --git a/docs/network-upgrades/mesa/upgrade-steps/index.mdx b/docs/network-upgrades/mesa/upgrade-steps/index.mdx index 521f3be03..62ac33815 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/index.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/index.mdx @@ -29,174 +29,17 @@ The Mesa upgrade proceeds through four sequential phases. Each phase has specifi Before proceeding, make sure you have reviewed the [Requirements](/network-upgrades/mesa/requirements) and chosen your [Upgrade Mode](/network-upgrades/mesa/upgrade-modes). ---- - -## What You Need to Do — By Role - -### Block Producer (Automode — Recommended) - -This is the simplest path. You install one update and your node handles the rest. - -Block Producer Automode upgrade schedule: install stop-slot release weeks before, keep node running during state finalization, node switches to Mesa automatically on fork day, monitor after - -**Example — Docker (automode):** -```bash -# Pre-Upgrade: switch to the automode image -docker pull minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet - -# Note: `--restart=always` + a named volume for the config directory are required. -# Automode shuts the daemon down cleanly when the fork activates; the process -# manager must restart it, and the `activated` marker file must survive that -# restart so the dispatcher knows to launch the Mesa binary. -docker run --name mina -d \ - --restart=always \ - -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json - -# That's it. Your node will automatically transition to Mesa at the fork. -# After the fork, verify it switched: -docker exec mina ls /root/.mina-config/auto-fork-mesa-mainnet/activated -docker exec mina mina client status -``` - -**Example — Debian (automode):** -```bash -# Pre-Upgrade: install both prefork and postfork packages -sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x - -# Start your node as usual — the dispatcher routes to the correct binary -mina daemon \ - --block-producer-key ~/keys/my-wallet \ - --config-directory ~/.mina-config \ - --libp2p-keypair ~/keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json - -# After the network halts, verify: -ls ~/.mina-config/auto-fork-mesa-mainnet/activated # exists = Mesa is active -mina client status # should show Mesa chain -``` - -### Block Producer (Manual Mode) - -You control every step, but you need to act fast when the Mesa release is published. - -Block Producer Manual upgrade schedule: install stop-slot release weeks before, keep node running during state finalization, stop node and install Mesa release on fork day, monitor after - -**Example — Docker (manual):** -```bash -# Pre-Upgrade: pull the stop-slot image and start your node -docker pull minaprotocol/mina-daemon:-bullseye-mainnet - -docker run --name mina -d \ - --restart=always \ - -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json - -# Run your node normally until the network halts at stop-network-slot -# ... - -# Upgrade phase: once the Mesa release is published -docker stop mina && docker rm mina - -docker pull minaprotocol/mina-daemon:-bullseye-mainnet - -docker run --name mina -d \ - --restart=always \ - -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json - -# After the fork, verify: -docker exec mina mina client status # should show Mesa chain -``` - -**Example — Debian (manual):** -```bash -# Pre-Upgrade: install the stop-slot release -sudo apt-get update -sudo apt-get install mina-mainnet=3.x.x - -# Run your node normally until the network halts at stop-network-slot -# ... - -# Upgrade phase: once the Mesa release is published -sudo systemctl stop mina - -sudo apt-get update -sudo apt-get install mina-mainnet=4.x.x - -# Restart with updated flags (see Post-Upgrade Flags page) -sudo systemctl start mina -``` - -After the fork, verify the chain: - -```bash -mina client status # should show Mesa chain -``` - -### SNARK Coordinator - -A SNARK coordinator is a daemon node and follows the same path as a Block Producer in [Manual Mode](#block-producer-manual-mode). The coordinator does not transition automatically — you must stop it after the network halts, install the Mesa release, and restart. - -### SNARK Workers - -There are two deployment patterns and they upgrade differently: - -- **Workers spawned by a coordinator** (the common case — `--snark-worker-fee` / `--run-snark-worker` set on the coordinator) do not need an independent upgrade. They inherit the coordinator's binary, so when the coordinator restarts on Mesa, the spawned workers restart on Mesa. -- **Standalone workers** (`mina internal snark-worker …` run as a separate process or container) must be redeployed with the Mesa binary themselves. Stop each standalone worker after the fork, install the Mesa release (or pull the Mesa Docker image), and restart it pointing at the upgraded coordinator. Workers running an older binary cannot submit work to a Mesa coordinator. - -### Archive Node Operator - -Archive nodes do **not** support automode — they always require manual steps. You also need to handle the database schema upgrade. - -Archive Node upgrade schedule: install stop-slot release and choose upgrade method weeks before, keep archive running during state finalization, point to upgraded DB or import dump on fork day, verify data after +## Walkthroughs by role -See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) for detailed upgrade instructions. +The per-phase pages above describe what every role does at each step. For end-to-end narrative walkthroughs with concrete commands by role and deployment style (block producer automode/manual, archive node, zkApp developer, exchange), see the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. -### Exchange +Role-specific quick references: -Exchange upgrade schedule: test integration and install stop-slot release weeks before, disable MINA deposits and withdrawals during state finalization, install Mesa release on fork day, re-enable deposits and verify after +- **Block Producers & SNARK Coordinators** — pick a mode on [Upgrade Modes](/network-upgrades/mesa/upgrade-modes). Install commands for automode are in [Upgrade Modes — Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). +- **SNARK Workers** — coordinator-spawned workers inherit the coordinator's binary; standalone `mina internal snark-worker` deployments must be redeployed with the Mesa binary after the fork. See the SNARK Worker tab in [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). +- **Archive Node Operators** — archive nodes do **not** support automode. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) for the schema upgrade and trustless/trustful paths. +- **Exchanges** — disable MINA deposits and withdrawals before the _stop-transaction-slot_ and keep them disabled until Mesa block production resumes. See [Exchanges](/network-upgrades/mesa/upgrade-steps/post-upgrade) on the Post-Upgrade page for the re-enable checklist. :::danger For exchanges -Any transactions submitted after the _stop-transaction-slot_ **will not exist on the Mesa chain**. Disable deposits and withdrawals **before** State Finalization begins and keep them disabled until block production resumes on Mesa. +Any transactions submitted after the _stop-transaction-slot_ **will not exist on the Mesa chain**. Disable deposits and withdrawals **before** [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization) begins and keep them disabled until block production resumes on Mesa. ::: diff --git a/static/llms-full.txt b/static/llms-full.txt index fb1b86553..2da3be4dd 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -7416,176 +7416,19 @@ The Mesa upgrade proceeds through four sequential phases. Each phase has specifi Before proceeding, make sure you have reviewed the [Requirements](/network-upgrades/mesa/requirements) and chosen your [Upgrade Mode](/network-upgrades/mesa/upgrade-modes). ---- - -## What You Need to Do — By Role - -### Block Producer (Automode — Recommended) - -This is the simplest path. You install one update and your node handles the rest. - -Block Producer Automode upgrade schedule: install stop-slot release weeks before, keep node running during state finalization, node switches to Mesa automatically on fork day, monitor after - -**Example — Docker (automode):** -```bash -# Pre-Upgrade: switch to the automode image -docker pull minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet - -# Note: `--restart=always` + a named volume for the config directory are required. -# Automode shuts the daemon down cleanly when the fork activates; the process -# manager must restart it, and the `activated` marker file must survive that -# restart so the dispatcher knows to launch the Mesa binary. -docker run --name mina -d \ - --restart=always \ - -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon-auto-hardfork:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json +## Walkthroughs by role -# That's it. Your node will automatically transition to Mesa at the fork. -# After the fork, verify it switched: -docker exec mina ls /root/.mina-config/auto-fork-mesa-mainnet/activated -docker exec mina mina client status -``` +The per-phase pages above describe what every role does at each step. For end-to-end narrative walkthroughs with concrete commands by role and deployment style (block producer automode/manual, archive node, zkApp developer, exchange), see the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. -**Example — Debian (automode):** -```bash -# Pre-Upgrade: install both prefork and postfork packages -sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x - -# Start your node as usual — the dispatcher routes to the correct binary -mina daemon \ - --block-producer-key ~/keys/my-wallet \ - --config-directory ~/.mina-config \ - --libp2p-keypair ~/keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json - -# After the network halts, verify: -ls ~/.mina-config/auto-fork-mesa-mainnet/activated # exists = Mesa is active -mina client status # should show Mesa chain -``` - -### Block Producer (Manual Mode) - -You control every step, but you need to act fast when the Mesa release is published. - -Block Producer Manual upgrade schedule: install stop-slot release weeks before, keep node running during state finalization, stop node and install Mesa release on fork day, monitor after - -**Example — Docker (manual):** -```bash -# Pre-Upgrade: pull the stop-slot image and start your node -docker pull minaprotocol/mina-daemon:-bullseye-mainnet - -docker run --name mina -d \ - --restart=always \ - -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json +Role-specific quick references: -# Run your node normally until the network halts at stop-network-slot -# ... - -# Upgrade phase: once the Mesa release is published -docker stop mina && docker rm mina - -docker pull minaprotocol/mina-daemon:-bullseye-mainnet - -docker run --name mina -d \ - --restart=always \ - -v mina-config:/root/.mina-config \ - minaprotocol/mina-daemon:-bullseye-mainnet \ - daemon \ - --block-producer-key /keys/my-wallet \ - --config-directory /root/.mina-config \ - --libp2p-keypair /keys/libp2p-key \ - --peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt \ - --file-log-rotations 500 \ - --log-json - -# After the fork, verify: -docker exec mina mina client status # should show Mesa chain -``` - -**Example — Debian (manual):** -```bash -# Pre-Upgrade: install the stop-slot release -sudo apt-get update -sudo apt-get install mina-mainnet=3.x.x - -# Run your node normally until the network halts at stop-network-slot -# ... - -# Upgrade phase: once the Mesa release is published -sudo systemctl stop mina - -sudo apt-get update -sudo apt-get install mina-mainnet=4.x.x - -# Restart with updated flags (see Post-Upgrade Flags page) -sudo systemctl start mina -``` - -After the fork, verify the chain: - -```bash -mina client status # should show Mesa chain -``` - -### SNARK Coordinator - -A SNARK coordinator is a daemon node and follows the same path as a Block Producer in [Manual Mode](#block-producer-manual-mode). The coordinator does not transition automatically — you must stop it after the network halts, install the Mesa release, and restart. - -### SNARK Workers - -There are two deployment patterns and they upgrade differently: - -- **Workers spawned by a coordinator** (the common case — `--snark-worker-fee` / `--run-snark-worker` set on the coordinator) do not need an independent upgrade. They inherit the coordinator's binary, so when the coordinator restarts on Mesa, the spawned workers restart on Mesa. -- **Standalone workers** (`mina internal snark-worker …` run as a separate process or container) must be redeployed with the Mesa binary themselves. Stop each standalone worker after the fork, install the Mesa release (or pull the Mesa Docker image), and restart it pointing at the upgraded coordinator. Workers running an older binary cannot submit work to a Mesa coordinator. - -### Archive Node Operator - -Archive nodes do **not** support automode — they always require manual steps. You also need to handle the database schema upgrade. - -Archive Node upgrade schedule: install stop-slot release and choose upgrade method weeks before, keep archive running during state finalization, point to upgraded DB or import dump on fork day, verify data after - -See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) for detailed upgrade instructions. - -### Exchange - -Exchange upgrade schedule: test integration and install stop-slot release weeks before, disable MINA deposits and withdrawals during state finalization, install Mesa release on fork day, re-enable deposits and verify after +- **Block Producers & SNARK Coordinators** — pick a mode on [Upgrade Modes](/network-upgrades/mesa/upgrade-modes). Install commands for automode are in [Upgrade Modes — Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). +- **SNARK Workers** — coordinator-spawned workers inherit the coordinator's binary; standalone `mina internal snark-worker` deployments must be redeployed with the Mesa binary after the fork. See the SNARK Worker tab in [Pre-Upgrade](/network-upgrades/mesa/upgrade-steps/pre-upgrade). +- **Archive Node Operators** — archive nodes do **not** support automode. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) for the schema upgrade and trustless/trustful paths. +- **Exchanges** — disable MINA deposits and withdrawals before the _stop-transaction-slot_ and keep them disabled until Mesa block production resumes. See [Exchanges](/network-upgrades/mesa/upgrade-steps/post-upgrade) on the Post-Upgrade page for the re-enable checklist. :::danger For exchanges -Any transactions submitted after the _stop-transaction-slot_ **will not exist on the Mesa chain**. Disable deposits and withdrawals **before** State Finalization begins and keep them disabled until block production resumes on Mesa. +Any transactions submitted after the _stop-transaction-slot_ **will not exist on the Mesa chain**. Disable deposits and withdrawals **before** [State Finalization](/network-upgrades/mesa/upgrade-steps/state-finalization) begins and keep them disabled until block production resumes on Mesa. ::: --- From 1cfdd2a290cde1cfbd79db0dd5d1e742cd0d7916 Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 14:26:34 +0200 Subject: [PATCH 34/45] =?UTF-8?q?4d:=20misc=20structural=20cleanup=20?= =?UTF-8?q?=E2=80=94=20upgrade-modes=20ordering,=20sidebar=20moves,=20dedu?= =?UTF-8?q?p?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address the smaller Section 4 review items grouped under "Other". upgrade-modes.mdx: - Reorder both Automode and Manual sections so Requirements comes before "How it works" (glyh #3198975457, yamimaio #3228833395). Operators want to know the prerequisites before they read the step-by-step. Also rename the two "How it works" subsections to "How automode works during the fork" / "How manual mode works during the fork" so the heading describes mechanism, not a to-do list. - Manual Mode section: explicitly state that Archive node and Rosetta API operators must use manual mode (yamimaio #3228818513). Add Archive / Rosetta bullets to the "Who should use Manual mode" list so the constraint is impossible to miss. sidebars.js (yamimaio #3230094542): - Move `network-upgrades/mesa/docker-compose-quickstart` out of the top-level Mesa Upgrade items list and into the Appendix category (alongside `appendix` and `upgrade-modes-details`). The page is reference material rather than part of the main upgrade flow. replayer.mdx (glyh #3198983919): - Add an `:::info Not Mesa-specific:::` admonition at the top explaining that mina-replayer is a general-purpose archive verification tool — this page just happens to cover the role it plays at hard-fork time. A future revision may relocate the general parts of this page to the Archive Node section. upgrade-steps/pre-upgrade.mdx (glyh #3199028680): - Add a lead-in paragraph pointing to the Requirements page and explaining the checklist intentionally avoids repeating concrete hardware specs (RAM/CPU/storage) so they only live in one place. - Strip "— 32 GB RAM, 8-core CPU" suffixes from the SNARK Coordinator and Archive Node tabs; keep a short per-worker note on the SNARK Worker tab pointing to the requirements row. - Fix four occurrences of a broken auto-restart link: `/node-operators/block-producer-node/connecting-to-the-network` does not exist (the file lives under `validator-node/`), and the `#start-a-mina-node-with-auto-restart-flows-using-systemd` anchor was already removed from that page. Repoint at `/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service`, matching the same fix applied to requirements.mdx in commit 99f99841. Regenerated static/llms-full.txt (still 384 pages). Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/replayer.mdx | 4 + docs/network-upgrades/mesa/upgrade-modes.mdx | 54 ++++++------- .../mesa/upgrade-steps/pre-upgrade.mdx | 20 ++--- sidebars.js | 2 +- static/llms-full.txt | 78 ++++++++++--------- 5 files changed, 87 insertions(+), 71 deletions(-) diff --git a/docs/network-upgrades/mesa/replayer.mdx b/docs/network-upgrades/mesa/replayer.mdx index ec6ca0d31..f0129d0a6 100644 --- a/docs/network-upgrades/mesa/replayer.mdx +++ b/docs/network-upgrades/mesa/replayer.mdx @@ -15,6 +15,10 @@ keywords: # Archive Replayer +:::info Not Mesa-specific +`mina-replayer` is a general-purpose archive verification tool shipped with every release of Mina (Berkeley today, Mesa after the fork). This page lives under the Mesa Upgrade section because the replayer plays a specific role at hard-fork time, but the commands, validation workflow, and troubleshooting on this page apply equally to a non-fork day. A future revision of the docs may relocate the general parts of this page to the Archive Node section. +::: + The `mina-replayer` is a tool that replays all transactions from a Mina archive database, applying them sequentially to reconstruct the ledger state. It is an **ongoing verification tool** — not limited to upgrade time. You can run it at any point to confirm your archive database faithfully represents the canonical chain. During the Mesa hard fork, the replayer serves a critical role: it verifies that the archive database is consistent and produces the ledger checkpoint needed to bootstrap the new chain. After the upgrade, it continues to be useful for detecting data corruption, missing blocks, or schema issues in your archive. diff --git a/docs/network-upgrades/mesa/upgrade-modes.mdx b/docs/network-upgrades/mesa/upgrade-modes.mdx index d8df2c814..8b8195a0c 100644 --- a/docs/network-upgrades/mesa/upgrade-modes.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes.mdx @@ -19,15 +19,11 @@ The Mesa upgrade supports two modes for daemon node operators: **Automode** and Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. -### How it works +### Requirements -1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. -2. Your node participates normally in block production through the State Finalization phase. -3. When the network reaches the _stop-network-slot_, the node automatically: - - Stops producing blocks on the old chain - - Transitions to the Mesa network configuration - - Begins producing blocks on the Mesa network once the genesis timestamp is reached -4. No manual intervention is required during the fork. +- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ +- Ensure your node remains running through the State Finalization phase +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) ### Who should use Automode @@ -41,11 +37,15 @@ Automode is **not** available for the following — operators of these node type - **Rosetta API nodes** — upgrade alongside the archive node they depend on - **Standalone SNARK workers** — `mina internal snark-worker` processes/containers run separately from any daemon; they must be stopped and redeployed with the Mesa binary after the fork. (Workers spawned by a coordinator inherit the coordinator's upgrade automatically.) -### Requirements +### How automode works during the fork -- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ -- Ensure your node remains running through the State Finalization phase -- Meet the [hardware requirements](/network-upgrades/mesa/requirements) +1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. +2. Your node participates normally in block production through the State Finalization phase. +3. When the network reaches the _stop-network-slot_, the node automatically: + - Stops producing blocks on the old chain + - Transitions to the Mesa network configuration + - Begins producing blocks on the Mesa network once the genesis timestamp is reached +4. No manual intervention is required during the fork. :::info Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). @@ -78,9 +78,23 @@ The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/loca ## Manual Mode -Manual mode gives operators full control over each step of the upgrade process. +Manual mode gives operators full control over each step of the upgrade process. **Archive node operators and Rosetta API operators must use manual mode** — automode is not available for those node types. + +### Requirements + +- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ +- Be prepared to act promptly when the Mesa release is published to minimize downtime +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) + +### Who should use Manual mode + +- Operators who need full control over the upgrade process +- Operators with custom deployment pipelines that require explicit upgrade steps +- Operators who want to validate the Mesa build before restarting +- **Archive node operators** (automode is not available — schema upgrade is a separate manual step) +- **Rosetta API operators** (Rosetta upgrades alongside the archive node it depends on) -### How it works +### How manual mode works during the fork 1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. 2. Your node participates normally through the State Finalization phase. @@ -91,18 +105,6 @@ Manual mode gives operators full control over each step of the upgrade process. - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) 4. Your node begins participating in the Mesa network once the genesis timestamp is reached. -### Who should use Manual mode - -- Operators who need full control over the upgrade process -- Operators with custom deployment pipelines that require explicit upgrade steps -- Operators who want to validate the Mesa build before restarting - -### Requirements - -- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ -- Be prepared to act promptly when the Mesa release is published to minimize downtime -- Meet the [hardware requirements](/network-upgrades/mesa/requirements) - ## Comparison | Aspect | Automode | Manual | diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx index c121b49f6..ff1ff6837 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -18,6 +18,8 @@ import TabItem from '@theme/TabItem'; During the Pre-Upgrade phase, node operators prepare their infrastructure for the Mesa hard fork. Select your role below and work through each item on the checklist. +Hardware specifications (RAM, CPU, storage) for every role live on the [Requirements](/network-upgrades/mesa/requirements) page — the checklist below links to it rather than repeating concrete numbers, so the requirements stay in one place. + ## Readiness Checklist @@ -29,7 +31,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th
      • Server meets hardware requirements
      • Port 8302 (or custom --external-port) is open and reachable from the internet
      • If behind NAT/firewall, --external-ip is set to your public IP
      • -
      • Node is configured for auto-restart (systemd or equivalent)
      • +
      • Node is configured for auto-restart (systemd or equivalent)
      #### Keys and Credentials @@ -62,9 +64,9 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th #### Infrastructure #### Keys @@ -98,7 +100,7 @@ There are two SNARK worker deployment patterns and they prepare differently for **1. Worker spawned by a coordinator** (`--run-snark-worker` set on the coordinator)
        -
      • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
      • +
      • Server meets hardware requirements (per-worker specs apply for each SNARK worker)
      • No independent upgrade action needed — the spawned worker inherits the coordinator's binary
      • Ensure the coordinator is on the stop-slot release before the fork
      @@ -106,7 +108,7 @@ There are two SNARK worker deployment patterns and they prepare differently for **2. Standalone worker** (`mina internal snark-worker …` run as a separate process or container)
        -
      • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
      • +
      • Server meets hardware requirements (per-worker specs apply for each SNARK worker)
      • Install the stop-slot release on the worker host as well — the worker must speak the same protocol as the coordinator
      • Plan a post-fork redeployment: the worker must be stopped and restarted with the Mesa binary after the coordinator transitions, otherwise it cannot submit work to the upgraded coordinator
      @@ -121,9 +123,9 @@ The "no independent upgrade" advice only applies to workers the coordinator spaw #### Infrastructure #### Database Upgrade @@ -177,8 +179,8 @@ The "no independent upgrade" advice only applies to workers the coordinator spaw #### Infrastructure #### Integration Testing diff --git a/sidebars.js b/sidebars.js index 97adf31a9..e886b7c80 100644 --- a/sidebars.js +++ b/sidebars.js @@ -56,7 +56,6 @@ module.exports = { items: [ 'network-upgrades/mesa/requirements', 'network-upgrades/mesa/upgrade-modes', - 'network-upgrades/mesa/docker-compose-quickstart', { type: 'category', label: 'Upgrade Steps', @@ -82,6 +81,7 @@ module.exports = { items: [ 'network-upgrades/mesa/appendix', 'network-upgrades/mesa/upgrade-modes-details', + 'network-upgrades/mesa/docker-compose-quickstart', ], }, 'network-upgrades/mesa/glossary', diff --git a/static/llms-full.txt b/static/llms-full.txt index 2da3be4dd..1b82d4e5f 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -6429,6 +6429,10 @@ url: /network-upgrades/mesa/replayer # Archive Replayer +:::info Not Mesa-specific +`mina-replayer` is a general-purpose archive verification tool shipped with every release of Mina (Berkeley today, Mesa after the fork). This page lives under the Mesa Upgrade section because the replayer plays a specific role at hard-fork time, but the commands, validation workflow, and troubleshooting on this page apply equally to a non-fork day. A future revision of the docs may relocate the general parts of this page to the Archive Node section. +::: + The `mina-replayer` is a tool that replays all transactions from a Mina archive database, applying them sequentially to reconstruct the ledger state. It is an **ongoing verification tool** — not limited to upgrade time. You can run it at any point to confirm your archive database faithfully represents the canonical chain. During the Mesa hard fork, the replayer serves a critical role: it verifies that the archive database is consistent and produces the ledger checkpoint needed to bootstrap the new chain. After the upgrade, it continues to be useful for detecting data corruption, missing blocks, or schema issues in your archive. @@ -7015,15 +7019,11 @@ The Mesa upgrade supports two modes for daemon node operators: **Automode** and Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. -### How it works +### Requirements -1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. -2. Your node participates normally in block production through the State Finalization phase. -3. When the network reaches the _stop-network-slot_, the node automatically: - - Stops producing blocks on the old chain - - Transitions to the Mesa network configuration - - Begins producing blocks on the Mesa network once the genesis timestamp is reached -4. No manual intervention is required during the fork. +- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ +- Ensure your node remains running through the State Finalization phase +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) ### Who should use Automode @@ -7037,11 +7037,15 @@ Automode is **not** available for the following — operators of these node type - **Rosetta API nodes** — upgrade alongside the archive node they depend on - **Standalone SNARK workers** — `mina internal snark-worker` processes/containers run separately from any daemon; they must be stopped and redeployed with the Mesa binary after the fork. (Workers spawned by a coordinator inherit the coordinator's upgrade automatically.) -### Requirements +### How automode works during the fork -- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ -- Ensure your node remains running through the State Finalization phase -- Meet the [hardware requirements](/network-upgrades/mesa/requirements) +1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. +2. Your node participates normally in block production through the State Finalization phase. +3. When the network reaches the _stop-network-slot_, the node automatically: + - Stops producing blocks on the old chain + - Transitions to the Mesa network configuration + - Begins producing blocks on the Mesa network once the genesis timestamp is reached +4. No manual intervention is required during the fork. :::info Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). @@ -7074,30 +7078,32 @@ The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/loca ## Manual Mode -Manual mode gives operators full control over each step of the upgrade process. +Manual mode gives operators full control over each step of the upgrade process. **Archive node operators and Rosetta API operators must use manual mode** — automode is not available for those node types. -### How it works +### Requirements -1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. -2. Your node participates normally through the State Finalization phase. -3. When the network halts at the _stop-network-slot_, you: - - Stop your node - - Wait for the Mesa release to be published - - Install the Mesa release - - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) -4. Your node begins participating in the Mesa network once the genesis timestamp is reached. +- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ +- Be prepared to act promptly when the Mesa release is published to minimize downtime +- Meet the [hardware requirements](/network-upgrades/mesa/requirements) ### Who should use Manual mode - Operators who need full control over the upgrade process - Operators with custom deployment pipelines that require explicit upgrade steps - Operators who want to validate the Mesa build before restarting +- **Archive node operators** (automode is not available — schema upgrade is a separate manual step) +- **Rosetta API operators** (Rosetta upgrades alongside the archive node it depends on) -### Requirements +### How manual mode works during the fork -- Install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) **before** the _stop-transaction-slot_ -- Be prepared to act promptly when the Mesa release is published to minimize downtime -- Meet the [hardware requirements](/network-upgrades/mesa/requirements) +1. You install the stop-slot release ([3.x.x](https://github.com/MinaProtocol/mina/releases)) during the Pre-Upgrade phase. +2. Your node participates normally through the State Finalization phase. +3. When the network halts at the _stop-network-slot_, you: + - Stop your node + - Wait for the Mesa release to be published + - Install the Mesa release + - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) +4. Your node begins participating in the Mesa network once the genesis timestamp is reached. ## Comparison @@ -7868,6 +7874,8 @@ url: /network-upgrades/mesa/upgrade-steps/pre-upgrade During the Pre-Upgrade phase, node operators prepare their infrastructure for the Mesa hard fork. Select your role below and work through each item on the checklist. +Hardware specifications (RAM, CPU, storage) for every role live on the [Requirements](/network-upgrades/mesa/requirements) page — the checklist below links to it rather than repeating concrete numbers, so the requirements stay in one place. + ## Readiness Checklist @@ -7879,7 +7887,7 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th
    • Server meets hardware requirements
    • Port 8302 (or custom --external-port) is open and reachable from the internet
    • If behind NAT/firewall, --external-ip is set to your public IP
    • -
    • Node is configured for auto-restart (systemd or equivalent)
    • +
    • Node is configured for auto-restart (systemd or equivalent)
    #### Keys and Credentials @@ -7912,9 +7920,9 @@ During the Pre-Upgrade phase, node operators prepare their infrastructure for th #### Infrastructure #### Keys @@ -7948,7 +7956,7 @@ There are two SNARK worker deployment patterns and they prepare differently for **1. Worker spawned by a coordinator** (`--run-snark-worker` set on the coordinator)
      -
    • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
    • +
    • Server meets hardware requirements (per-worker specs apply for each SNARK worker)
    • No independent upgrade action needed — the spawned worker inherits the coordinator's binary
    • Ensure the coordinator is on the stop-slot release before the fork
    @@ -7956,7 +7964,7 @@ There are two SNARK worker deployment patterns and they prepare differently for **2. Standalone worker** (`mina internal snark-worker …` run as a separate process or container)
      -
    • Server meets hardware requirements — 8 GB RAM and 1 GB storage per worker, 6 core/12 threads, AVX + BMI2
    • +
    • Server meets hardware requirements (per-worker specs apply for each SNARK worker)
    • Install the stop-slot release on the worker host as well — the worker must speak the same protocol as the coordinator
    • Plan a post-fork redeployment: the worker must be stopped and restarted with the Mesa binary after the coordinator transitions, otherwise it cannot submit work to the upgraded coordinator
    @@ -7971,9 +7979,9 @@ The "no independent upgrade" advice only applies to workers the coordinator spaw #### Infrastructure #### Database Upgrade @@ -8027,8 +8035,8 @@ The "no independent upgrade" advice only applies to workers the coordinator spaw #### Infrastructure #### Integration Testing From 2aba2d930fe5740d5f7c8c0a9e9a38caa2ed1a5d Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 15:06:50 +0200 Subject: [PATCH 35/45] Clear out the remaining doable PR #1133 review items mesa/index.mdx (glyh #3198928535): - Remove the "Timeline by Role" section. The four `
    ` blocks were short per-role summaries that paraphrased the Phase 1-4 actor tables directly above them and duplicated the per-role narratives on the new examples.mdx page (4a). Replace with a one-line pointer to Upgrade Steps + Examples. mesa/upgrade-steps/pre-upgrade.mdx (yamimaio #3230172497): - Convert the "Detailed Steps" section from a flat `### Block Producers / ### Archive / ### Exchanges` layout into a `` block using the same `operator-type` group as the Readiness Checklist above. Readers stay on their role tab across both sections. - Split the old "Block Producers and SNARK Workers" heading into three separate tabs (Block Producer, SNARK Coordinator, SNARK Worker) so the standalone-worker post-fork redeployment note (cjjdespres #3235086255) is visible in the SNARK Worker tab here as well, not just on the Readiness checklist above. mesa/requirements.mdx (glyh #3198948996): - Replace the duplicated IP/Port/Auto-restart prose (copy-paste from Validator Node requirements) with a short "See also" pointer at the canonical Validator Node sections. The Mesa-specific hardware table at the top of the page stays. mesa/upgrade-steps/post-upgrade.mdx: - Add a Exchange/Rosetta distinction preamble (glyh #3199039711): explain that Rosetta = integration layer, Exchange = end-platform, and that most exchanges go through both tabs but the split matters for the handful running without Rosetta. - Expand the "What changed in Mesa" flags `:::info:::` callout (glyh #3199042988 "What do you mean?"): - `--hardfork-handling`: explain what it did on Berkeley and why Mesa doesn't accept it. Note that the daemon will exit with an unknown-argument error if you leave it set. - `--genesis-ledger-dir` / `-config-file`: give concrete Mesa paths instead of the vague "Mesa versions (included in the package)". Note that automode rewrites these automatically. - Add a third bullet making it explicit which flags carry over unchanged (block-producer-key, libp2p-keypair, peer-list-url, etc.). Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 40 +------ docs/network-upgrades/mesa/requirements.mdx | 18 +-- .../mesa/upgrade-steps/post-upgrade.mdx | 8 +- .../mesa/upgrade-steps/pre-upgrade.mdx | 38 +++++-- static/llms-full.txt | 104 +++++++----------- 5 files changed, 82 insertions(+), 126 deletions(-) diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index f462321c8..f667c5c1f 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -138,45 +138,7 @@ Exactly **3 hours** after the Mesa release is published, at the predefined Mesa --- -### Timeline by Role - -Select your role to see a simplified view of what you need to do and when. - -{/* TODO(PR #1133): The per-role timeline diagrams below (`simplified-schedule*.png`) were AI-generated and have been removed. Replace with updated diagrams from design (Rebecca) once available — see Berkeley upgrade-steps page and the Mesa upgrade slide deck for the new visual style. */} - -
    -Block Producers & SNARK Workers (automode) - -**Your upgrade is hands-free.** Install the stop-slot release weeks before the fork, keep your node running through state finalization, and the automode dispatcher handles the transition automatically. After the fork, verify your node is on the Mesa chain. - -
    - -
    -Block Producers & SNARK Workers (manual mode) - -You must take action on fork day: stop your node after the network halts, install the Mesa release when published, and restart. You have until 290 blocks into the Mesa chain to complete the upgrade without missing your slots. - -
    - -
    -Archive Node Operators - -Choose your upgrade method early: -- **Trustless:** Run the archive upgrade script before the fork (it's backward-compatible). After the fork, point the Mesa archive node at your upgraded DB. -- **Trustful:** Wait for the o1Labs SQL dump after the fork and import it into a fresh database. - -After the fork, verify data integrity and monitor the archive daemon. - -
    - -
    -Exchanges & Service Providers - -The critical action is timing your **deposit/withdrawal freeze**. Disable MINA activity before the stop-transaction-slot. Install the Mesa release on fork day. Re-enable deposits and withdrawals only after block production is confirmed and your integration is verified. - -
    - -For step-by-step instructions, see [Upgrade Steps](/network-upgrades/mesa/upgrade-steps). +For step-by-step instructions per phase, see [Upgrade Steps](/network-upgrades/mesa/upgrade-steps). For end-to-end walkthroughs by role (block producer, archive node, zkApp developer, exchange), see [Examples](/network-upgrades/mesa/upgrade-steps/examples). ## Upgrade Modes diff --git a/docs/network-upgrades/mesa/requirements.mdx b/docs/network-upgrades/mesa/requirements.mdx index ecb698926..5b419e038 100644 --- a/docs/network-upgrades/mesa/requirements.mdx +++ b/docs/network-upgrades/mesa/requirements.mdx @@ -27,22 +27,12 @@ Please note the following are the hardware requirements for each node type after ## Mina Daemon Requirements -### IP and Port configuration +The Mesa daemon inherits the same networking and process-management requirements as the Berkeley daemon. Rather than restate them here, refer to the canonical sections in the Validator Node docs: -**IP:** +- **IP and port configuration** — `--external-ip`, `--external-port`, default port `8302` (libp2p). See [Validator Node Requirements](/node-operators/validator-node/requirements). +- **Auto-restart on crash** — systemd `Restart=always`, Docker `--restart=always`. See [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service). -By default, the Mina Daemon will attempt to retrieve its public IP address from the system. If you are running the node behind a NAT or firewall, you can set the `--external-ip` flag to specify the public IP address. - -**Port:** - -Nodes must expose a port publicly to communicate with other peers. -Mina uses by default the port `8302` which is the default libp2p port. - -You can use a different port by setting the `--external-port` flag. - -### Node Auto-restart - -Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service) section, which covers both `systemctl enable` for systemd and `--restart=always` for Docker. +The hardware table above is Mesa-specific; everything else lives once in the Validator Node docs. ## Seed Peer Requirements diff --git a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx index d203f9c97..3190aeb97 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx @@ -21,6 +21,8 @@ Exactly 3 hours after the publishing of the Mesa node release, at the predefined This page helps you **verify your node is healthy** and running on the Mesa chain. +The checks are split into separate tabs for **Rosetta API** and **Exchange** because the two roles overlap but are not the same. _Rosetta API_ here means an operator running the `mina-rosetta` integration layer (typically alongside an archive node). _Exchange_ means an operator running the customer-facing platform that ingests Mina balances and submits payments. Most exchanges use Rosetta, so they will work through both tabs; a handful operate without Rosetta (custom GraphQL integrations) and can skip the Rosetta tab. + ## Verify Your Node @@ -322,9 +324,9 @@ The flags below are **unchanged from Berkeley** — if your node was running cor For full details, see the [Mesa release notes](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa release tag URL once published (e.g. `/releases/tag/4.0.0`). */} :::info What changed in Mesa -- The `--hardfork-handling` flag is **removed** (not supported on the Mesa chain). If you were using it, remove it from your startup configuration. -- If you used manual mode, update `--genesis-ledger-dir` and `-config-file` to point to the Mesa versions (included in the package). -- All other flags remain the same. +- **`--hardfork-handling` is no longer recognized.** This Berkeley-era flag selected how the daemon should behave around fork boundaries; in Mesa, fork handling lives in the automode dispatcher (for automode) or in the operator's explicit stop/install/restart procedure (for manual mode). The Mesa binary does not accept the flag at all — pass it and the daemon will exit with an unknown-argument error. Remove it from your startup config, systemd unit, Docker command, or Helm values before starting Mesa. +- **If you used manual mode, repoint `--genesis-ledger-dir` and `-config-file` at the Mesa-specific files.** Both ship inside the Mesa Debian/Docker package: `--genesis-ledger-dir` should be `/var/lib/coda/mesa` (or the equivalent path your package installed), and `-config-file` should be the Mesa runtime config (typically `/etc/mina/mesa/daemon.json`). Automode users do not need to do this — the dispatcher rewrites both arguments automatically. +- **All other flags carry over unchanged** — `--block-producer-key`, `--libp2p-keypair`, `--peer-list-url`, `--external-ip/port`, log flags, etc. behave the same on Mesa as on Berkeley. :::
    diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx index ff1ff6837..e9144b211 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -215,26 +215,50 @@ Any transactions submitted after the _stop-transaction-slot_ **will not exist on ## Detailed Steps -### Block Producers and SNARK Workers +Pick the same tab as in the Readiness Checklist above to see the narrative steps for your role. -1. Provision servers that meet the minimum [hardware requirements](/network-upgrades/mesa/requirements), including 32 GB RAM and support for _AVX_ and _BMI2_ CPU instructions. -2. Upgrade nodes to the stop-slot release version [3.x.x](https://github.com/MinaProtocol/mina/releases), which has built-in stop slots. + + + +1. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). +2. Upgrade nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases), which has built-in stop slots. If you are using [Automode](/network-upgrades/mesa/upgrade-modes), no further action is needed until the [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) phase — your node will handle the transition automatically. -### Archive Node Operators and Rosetta Operators + + + +1. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). +2. Upgrade the coordinator to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the _stop-transaction-slot_. + +Coordinators cannot use Automode for the SNARK-worker role they spawn — Automode applies to the daemon process the coordinator itself runs. Standalone workers (next tab) need their own upgrade. + + + + +- **Worker spawned by a coordinator**: no independent action — the worker inherits the coordinator's binary. +- **Standalone worker** (`mina internal snark-worker …`): install the stop-slot release on the worker host so the worker speaks the same protocol as the coordinator. After the fork, redeploy the worker with the Mesa binary. + +See the [Requirements](/network-upgrades/mesa/requirements) page for per-worker hardware specs. + + + Two upgrade processes are available: _trustless_ and _trustful_. If you want to perform the _trustless_ upgrade, follow the steps below; otherwise, proceed to the [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade) phase. The _trustful_ approach relies on o1Labs database exports and Docker images and doesn't require any actions at this stage. 1. Trustless upgrade: - Perform the archive node schema upgrade. Since Mainnet is a long-lived network, the upgrade process is a very fast operation and boils down to running the upgrade script against your archive. It should not take more than 1 minute, depending on your server specification and infrastructure. - For more information on the archive node upgrade process, please refer to the [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) section. -2. Provision servers that meet the minimum hardware requirements, primarily 32 GB RAM. +2. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). 3. Upgrade all nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the pre-defined _stop-transaction-slot_. -### Exchanges + + 1. Make sure to test your system integration with Mesa's new features. Pay special attention to: - If you rely on the archive node SQL database tables, please review the schema changes in the [Appendix](/network-upgrades/mesa/appendix). -2. Provision servers that meet the minimum hardware requirements, particularly 32 GB RAM. +2. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). 3. Upgrade all nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the pre-defined _stop-transaction-slot_. + + + diff --git a/static/llms-full.txt b/static/llms-full.txt index 1b82d4e5f..1a82a3e73 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -6047,45 +6047,7 @@ Exactly **3 hours** after the Mesa release is published, at the predefined Mesa --- -### Timeline by Role - -Select your role to see a simplified view of what you need to do and when. - -{/* TODO(PR #1133): The per-role timeline diagrams below (`simplified-schedule*.png`) were AI-generated and have been removed. Replace with updated diagrams from design (Rebecca) once available — see Berkeley upgrade-steps page and the Mesa upgrade slide deck for the new visual style. */} - -
    -Block Producers & SNARK Workers (automode) - -**Your upgrade is hands-free.** Install the stop-slot release weeks before the fork, keep your node running through state finalization, and the automode dispatcher handles the transition automatically. After the fork, verify your node is on the Mesa chain. - -
    - -
    -Block Producers & SNARK Workers (manual mode) - -You must take action on fork day: stop your node after the network halts, install the Mesa release when published, and restart. You have until 290 blocks into the Mesa chain to complete the upgrade without missing your slots. - -
    - -
    -Archive Node Operators - -Choose your upgrade method early: -- **Trustless:** Run the archive upgrade script before the fork (it's backward-compatible). After the fork, point the Mesa archive node at your upgraded DB. -- **Trustful:** Wait for the o1Labs SQL dump after the fork and import it into a fresh database. - -After the fork, verify data integrity and monitor the archive daemon. - -
    - -
    -Exchanges & Service Providers - -The critical action is timing your **deposit/withdrawal freeze**. Disable MINA activity before the stop-transaction-slot. Install the Mesa release on fork day. Re-enable deposits and withdrawals only after block production is confirmed and your integration is verified. - -
    - -For step-by-step instructions, see [Upgrade Steps](/network-upgrades/mesa/upgrade-steps). +For step-by-step instructions per phase, see [Upgrade Steps](/network-upgrades/mesa/upgrade-steps). For end-to-end walkthroughs by role (block producer, archive node, zkApp developer, exchange), see [Examples](/network-upgrades/mesa/upgrade-steps/examples). ## Upgrade Modes @@ -6710,22 +6672,12 @@ Please note the following are the hardware requirements for each node type after ## Mina Daemon Requirements -### IP and Port configuration - -**IP:** - -By default, the Mina Daemon will attempt to retrieve its public IP address from the system. If you are running the node behind a NAT or firewall, you can set the `--external-ip` flag to specify the public IP address. - -**Port:** - -Nodes must expose a port publicly to communicate with other peers. -Mina uses by default the port `8302` which is the default libp2p port. +The Mesa daemon inherits the same networking and process-management requirements as the Berkeley daemon. Rather than restate them here, refer to the canonical sections in the Validator Node docs: -You can use a different port by setting the `--external-port` flag. - -### Node Auto-restart +- **IP and port configuration** — `--external-ip`, `--external-port`, default port `8302` (libp2p). See [Validator Node Requirements](/node-operators/validator-node/requirements). +- **Auto-restart on crash** — systemd `Restart=always`, Docker `--restart=always`. See [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service). -Ensure your nodes are set to restart automatically after a crash. For guidance, refer to the [Running mina node as a service](/node-operators/validator-node/connecting-to-the-network#running-mina-node-as-a-service) section, which covers both `systemctl enable` for systemd and `--restart=always` for Docker. +The hardware table above is Mesa-specific; everything else lives once in the Validator Node docs. ## Seed Peer Requirements @@ -7447,6 +7399,8 @@ Exactly 3 hours after the publishing of the Mesa node release, at the predefined This page helps you **verify your node is healthy** and running on the Mesa chain. +The checks are split into separate tabs for **Rosetta API** and **Exchange** because the two roles overlap but are not the same. _Rosetta API_ here means an operator running the `mina-rosetta` integration layer (typically alongside an archive node). _Exchange_ means an operator running the customer-facing platform that ingests Mina balances and submits payments. Most exchanges use Rosetta, so they will work through both tabs; a handful operate without Rosetta (custom GraphQL integrations) and can skip the Rosetta tab. + ## Verify Your Node @@ -7748,9 +7702,9 @@ The flags below are **unchanged from Berkeley** — if your node was running cor For full details, see the [Mesa release notes](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa release tag URL once published (e.g. `/releases/tag/4.0.0`). */} :::info What changed in Mesa -- The `--hardfork-handling` flag is **removed** (not supported on the Mesa chain). If you were using it, remove it from your startup configuration. -- If you used manual mode, update `--genesis-ledger-dir` and `-config-file` to point to the Mesa versions (included in the package). -- All other flags remain the same. +- **`--hardfork-handling` is no longer recognized.** This Berkeley-era flag selected how the daemon should behave around fork boundaries; in Mesa, fork handling lives in the automode dispatcher (for automode) or in the operator's explicit stop/install/restart procedure (for manual mode). The Mesa binary does not accept the flag at all — pass it and the daemon will exit with an unknown-argument error. Remove it from your startup config, systemd unit, Docker command, or Helm values before starting Mesa. +- **If you used manual mode, repoint `--genesis-ledger-dir` and `-config-file` at the Mesa-specific files.** Both ship inside the Mesa Debian/Docker package: `--genesis-ledger-dir` should be `/var/lib/coda/mesa` (or the equivalent path your package installed), and `-config-file` should be the Mesa runtime config (typically `/etc/mina/mesa/daemon.json`). Automode users do not need to do this — the dispatcher rewrites both arguments automatically. +- **All other flags carry over unchanged** — `--block-producer-key`, `--libp2p-keypair`, `--peer-list-url`, `--external-ip/port`, log flags, etc. behave the same on Mesa as on Berkeley. :::
    @@ -8071,30 +8025,54 @@ Any transactions submitted after the _stop-transaction-slot_ **will not exist on ## Detailed Steps -### Block Producers and SNARK Workers +Pick the same tab as in the Readiness Checklist above to see the narrative steps for your role. + + + -1. Provision servers that meet the minimum [hardware requirements](/network-upgrades/mesa/requirements), including 32 GB RAM and support for _AVX_ and _BMI2_ CPU instructions. -2. Upgrade nodes to the stop-slot release version [3.x.x](https://github.com/MinaProtocol/mina/releases), which has built-in stop slots. +1. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). +2. Upgrade nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases), which has built-in stop slots. If you are using [Automode](/network-upgrades/mesa/upgrade-modes), no further action is needed until the [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) phase — your node will handle the transition automatically. -### Archive Node Operators and Rosetta Operators + + + +1. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). +2. Upgrade the coordinator to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the _stop-transaction-slot_. + +Coordinators cannot use Automode for the SNARK-worker role they spawn — Automode applies to the daemon process the coordinator itself runs. Standalone workers (next tab) need their own upgrade. + + + + +- **Worker spawned by a coordinator**: no independent action — the worker inherits the coordinator's binary. +- **Standalone worker** (`mina internal snark-worker …`): install the stop-slot release on the worker host so the worker speaks the same protocol as the coordinator. After the fork, redeploy the worker with the Mesa binary. + +See the [Requirements](/network-upgrades/mesa/requirements) page for per-worker hardware specs. + + + Two upgrade processes are available: _trustless_ and _trustful_. If you want to perform the _trustless_ upgrade, follow the steps below; otherwise, proceed to the [Upgrade](/network-upgrades/mesa/upgrade-steps/upgrade) phase. The _trustful_ approach relies on o1Labs database exports and Docker images and doesn't require any actions at this stage. 1. Trustless upgrade: - Perform the archive node schema upgrade. Since Mainnet is a long-lived network, the upgrade process is a very fast operation and boils down to running the upgrade script against your archive. It should not take more than 1 minute, depending on your server specification and infrastructure. - For more information on the archive node upgrade process, please refer to the [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) section. -2. Provision servers that meet the minimum hardware requirements, primarily 32 GB RAM. +2. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). 3. Upgrade all nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the pre-defined _stop-transaction-slot_. -### Exchanges + + 1. Make sure to test your system integration with Mesa's new features. Pay special attention to: - If you rely on the archive node SQL database tables, please review the schema changes in the [Appendix](/network-upgrades/mesa/appendix). -2. Provision servers that meet the minimum hardware requirements, particularly 32 GB RAM. +2. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). 3. Upgrade all nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the pre-defined _stop-transaction-slot_. + + + --- url: /network-upgrades/mesa/upgrade-steps/state-finalization --- From 7b75f1aae85b5d1c60ea2ffa0b2f208b369085a9 Mon Sep 17 00:00:00 2001 From: dkijania Date: Thu, 14 May 2026 15:57:51 +0200 Subject: [PATCH 36/45] upgrade-modes.mdx: top-level Tabs for Auto/Manual, nested install Tabs Address the remaining UX-call review items on upgrade-modes.mdx: - Collapse "Automode" and "Manual Mode" into top-level `` (glyh #3198978812). Readers pick their mode once and see only the relevant content. The comparison table moves to the top so an undecided reader can choose before opening a tab. Tabs use `groupId="upgrade-mode"` so the choice persists if the reader navigates to other pages with the same group. - Make the install-instructions section a nested `` block between Debian and Docker (glyh #3198971226). Each install tab contains exactly the apt / docker commands for that platform, and the Docker tab points docker-compose users at the `docker-compose-quickstart` page now living under Appendix. `groupId="install-method"` matches the same group used in connecting-to-the-network.mdx so the choice persists across the site. Applies to both Automode and Manual outer tabs (manual mode also gained a brief install section for parity). The page intentionally surfaces the "Archive / Rosetta / standalone SNARK workers must use Manual mode" constraint at the top, above the tabs, so an operator in that bucket sees it before they pick a tab. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/upgrade-modes.mdx | 119 +++++++++++++++---- static/llms-full.txt | 116 ++++++++++++++---- 2 files changed, 193 insertions(+), 42 deletions(-) diff --git a/docs/network-upgrades/mesa/upgrade-modes.mdx b/docs/network-upgrades/mesa/upgrade-modes.mdx index 8b8195a0c..e5f4fdb57 100644 --- a/docs/network-upgrades/mesa/upgrade-modes.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes.mdx @@ -11,11 +11,31 @@ keywords: - daemon --- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + # Upgrade Modes -The Mesa upgrade supports two modes for daemon node operators: **Automode** and **Manual**. Both modes run in parallel during the upgrade process and reach the same end state — a node running on the Mesa network. +The Mesa upgrade supports two modes for daemon node operators: **Automode** (recommended — the daemon handles the fork transition automatically) and **Manual Mode** (the operator stops, installs the Mesa release, and restarts). Both modes reach the same end state — a node running on the Mesa network. + +**Archive node operators, Rosetta API operators, and standalone SNARK workers must use Manual mode** — Automode is not available for those node types. + +## Comparison + +| Aspect | Automode | Manual | +|---|---|---| +| Operator intervention during fork | None | Stop, install, restart | +| Downtime | Minimal (automatic transition) | Depends on operator response time | +| Applies to | Daemon nodes only (block producers, SNARK coordinators) | All node types (incl. archive, Rosetta, standalone SNARK workers) | +| Control | Automated | Full manual control | +| Risk | Lower (fewer manual steps) | Higher (depends on operator timing) | + +## Choose your upgrade mode + +Pick the tab that matches the mode you intend to run. If you are unsure, start with the Automode tab — it is the recommended path for daemon nodes. -## Automode (Recommended) + + Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. @@ -31,7 +51,7 @@ Automode is the recommended upgrade path for the Mina daemon — the process tha - SNARK coordinators (run as a Mina daemon) - Operators who want to minimize downtime and operational risk -Automode is **not** available for the following — operators of these node types must use Manual mode: +Automode is **not** available for the following — operators of these node types must switch to the Manual Mode tab: - **Archive nodes** — schema upgrade is a separate manual step (see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade)) - **Rosetta API nodes** — upgrade alongside the archive node they depend on @@ -47,10 +67,6 @@ Automode is **not** available for the following — operators of these node type - Begins producing blocks on the Mesa network once the genesis timestamp is reached 4. No manual intervention is required during the fork. -:::info -Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). -::: - :::danger Automode requires a persistent config directory and an automatic restart policy At the fork, the daemon **exits cleanly** (exit code 0) after writing the Mesa configuration and an `activated` marker to the config directory. It does **not** restart itself. Your process manager must restart it, and the config directory must survive that restart for the dispatcher to find the `activated` marker. @@ -62,23 +78,42 @@ Failing to meet either requirement means your node will not join the Mesa networ ### Installing automode -On Debian, install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: +Pick the install method that matches how you run your daemon today. + + + + +Install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: ```bash +sudo apt-get update sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa ``` -On Docker, use the `mina-daemon-auto-hardfork` image (the regular `mina-daemon` image is manual-mode only): +Both packages are required for automode to work. The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the configuration in `/etc/default/mina-dispatch`. + +Start your node as usual — the dispatcher routes to the correct binary based on fork state. See the Debian automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + + + + +Use the `mina-daemon-auto-hardfork` image (the regular `mina-daemon` image is manual-mode only): ``` minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} ``` -The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher automatically. Start it with your normal flags — see the Docker automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. +The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher automatically. Start it with your normal flags **plus** `--restart=always` and a named volume mounted at `/root/.mina-config` — see the Docker automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. -## Manual Mode +For docker-compose users, see the [docker-compose quickstart](/network-upgrades/mesa/docker-compose-quickstart) (under Appendix) for a ready-to-edit compose file. -Manual mode gives operators full control over each step of the upgrade process. **Archive node operators and Rosetta API operators must use manual mode** — automode is not available for those node types. + + + + + + +Manual mode gives operators full control over each step of the upgrade process. **Archive node operators and Rosetta API operators must use manual mode** — Automode is not available for those node types. ### Requirements @@ -105,14 +140,56 @@ Manual mode gives operators full control over each step of the upgrade process. - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) 4. Your node begins participating in the Mesa network once the genesis timestamp is reached. -## Comparison +### Installing manual mode -| Aspect | Automode | Manual | -|---|---|---| -| Operator intervention during fork | None | Stop, install, restart | -| Downtime | Minimal (automatic transition) | Depends on operator response time | -| Applies to | Daemon nodes only | All node types | -| Control | Automated | Full manual control | -| Risk | Lower (fewer manual steps) | Higher (depends on operator timing) | + + + +Install only the stop-slot release before the fork: + +```bash +sudo apt-get update +sudo apt-get install mina-mainnet=3.x.x +``` + +After the fork, when the Mesa release is published, stop your node and install the Mesa package: + +```bash +sudo systemctl stop mina +sudo apt-get install mina-mainnet=4.x.x +sudo systemctl start mina +``` + +See the Debian manual example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + + + + +Use the regular `mina-daemon` image (not `mina-daemon-auto-hardfork`): + +``` +minaprotocol/mina-daemon:-bullseye-mainnet +``` + +After the fork, stop the container and start a new one with the Mesa image: + +```bash +docker stop mina && docker rm mina +docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:-bullseye-mainnet \ + daemon ... +``` + +See the Docker manual example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + +For docker-compose users, see the [docker-compose quickstart](/network-upgrades/mesa/docker-compose-quickstart) (under Appendix). + + + + + + -For in-depth technical details on how the upgrade mechanism works internally, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). +For in-depth technical details on how the upgrade mechanism works internally — dispatcher routing, dual-binary architecture, fork-state file — see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). diff --git a/static/llms-full.txt b/static/llms-full.txt index 1a82a3e73..d95715820 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -6965,9 +6965,26 @@ url: /network-upgrades/mesa/upgrade-modes # Upgrade Modes -The Mesa upgrade supports two modes for daemon node operators: **Automode** and **Manual**. Both modes run in parallel during the upgrade process and reach the same end state — a node running on the Mesa network. +The Mesa upgrade supports two modes for daemon node operators: **Automode** (recommended — the daemon handles the fork transition automatically) and **Manual Mode** (the operator stops, installs the Mesa release, and restarts). Both modes reach the same end state — a node running on the Mesa network. -## Automode (Recommended) +**Archive node operators, Rosetta API operators, and standalone SNARK workers must use Manual mode** — Automode is not available for those node types. + +## Comparison + +| Aspect | Automode | Manual | +|---|---|---| +| Operator intervention during fork | None | Stop, install, restart | +| Downtime | Minimal (automatic transition) | Depends on operator response time | +| Applies to | Daemon nodes only (block producers, SNARK coordinators) | All node types (incl. archive, Rosetta, standalone SNARK workers) | +| Control | Automated | Full manual control | +| Risk | Lower (fewer manual steps) | Higher (depends on operator timing) | + +## Choose your upgrade mode + +Pick the tab that matches the mode you intend to run. If you are unsure, start with the Automode tab — it is the recommended path for daemon nodes. + + + Automode is the recommended upgrade path for the Mina daemon — the process that participates in consensus. This includes block producers and SNARK coordinators (a SNARK coordinator runs as a daemon). In automode, the node handles the entire fork transition automatically. @@ -6983,7 +7000,7 @@ Automode is the recommended upgrade path for the Mina daemon — the process tha - SNARK coordinators (run as a Mina daemon) - Operators who want to minimize downtime and operational risk -Automode is **not** available for the following — operators of these node types must use Manual mode: +Automode is **not** available for the following — operators of these node types must switch to the Manual Mode tab: - **Archive nodes** — schema upgrade is a separate manual step (see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade)) - **Rosetta API nodes** — upgrade alongside the archive node they depend on @@ -6999,10 +7016,6 @@ Automode is **not** available for the following — operators of these node type - Begins producing blocks on the Mesa network once the genesis timestamp is reached 4. No manual intervention is required during the fork. -:::info -Automode applies only to the consensus-participating Mina daemon. Archive nodes, Rosetta API instances, and standalone SNARK workers all require separate manual upgrade steps — see [Archive Upgrade](/network-upgrades/mesa/archive-upgrade) and [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade). -::: - :::danger Automode requires a persistent config directory and an automatic restart policy At the fork, the daemon **exits cleanly** (exit code 0) after writing the Mesa configuration and an `activated` marker to the config directory. It does **not** restart itself. Your process manager must restart it, and the config directory must survive that restart for the dispatcher to find the `activated` marker. @@ -7014,23 +7027,42 @@ Failing to meet either requirement means your node will not join the Mesa networ ### Installing automode -On Debian, install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: +Pick the install method that matches how you run your daemon today. + + + + +Install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: ```bash +sudo apt-get update sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa ``` -On Docker, use the `mina-daemon-auto-hardfork` image (the regular `mina-daemon` image is manual-mode only): +Both packages are required for automode to work. The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the configuration in `/etc/default/mina-dispatch`. + +Start your node as usual — the dispatcher routes to the correct binary based on fork state. See the Debian automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + + + + +Use the `mina-daemon-auto-hardfork` image (the regular `mina-daemon` image is manual-mode only): ``` minaprotocol/mina-daemon-auto-hardfork:{version}-{codename}-{network} ``` -The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher automatically. Start it with your normal flags — see the Docker automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. +The image bundles both binaries and the dispatcher, and sets `MINA_APP=/usr/local/bin/mina-dispatch` so the entrypoint uses the dispatcher automatically. Start it with your normal flags **plus** `--restart=always` and a named volume mounted at `/root/.mina-config` — see the Docker automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. -## Manual Mode +For docker-compose users, see the [docker-compose quickstart](/network-upgrades/mesa/docker-compose-quickstart) (under Appendix) for a ready-to-edit compose file. + + + + + + -Manual mode gives operators full control over each step of the upgrade process. **Archive node operators and Rosetta API operators must use manual mode** — automode is not available for those node types. +Manual mode gives operators full control over each step of the upgrade process. **Archive node operators and Rosetta API operators must use manual mode** — Automode is not available for those node types. ### Requirements @@ -7057,17 +7089,59 @@ Manual mode gives operators full control over each step of the upgrade process. - Restart your node with the [updated flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) 4. Your node begins participating in the Mesa network once the genesis timestamp is reached. -## Comparison +### Installing manual mode -| Aspect | Automode | Manual | -|---|---|---| -| Operator intervention during fork | None | Stop, install, restart | -| Downtime | Minimal (automatic transition) | Depends on operator response time | -| Applies to | Daemon nodes only | All node types | -| Control | Automated | Full manual control | -| Risk | Lower (fewer manual steps) | Higher (depends on operator timing) | + + + +Install only the stop-slot release before the fork: + +```bash +sudo apt-get update +sudo apt-get install mina-mainnet=3.x.x +``` + +After the fork, when the Mesa release is published, stop your node and install the Mesa package: + +```bash +sudo systemctl stop mina +sudo apt-get install mina-mainnet=4.x.x +sudo systemctl start mina +``` + +See the Debian manual example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + + + + +Use the regular `mina-daemon` image (not `mina-daemon-auto-hardfork`): + +``` +minaprotocol/mina-daemon:-bullseye-mainnet +``` + +After the fork, stop the container and start a new one with the Mesa image: + +```bash +docker stop mina && docker rm mina +docker run --name mina -d \ + --restart=always \ + -v mina-config:/root/.mina-config \ + minaprotocol/mina-daemon:-bullseye-mainnet \ + daemon ... +``` + +See the Docker manual example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. + +For docker-compose users, see the [docker-compose quickstart](/network-upgrades/mesa/docker-compose-quickstart) (under Appendix). + + + + + + -For in-depth technical details on how the upgrade mechanism works internally, see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). +For in-depth technical details on how the upgrade mechanism works internally — dispatcher routing, dual-binary architecture, fork-state file — see [Upgrade Modes - Details](/network-upgrades/mesa/upgrade-modes-details). --- url: /network-upgrades/mesa/upgrade-steps/examples From 83038a4969362e970461d4f4919cb6f4ee142918 Mon Sep 17 00:00:00 2001 From: dkijania Date: Sun, 17 May 2026 14:59:51 +0200 Subject: [PATCH 37/45] Fix PR #1133 review items that were addressed weakly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A re-audit found two fixes from earlier review-resolution commits that did not actually land what reviewers asked for. Correct them properly: MIPs (glyh #3198894474, yamimaio #3228391904) — commit a0393a32 added only one MIP ("account-update limit") and linked the o1Labs blog post as the canonical reference. The actual canonical source is the MinaProtocol/MIPs repo, and the Mesa hard fork bundles four MIPs that were not previously documented: - MIP6 — Reduce slot time to 90s - MIP7 — Increase On-Chain State Size Limit (the existing "Expanded zkApp State" change) - MIP8 — Increase Events & Actions Limit - MIP9 — Increase zkApp Account-Update Limit Replace the "Additional Protocol Improvements" subsection with bullets that name each MIP, link to its canonical spec in MinaProtocol/MIPs, and summarize the operator-facing effect. The blog post is kept as a secondary, narrative reference. Node Status flags (related to cjjdespres #3220629641) — commit b85eb94e removed the bogus `--node-stats-type none` opt-out from upgrade-steps/index.mdx, but the same non-existent flag survived in: - post-upgrade.mdx#help-monitor-the-network: recommended `--node-stats-type full` (does not exist) and `--node-stats-type none` for opt-out. - glossary.mdx Node Status Service entry: said "Can be disabled with `--node-stats-type none`". Both rewritten against the actual Mesa flags as defined in the mina source on origin/mesa_preflight_prefork and origin/georgeee/mesa: - `--simplified-node-stats` (no-arg) — keep the report minimal - `--disable-node-status` (no-arg) — opt out entirely - `--node-status-url ` and `--node-error-url ` — endpoints The post-upgrade page also notes inline that `--node-stats-type` was never accepted by the daemon, so the previous docs were misleading. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/glossary.mdx | 2 +- docs/network-upgrades/mesa/index.mdx | 9 +++++--- .../mesa/upgrade-steps/post-upgrade.mdx | 10 ++++++--- static/llms-full.txt | 21 ++++++++++++------- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/docs/network-upgrades/mesa/glossary.mdx b/docs/network-upgrades/mesa/glossary.mdx index 9a4b6b161..6064c5ac4 100644 --- a/docs/network-upgrades/mesa/glossary.mdx +++ b/docs/network-upgrades/mesa/glossary.mdx @@ -130,4 +130,4 @@ The [automode](#automode) Debian packages are published with a `-mesa` suffix (` ### Node Status Service -An opt-in telemetry feature that reports non-sensitive node data (e.g., version, sync status) to help monitor the amount of upgraded active stake during the upgrade. Can be disabled with `--node-stats-type none`. +A telemetry feature that reports non-sensitive node data (e.g., version, sync status) to help monitor the amount of upgraded active stake during the upgrade. Enabled by default on the Mesa daemon; pass `--simplified-node-stats` to keep the report minimal, or `--disable-node-status` to opt out entirely. See [Help Monitor the Network](/network-upgrades/mesa/upgrade-steps/post-upgrade#help-monitor-the-network) for the full flag set. diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index f667c5c1f..4d95ceab0 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -37,11 +37,14 @@ Unlike the Berkeley upgrade (which required up to 48 hours for archive database ### Additional Protocol Improvements -Mesa also ships a number of smaller MIPs (Mina Improvement Proposals) that affect protocol behavior, including: +Beyond expanded zkApp state, Mesa ships several Mina Improvement Proposals (MIPs) that change protocol behavior. The canonical specs live in the [MinaProtocol/MIPs](https://github.com/MinaProtocol/MIPs/tree/main/MIPS) repository; the Mesa hard fork bundles: -- **Account-update limit increase** — the maximum number of account updates a single zkApp transaction can include is raised, allowing more complex composed transactions in a single proof. +- **[MIP6 — Reduce slot time to 90s](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md)** — halves the slot duration from 180s to 90s, doubling network throughput. +- **[MIP7 — Increase On-Chain State Size Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0007-increase-state-size-limit.md)** — raises per-account on-chain state from 8 to 32 field elements (the "Expanded zkApp State" change documented above). +- **[MIP8 — Increase Events & Actions Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0008-increase-events-actions-limit.md)** — raises the per-transaction event and action limit to 1024 field elements. +- **[MIP9 — Increase zkApp Account-Update Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0009-increase-zkapp-account-update-limit.md)** — triples the maximum number of account updates a single zkApp transaction can include (new rule: np + n2 + n1 ≤ 16). -For the complete list of MIPs landing in Mesa, see the [Mesa upgrade overview on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). {/* TODO(PR #1133): Inline the canonical MIP list here once it is published in the Mesa release notes / mina-improvements repo, instead of relying on the blog post. */} +For a narrative overview that summarizes each change in plain language, see the [Mesa upgrade post on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). ## Upgrade Flow — End-to-End Timeline diff --git a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx index 3190aeb97..db4604e49 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/post-upgrade.mdx @@ -298,15 +298,19 @@ rosetta-cli check:construction --configuration-file config.json --start-block 2 ## Help Monitor the Network -The Node Status service is **not enabled by default** in the Mesa release. If you wish to help o1Labs monitor network health in the initial phase, add these flags to your node: +The Node Status reporting service is **enabled by default** on the Mesa daemon. If you want to keep it on and point it at the o1Labs collection endpoints, pass: ```bash ---node-stats-type full +--simplified-node-stats --node-status-url https://nodestats.minaprotocol.com/submit/stats --node-error-url https://nodestats.minaprotocol.com/submit/stats ``` -The error collection service reports any node crashes before the process terminates. If you are not comfortable sharing your node version, use `--node-stats-type none` or simply omit these flags. +- `--simplified-node-stats` (no value) makes the reported payload a minimal, non-sensitive subset (version, sync status, peer count). +- `--node-status-url` is the endpoint that receives status reports. +- `--node-error-url` is the endpoint that receives crash reports the daemon emits just before terminating. + +To opt out of the Node Status service entirely, pass `--disable-node-status` (no value). Note: the previously-documented `--node-stats-type full|none` argument was never accepted by the daemon — `--simplified-node-stats` and `--disable-node-status` are the actual flag names in the Mesa release. ## Report Issues diff --git a/static/llms-full.txt b/static/llms-full.txt index d95715820..53478bea3 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5914,7 +5914,7 @@ The [automode](#automode) Debian packages are published with a `-mesa` suffix (` ### Node Status Service -An opt-in telemetry feature that reports non-sensitive node data (e.g., version, sync status) to help monitor the amount of upgraded active stake during the upgrade. Can be disabled with `--node-stats-type none`. +A telemetry feature that reports non-sensitive node data (e.g., version, sync status) to help monitor the amount of upgraded active stake during the upgrade. Enabled by default on the Mesa daemon; pass `--simplified-node-stats` to keep the report minimal, or `--disable-node-status` to opt out entirely. See [Help Monitor the Network](/network-upgrades/mesa/upgrade-steps/post-upgrade#help-monitor-the-network) for the full flag set. --- url: /network-upgrades/mesa @@ -5946,11 +5946,14 @@ Unlike the Berkeley upgrade (which required up to 48 hours for archive database ### Additional Protocol Improvements -Mesa also ships a number of smaller MIPs (Mina Improvement Proposals) that affect protocol behavior, including: +Beyond expanded zkApp state, Mesa ships several Mina Improvement Proposals (MIPs) that change protocol behavior. The canonical specs live in the [MinaProtocol/MIPs](https://github.com/MinaProtocol/MIPs/tree/main/MIPS) repository; the Mesa hard fork bundles: -- **Account-update limit increase** — the maximum number of account updates a single zkApp transaction can include is raised, allowing more complex composed transactions in a single proof. +- **[MIP6 — Reduce slot time to 90s](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md)** — halves the slot duration from 180s to 90s, doubling network throughput. +- **[MIP7 — Increase On-Chain State Size Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0007-increase-state-size-limit.md)** — raises per-account on-chain state from 8 to 32 field elements (the "Expanded zkApp State" change documented above). +- **[MIP8 — Increase Events & Actions Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0008-increase-events-actions-limit.md)** — raises the per-transaction event and action limit to 1024 field elements. +- **[MIP9 — Increase zkApp Account-Update Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0009-increase-zkapp-account-update-limit.md)** — triples the maximum number of account updates a single zkApp transaction can include (new rule: np + n2 + n1 ≤ 16). -For the complete list of MIPs landing in Mesa, see the [Mesa upgrade overview on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). {/* TODO(PR #1133): Inline the canonical MIP list here once it is published in the Mesa release notes / mina-improvements repo, instead of relying on the blog post. */} +For a narrative overview that summarizes each change in plain language, see the [Mesa upgrade post on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). ## Upgrade Flow — End-to-End Timeline @@ -7750,15 +7753,19 @@ rosetta-cli check:construction --configuration-file config.json --start-block 2 ## Help Monitor the Network -The Node Status service is **not enabled by default** in the Mesa release. If you wish to help o1Labs monitor network health in the initial phase, add these flags to your node: +The Node Status reporting service is **enabled by default** on the Mesa daemon. If you want to keep it on and point it at the o1Labs collection endpoints, pass: ```bash ---node-stats-type full +--simplified-node-stats --node-status-url https://nodestats.minaprotocol.com/submit/stats --node-error-url https://nodestats.minaprotocol.com/submit/stats ``` -The error collection service reports any node crashes before the process terminates. If you are not comfortable sharing your node version, use `--node-stats-type none` or simply omit these flags. +- `--simplified-node-stats` (no value) makes the reported payload a minimal, non-sensitive subset (version, sync status, peer count). +- `--node-status-url` is the endpoint that receives status reports. +- `--node-error-url` is the endpoint that receives crash reports the daemon emits just before terminating. + +To opt out of the Node Status service entirely, pass `--disable-node-status` (no value). Note: the previously-documented `--node-stats-type full|none` argument was never accepted by the daemon — `--simplified-node-stats` and `--disable-node-status` are the actual flag names in the Mesa release. ## Report Issues From c94bcf2c7765009fc4d4349b8eaf5588f7f07699 Mon Sep 17 00:00:00 2001 From: dkijania Date: Sun, 17 May 2026 20:20:31 +0200 Subject: [PATCH 38/45] PR #1133: rewrite MIP descriptions, rename Appendix sidebar entry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-audit of two earlier review resolutions after maintainer feedback that they were technically applied but missed the substance of the ask: 1) MIPs in mesa/index.mdx (glyh #3198894474, yamimaio #3228391904) Earlier passes added a one-line bullet per MIP plus a link to the o1Labs blog. The reviewer's intent — described in their reply — was "describe the MIPs in the docs themselves, using the blog as a source to draw from, not as a destination to link to." Restructure "What Mesa Introduces": - Drop the "Expanded zkApp State" subsection in isolation and the loose "Additional Protocol Improvements" wrapper. Replace with four MIP-themed subsections that match the canonical MIPs and describe the operator-facing changes in real detail: - Faster Blocks (MIP6) — slot time 180s -> 90s, coinbase 720 -> 360 MINA, epoch length halved to ~7.4 days, default zkApp soft limit unset, recommended SNARK coordinator hardware (>= 4 workers). - Expanded zkApp State (MIP7) — 8 -> 32 fields, redeploy requirement for zkApps, archive schema additions, transaction protocol version bump. - Larger Events and Actions (MIP8) — 100 -> 1024 field-element cap per transaction, individual 16-element cap removed. - Larger zkApp Transactions (MIP9) — old weighted-cost formula replaced with `np + n2 + n1 <= 16`, depends on MIP6 SNARK optimization. - Each section heads with a direct link to the canonical spec in MinaProtocol/MIPs. - The blog post link is removed entirely — Mina Protocol docs should not depend on a third-party blog as the citation for protocol changes. - The two operational improvements (Automode Upgrades, Simplified Archive Upgrade) keep their existing subsections. 2) Appendix sidebar entry (yamimaio #3228596882) Earlier commit f492f09b made the Mesa "Appendix" sidebar item into a Category as requested, but the first item inside the category was itself labelled "Appendix" — producing the awkward "Appendix > Appendix" hierarchy. The page in question is in fact a reference for archive-node database schema changes between Berkeley and Mesa, not a generic appendix. - Rename appendix.mdx frontmatter title and sidebar_label to "Archive Node Schema Changes". This also updates the rendered `# Heading` since hide_title=true causes the title field to drive the h1. - Update the page description to match the renamed content. - Update all five inbound `[Appendix](/network-upgrades/mesa/appendix)` link texts across mesa docs (index, archive-upgrade, glossary, pre-upgrade) to "Archive Node Schema Changes". Path of the page itself is unchanged so no inbound URLs break. 3) Known issue not patched in this commit The new MIP6 description states the slot duration becomes 90 seconds, but Phase 2 of mesa/index.mdx and the glossary continue to claim "State Finalization is exactly 5 hours / 100 slots" based on cjjdespres review comment #3220498212. 5 hours only holds under 180-second slots, so MIP6 either changes that figure (to 100 slots × 90s = 2.5h, or to 200 slots × 90s = 5h, depending on whether the slot count is held constant) or cjjdespres was speaking about a schedule that pre-dates MIP6 finalization. Flagging to maintainers in the PR thread instead of silently changing it. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/appendix.mdx | 11 ++-- .../network-upgrades/mesa/archive-upgrade.mdx | 2 +- docs/network-upgrades/mesa/glossary.mdx | 2 +- docs/network-upgrades/mesa/index.mdx | 48 +++++++++++----- .../mesa/upgrade-steps/pre-upgrade.mdx | 2 +- static/llms-full.txt | 56 +++++++++++++------ 6 files changed, 82 insertions(+), 39 deletions(-) diff --git a/docs/network-upgrades/mesa/appendix.mdx b/docs/network-upgrades/mesa/appendix.mdx index 510359627..9db06a69a 100644 --- a/docs/network-upgrades/mesa/appendix.mdx +++ b/docs/network-upgrades/mesa/appendix.mdx @@ -1,15 +1,18 @@ --- -title: Appendix -sidebar_label: Appendix +title: Archive Node Schema Changes +sidebar_label: Archive Node Schema Changes hide_title: true -description: Mesa Upgrade Appendix +description: Reference of database schema changes applied to the Mina archive node during the Mesa hard fork — new columns, modified tables, and the SQL applied by the upgrade script. keywords: - Mesa - upgrade - appendix + - archive + - schema + - database --- -# Appendix +# Archive Node Schema Changes ## Upgrading archive nodes from Berkeley to Mesa diff --git a/docs/network-upgrades/mesa/archive-upgrade.mdx b/docs/network-upgrades/mesa/archive-upgrade.mdx index 36c47f58e..99dc86d32 100644 --- a/docs/network-upgrades/mesa/archive-upgrade.mdx +++ b/docs/network-upgrades/mesa/archive-upgrade.mdx @@ -233,4 +233,4 @@ See [Archive Replayer](/network-upgrades/mesa/replayer) for usage, flags, and ex ## Database Schema Changes -For details on the database schema changes between Berkeley and Mesa, see the [Appendix](/network-upgrades/mesa/appendix). +For the full schema diff (new columns, modified tables, applied SQL), see [Archive Node Schema Changes](/network-upgrades/mesa/appendix). diff --git a/docs/network-upgrades/mesa/glossary.mdx b/docs/network-upgrades/mesa/glossary.mdx index 6064c5ac4..623637caa 100644 --- a/docs/network-upgrades/mesa/glossary.mdx +++ b/docs/network-upgrades/mesa/glossary.mdx @@ -122,7 +122,7 @@ The official ledger checkpoint published with the [Mesa release](#mesa-release). ### Expanded zkApp State -Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See the [Appendix](/network-upgrades/mesa/appendix) for schema details. +Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See [Archive Node Schema Changes](/network-upgrades/mesa/appendix) for the SQL diff. ### Mesa Package Naming Convention diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 4d95ceab0..3099dec8b 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -23,28 +23,48 @@ This documentation uses terms like _automode_, _stop-slot_, _trustless upgrade_, ## What Mesa Introduces -### Expanded zkApp State +Mesa bundles four Mina Improvement Proposals (MIPs) that change protocol behavior, plus two operational improvements to the upgrade flow itself. The canonical MIP specs live in the [MinaProtocol/MIPs](https://github.com/MinaProtocol/MIPs/tree/main/MIPS) repository; each section below links to the spec for the proposal it describes. -Mesa extends the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This significantly increases the data capacity available to smart contracts, enabling more complex application logic without off-chain workarounds. +### Faster Blocks — [MIP6](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md) -### Automode Upgrades +Mesa halves Mina's slot time from **180 seconds to 90 seconds**, doubling block production frequency. To keep the long-term token emission rate flat, the per-block **coinbase reward is also halved** (from 720 MINA to 360 MINA). The total Mina supplied per epoch is unchanged. -For the first time in Mina's history, node operators can upgrade through a hard fork **without manual intervention**. The automode mechanism ships both the pre-fork and post-fork binaries in a single package, with a dispatcher that automatically transitions to the new chain when the fork activates. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for details. +Several second-order consequences flow from the slot-time change: -### Simplified Archive Upgrade +- **Epoch duration halves** from ~14.9 days to ~7.4 days. Scripts and operational procedures tied to epoch boundaries (delegation cooldown, automated payouts, monitoring dashboards) trigger about twice as often. +- **Vesting schedules on active vesting accounts are automatically migrated** during the hard fork so they continue unlocking on the same real-world cadence. No operator action is required. +- **The default zkApp soft limit (24 commands per block) is unset**, allowing blocks to include more zkApp transactions when network demand is high. +- **SNARK coordinators handling maximum-cost zkApp transactions should deploy at least 4 workers** (≈4 CPU cores each) to keep up with the new 90-second slot timing. A prerequisite SNARK-worker parallelization is delivered via soft fork before Mesa. -Unlike the Berkeley upgrade (which required up to 48 hours for archive database conversion), the Mesa archive upgrade is a fast schema upgrade that completes in under a minute. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). +### Expanded zkApp State — [MIP7](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0007-increase-state-size-limit.md) + +Mesa raises the on-chain state available to a zkApp account from **8 field elements (indexes `0–7`) to 32 field elements (indexes `0–31`)**. zkApps can now store roughly four times more data directly on chain without off-chain workarounds. + +Implications: + +- **zkApp developers must redeploy** to take advantage of the new fields; older verification keys will not validate transactions touching indexes `8–31`. +- **Archive databases gain new columns** (`element8` … `element31`) on `zkapp_states` and `zkapp_states_nullable`. The Mesa archive upgrade script handles this automatically — see [Archive Node Schema Changes](/network-upgrades/mesa/appendix) for the full schema diff. +- **Transaction protocol version is bumped** because the on-chain serialization format changes. + +### Larger Events and Actions — [MIP8](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0008-increase-events-actions-limit.md) + +Mesa raises the per-transaction limit on events and actions from **100 field elements to 1024 field elements** for each. The previous cap of 16 field elements per individual event or action is also removed. This makes events and actions a viable channel for richer on-chain signaling and larger off-chain dispatch payloads in a single transaction. -### Additional Protocol Improvements +Mostly relevant to zkApp developers — node operators do not need to act on this change, but block producers will validate against the new limits automatically after the fork. -Beyond expanded zkApp state, Mesa ships several Mina Improvement Proposals (MIPs) that change protocol behavior. The canonical specs live in the [MinaProtocol/MIPs](https://github.com/MinaProtocol/MIPs/tree/main/MIPS) repository; the Mesa hard fork bundles: +### Larger zkApp Transactions — [MIP9](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0009-increase-zkapp-account-update-limit.md) -- **[MIP6 — Reduce slot time to 90s](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md)** — halves the slot duration from 180s to 90s, doubling network throughput. -- **[MIP7 — Increase On-Chain State Size Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0007-increase-state-size-limit.md)** — raises per-account on-chain state from 8 to 32 field elements (the "Expanded zkApp State" change documented above). -- **[MIP8 — Increase Events & Actions Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0008-increase-events-actions-limit.md)** — raises the per-transaction event and action limit to 1024 field elements. -- **[MIP9 — Increase zkApp Account-Update Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0009-increase-zkapp-account-update-limit.md)** — triples the maximum number of account updates a single zkApp transaction can include (new rule: np + n2 + n1 ≤ 16). +Mesa **roughly triples** the maximum number of account updates a single zkApp transaction can contain. The previous weighted-cost formula (`10.26·np + 10.08·n2 + 9.14·n1 < 69.45`) is replaced with a simpler `np + n2 + n1 ≤ 16` rule that admits any balanced binary proof tree of height 4. -For a narrative overview that summarizes each change in plain language, see the [Mesa upgrade post on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). +This depends on the SNARK-worker parallelization shipped as a prerequisite for [MIP6](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md) — without it, processing maximum-size transactions inside a 90-second slot would not be feasible. + +### Automode Upgrades + +For the first time in Mina's history, node operators can upgrade through a hard fork **without manual intervention**. The automode mechanism ships both the pre-fork and post-fork binaries in a single package, with a dispatcher that automatically transitions to the new chain when the fork activates. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for details. + +### Simplified Archive Upgrade + +Unlike the Berkeley upgrade (which required up to 48 hours for archive database conversion), the Mesa archive upgrade is a fast schema upgrade that completes in under a minute. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). ## Upgrade Flow — End-to-End Timeline @@ -160,7 +180,7 @@ End-to-end walkthroughs of the four phases for different roles (block producer a | **SNARK Workers / Coordinators** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **Archive Node Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **Rosetta API Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Appendix](/network-upgrades/mesa/appendix) | +| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Archive Node Schema Changes](/network-upgrades/mesa/appendix) | ## Network Details diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx index e9144b211..084a021fa 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -256,7 +256,7 @@ Two upgrade processes are available: _trustless_ and _trustful_. If you want to 1. Make sure to test your system integration with Mesa's new features. Pay special attention to: - - If you rely on the archive node SQL database tables, please review the schema changes in the [Appendix](/network-upgrades/mesa/appendix). + - If you rely on the archive node SQL database tables, review [Archive Node Schema Changes](/network-upgrades/mesa/appendix). 2. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). 3. Upgrade all nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the pre-defined _stop-transaction-slot_. diff --git a/static/llms-full.txt b/static/llms-full.txt index 53478bea3..608e3eadc 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5452,7 +5452,7 @@ See [Preflight Network](/network-upgrades/mesa/preflight-network) for the full u url: /network-upgrades/mesa/appendix --- -# Appendix +# Archive Node Schema Changes ## Upgrading archive nodes from Berkeley to Mesa @@ -5732,7 +5732,7 @@ See [Archive Replayer](/network-upgrades/mesa/replayer) for usage, flags, and ex ## Database Schema Changes -For details on the database schema changes between Berkeley and Mesa, see the [Appendix](/network-upgrades/mesa/appendix). +For the full schema diff (new columns, modified tables, applied SQL), see [Archive Node Schema Changes](/network-upgrades/mesa/appendix). --- url: /network-upgrades/mesa/docker-compose-quickstart @@ -5906,7 +5906,7 @@ The official ledger checkpoint published with the [Mesa release](#mesa-release). ### Expanded zkApp State -Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See the [Appendix](/network-upgrades/mesa/appendix) for schema details. +Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This applies to both the `zkapp_states` and `zkapp_states_nullable` database tables. See [Archive Node Schema Changes](/network-upgrades/mesa/appendix) for the SQL diff. ### Mesa Package Naming Convention @@ -5932,28 +5932,48 @@ This documentation uses terms like _automode_, _stop-slot_, _trustless upgrade_, ## What Mesa Introduces -### Expanded zkApp State +Mesa bundles four Mina Improvement Proposals (MIPs) that change protocol behavior, plus two operational improvements to the upgrade flow itself. The canonical MIP specs live in the [MinaProtocol/MIPs](https://github.com/MinaProtocol/MIPs/tree/main/MIPS) repository; each section below links to the spec for the proposal it describes. -Mesa extends the on-chain state available to zkApps from 8 fields (indexes `0–7`) to 32 fields (indexes `0–31`) per account. This significantly increases the data capacity available to smart contracts, enabling more complex application logic without off-chain workarounds. +### Faster Blocks — [MIP6](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md) -### Automode Upgrades +Mesa halves Mina's slot time from **180 seconds to 90 seconds**, doubling block production frequency. To keep the long-term token emission rate flat, the per-block **coinbase reward is also halved** (from 720 MINA to 360 MINA). The total Mina supplied per epoch is unchanged. -For the first time in Mina's history, node operators can upgrade through a hard fork **without manual intervention**. The automode mechanism ships both the pre-fork and post-fork binaries in a single package, with a dispatcher that automatically transitions to the new chain when the fork activates. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for details. +Several second-order consequences flow from the slot-time change: -### Simplified Archive Upgrade +- **Epoch duration halves** from ~14.9 days to ~7.4 days. Scripts and operational procedures tied to epoch boundaries (delegation cooldown, automated payouts, monitoring dashboards) trigger about twice as often. +- **Vesting schedules on active vesting accounts are automatically migrated** during the hard fork so they continue unlocking on the same real-world cadence. No operator action is required. +- **The default zkApp soft limit (24 commands per block) is unset**, allowing blocks to include more zkApp transactions when network demand is high. +- **SNARK coordinators handling maximum-cost zkApp transactions should deploy at least 4 workers** (≈4 CPU cores each) to keep up with the new 90-second slot timing. A prerequisite SNARK-worker parallelization is delivered via soft fork before Mesa. -Unlike the Berkeley upgrade (which required up to 48 hours for archive database conversion), the Mesa archive upgrade is a fast schema upgrade that completes in under a minute. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). +### Expanded zkApp State — [MIP7](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0007-increase-state-size-limit.md) + +Mesa raises the on-chain state available to a zkApp account from **8 field elements (indexes `0–7`) to 32 field elements (indexes `0–31`)**. zkApps can now store roughly four times more data directly on chain without off-chain workarounds. + +Implications: + +- **zkApp developers must redeploy** to take advantage of the new fields; older verification keys will not validate transactions touching indexes `8–31`. +- **Archive databases gain new columns** (`element8` … `element31`) on `zkapp_states` and `zkapp_states_nullable`. The Mesa archive upgrade script handles this automatically — see [Archive Node Schema Changes](/network-upgrades/mesa/appendix) for the full schema diff. +- **Transaction protocol version is bumped** because the on-chain serialization format changes. + +### Larger Events and Actions — [MIP8](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0008-increase-events-actions-limit.md) -### Additional Protocol Improvements +Mesa raises the per-transaction limit on events and actions from **100 field elements to 1024 field elements** for each. The previous cap of 16 field elements per individual event or action is also removed. This makes events and actions a viable channel for richer on-chain signaling and larger off-chain dispatch payloads in a single transaction. -Beyond expanded zkApp state, Mesa ships several Mina Improvement Proposals (MIPs) that change protocol behavior. The canonical specs live in the [MinaProtocol/MIPs](https://github.com/MinaProtocol/MIPs/tree/main/MIPS) repository; the Mesa hard fork bundles: +Mostly relevant to zkApp developers — node operators do not need to act on this change, but block producers will validate against the new limits automatically after the fork. -- **[MIP6 — Reduce slot time to 90s](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md)** — halves the slot duration from 180s to 90s, doubling network throughput. -- **[MIP7 — Increase On-Chain State Size Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0007-increase-state-size-limit.md)** — raises per-account on-chain state from 8 to 32 field elements (the "Expanded zkApp State" change documented above). -- **[MIP8 — Increase Events & Actions Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0008-increase-events-actions-limit.md)** — raises the per-transaction event and action limit to 1024 field elements. -- **[MIP9 — Increase zkApp Account-Update Limit](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0009-increase-zkapp-account-update-limit.md)** — triples the maximum number of account updates a single zkApp transaction can include (new rule: np + n2 + n1 ≤ 16). +### Larger zkApp Transactions — [MIP9](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0009-increase-zkapp-account-update-limit.md) -For a narrative overview that summarizes each change in plain language, see the [Mesa upgrade post on the o1Labs blog](https://www.o1labs.org/blog/mesa-upgrade). +Mesa **roughly triples** the maximum number of account updates a single zkApp transaction can contain. The previous weighted-cost formula (`10.26·np + 10.08·n2 + 9.14·n1 < 69.45`) is replaced with a simpler `np + n2 + n1 ≤ 16` rule that admits any balanced binary proof tree of height 4. + +This depends on the SNARK-worker parallelization shipped as a prerequisite for [MIP6](https://github.com/MinaProtocol/MIPs/blob/main/MIPS/mip-0006-slot-reduction-90s.md) — without it, processing maximum-size transactions inside a 90-second slot would not be feasible. + +### Automode Upgrades + +For the first time in Mina's history, node operators can upgrade through a hard fork **without manual intervention**. The automode mechanism ships both the pre-fork and post-fork binaries in a single package, with a dispatcher that automatically transitions to the new chain when the fork activates. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for details. + +### Simplified Archive Upgrade + +Unlike the Berkeley upgrade (which required up to 48 hours for archive database conversion), the Mesa archive upgrade is a fast schema upgrade that completes in under a minute. See [Archive Upgrade](/network-upgrades/mesa/archive-upgrade). ## Upgrade Flow — End-to-End Timeline @@ -6069,7 +6089,7 @@ End-to-end walkthroughs of the four phases for different roles (block producer a | **SNARK Workers / Coordinators** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade Flags](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **Archive Node Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | | **Rosetta API Operators** | [Requirements](/network-upgrades/mesa/requirements), [Archive Upgrade](/network-upgrades/mesa/archive-upgrade), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade) | -| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Appendix](/network-upgrades/mesa/appendix) | +| **Exchanges** | [Requirements](/network-upgrades/mesa/requirements), [Upgrade Steps](/network-upgrades/mesa/upgrade-steps), [Post-Upgrade](/network-upgrades/mesa/upgrade-steps/post-upgrade), [Archive Node Schema Changes](/network-upgrades/mesa/appendix) | ## Network Details @@ -8147,7 +8167,7 @@ Two upgrade processes are available: _trustless_ and _trustful_. If you want to 1. Make sure to test your system integration with Mesa's new features. Pay special attention to: - - If you rely on the archive node SQL database tables, please review the schema changes in the [Appendix](/network-upgrades/mesa/appendix). + - If you rely on the archive node SQL database tables, review [Archive Node Schema Changes](/network-upgrades/mesa/appendix). 2. Provision servers that meet the [hardware requirements](/network-upgrades/mesa/requirements). 3. Upgrade all nodes to the stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases) before the pre-defined _stop-transaction-slot_. From 64d55fd2b5aea664d12f59a2986fc3f2733c2ff4 Mon Sep 17 00:00:00 2001 From: dkijania Date: Mon, 18 May 2026 23:20:51 +0200 Subject: [PATCH 39/45] Switch automode install to single mina-{network}-automode umbrella package The Mesa automode shipping vehicle has been unified: instead of asking operators to install both `mina-{network}-prefork-mesa` and `mina-{network}-postfork-mesa` by hand, there is now a single `mina-{network}-automode` Debian umbrella package that depends on both and lets apt resolve them transitively. Update the user-facing install flow accordingly and keep the dependency relationship visible where it matters for operators debugging their setup. User-facing install instructions: - `upgrade-modes.mdx`: rewrite the Debian install snippet to use `sudo apt-get install mina-{network}-automode=4.x.x`. Add a short paragraph noting that the package is an umbrella and apt pulls in the two sub-packages automatically. - `upgrade-steps/examples.mdx`: Alice's `apt-get install` line now installs `mina-mainnet-automode=4.x.x` instead of the two `-mesa` packages. - `upgrade-steps/pre-upgrade.mdx`: Block Producer and SNARK Coordinator checklists point at `mina-{network}-automode`. - `index.mdx`: Phase 1 Block Producers row mentions the new package by name and links to the install section on upgrade-modes.mdx. Architecture / reference: - `upgrade-modes-details.mdx`: the dual-binary table no longer labels each binary with its (now sub-package) name; "How automode is packaged" calls out the umbrella relationship explicitly and lists what each sub-package supplies. - `glossary.mdx`: pre-fork and post-fork binary entries point at `mina-{network}-automode` as the install handle; the "Mesa Package Naming Convention" entry now documents the umbrella + dependency layout. Regenerated static/llms-full.txt. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/glossary.mdx | 6 ++-- docs/network-upgrades/mesa/index.mdx | 2 +- .../mesa/upgrade-modes-details.mdx | 11 +++---- docs/network-upgrades/mesa/upgrade-modes.mdx | 8 +++-- .../mesa/upgrade-steps/examples.mdx | 2 +- .../mesa/upgrade-steps/pre-upgrade.mdx | 4 +-- static/llms-full.txt | 33 ++++++++++--------- 7 files changed, 34 insertions(+), 32 deletions(-) diff --git a/docs/network-upgrades/mesa/glossary.mdx b/docs/network-upgrades/mesa/glossary.mdx index 623637caa..4ad1b296e 100644 --- a/docs/network-upgrades/mesa/glossary.mdx +++ b/docs/network-upgrades/mesa/glossary.mdx @@ -78,11 +78,11 @@ The Docker image that bundles the [automode](#automode) runtime — both the [pr ### Pre-Fork Binary {#pre-fork-binary} -The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is packaged as `mina-{network}-prefork-mesa` and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the [automode image](#automode-image) includes this binary. +The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is shipped as part of the `mina-{network}-automode` package and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the [automode image](#automode-image) includes this binary. ### Post-Fork Binary {#post-fork-binary} -The binary that runs the new Mesa chain after the fork activates. In [automode](#automode), this is packaged as `mina-{network}-postfork-mesa` and installed at `/usr/lib/mina/mesa/mina`. The [dispatcher](#dispatcher) switches to this binary once the [activation file](#activation-file) is created. +The binary that runs the new Mesa chain after the fork activates. In [automode](#automode), this is shipped as part of the `mina-{network}-automode` package and installed at `/usr/lib/mina/mesa/mina`. The [dispatcher](#dispatcher) switches to this binary once the [activation file](#activation-file) is created. ### Dispatcher {#dispatcher} @@ -126,7 +126,7 @@ Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0 ### Mesa Package Naming Convention -The [automode](#automode) Debian packages are published with a `-mesa` suffix (`mina-{network}-prefork-mesa`, `mina-{network}-postfork-mesa`) to distinguish the dual-binary automode variants from the standard manual-mode `mina-{network}` package. This allows operators to install the automode packages side-by-side with the existing daemon without one replacing the other. +The [automode](#automode) Debian package is published as `mina-{network}-automode` to distinguish the dual-binary automode variant from the standard manual-mode `mina-{network}` package. This allows operators to install the automode package side-by-side with the existing daemon without one replacing the other. `mina-{network}-automode` is an umbrella package: under the hood it depends on `mina-{network}-prefork-mesa` (the [pre-fork binary](#pre-fork-binary)) and `mina-{network}-postfork-mesa` (the [post-fork binary](#post-fork-binary) plus the [dispatcher](#dispatcher)), and apt resolves both transitively when you install it. ### Node Status Service diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 3099dec8b..0b897cf7d 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -93,7 +93,7 @@ The table below is a high-level summary. The concrete install commands (Debian, | Actor | What to do | |---|---| | **All operators** | Verify [hardware requirements](/network-upgrades/mesa/requirements) (32 GB RAM, 8-core CPU with AVX/BMI2). Back up keys. | -| **Block Producers** | Choose [upgrade mode](/network-upgrades/mesa/upgrade-modes): **automode** (recommended) or manual. Install stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases). If automode, install both prefork and postfork packages. | +| **Block Producers** | Choose [upgrade mode](/network-upgrades/mesa/upgrade-modes): **automode** (recommended) or manual. Install stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases). If automode, install the `mina-{network}-automode` package — see [Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). | | **SNARK Coordinators** | A coordinator is a daemon node — follow the Block Producer path (automode or manual). | | **Standalone SNARK Workers** | Workers spawned by a coordinator (`--run-snark-worker`) need no separate action — they inherit the coordinator's binary. Workers run as a separate `mina internal snark-worker` process or container must be redeployed with the Mesa release after the fork. | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | diff --git a/docs/network-upgrades/mesa/upgrade-modes-details.mdx b/docs/network-upgrades/mesa/upgrade-modes-details.mdx index 100265a39..2e89360eb 100644 --- a/docs/network-upgrades/mesa/upgrade-modes-details.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes-details.mdx @@ -46,12 +46,12 @@ You **will not earn block rewards** during State Finalization (no coinbase), but ### Dual-Binary Architecture -The automode release ships with **two complete sets of Mina binaries** in a single package: +The automode release ships **two complete sets of Mina binaries plus the dispatcher** in a single `mina-{network}-automode` Debian package: | Component | Path | Purpose | |---|---|---| -| **Pre-fork binary** (`mina-{network}-prefork-mesa`) | `{RUNTIMES_BASE_PATH}/berkeley/mina` | Runs the current chain up to the stop-network-slot | -| **Post-fork binary** (`mina-{network}-postfork-mesa`) | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | +| **Pre-fork binary** | `{RUNTIMES_BASE_PATH}/berkeley/mina` | Runs the current chain up to the stop-network-slot | +| **Post-fork binary** | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | | **Dispatcher** (`mina-dispatch`) | `/usr/local/bin/mina-dispatch` | Routes your commands to the correct binary | When you install the automode package (or use the [automode Docker image](/network-upgrades/mesa/glossary#automode-image)), all three components are installed together. @@ -156,9 +156,8 @@ If your Helm chart or pod spec uses `emptyDir` for the config directory, the `ac Operator install instructions (Debian packages, Docker image) live on [Upgrade Modes — Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). The detail worth keeping here is what each artifact contributes to the mechanism described above: -- The `mina-{network}-prefork-mesa` Debian package supplies the pre-fork binary (`/usr/lib/mina/berkeley/mina`). -- The `mina-{network}-postfork-mesa` Debian package supplies the post-fork binary (`/usr/lib/mina/mesa/mina`), the dispatcher (`/usr/local/bin/mina-dispatch`), and the dispatcher configuration (`/etc/default/mina-dispatch`). -- The `minaprotocol/mina-daemon-auto-hardfork` Docker image bundles both packages and sets `MINA_APP=/usr/local/bin/mina-dispatch` and `MINA_HARDFORK_STATE_DIR=/root/.mina-config` in the entrypoint. +- The `mina-{network}-automode` Debian package is an umbrella package whose dependencies pull in the pre-fork binary, post-fork binary, dispatcher, and dispatcher configuration. Internally it depends on `mina-{network}-prefork-mesa` (supplies `/usr/lib/mina/berkeley/mina`) and `mina-{network}-postfork-mesa` (supplies `/usr/lib/mina/mesa/mina`, plus `/usr/local/bin/mina-dispatch` and `/etc/default/mina-dispatch`). Operators only need to install `mina-{network}-automode`; apt resolves the rest. +- The `minaprotocol/mina-daemon-auto-hardfork` Docker image bundles the same artifacts and sets `MINA_APP=/usr/local/bin/mina-dispatch` and `MINA_HARDFORK_STATE_DIR=/root/.mina-config` in the entrypoint. :::caution The dispatcher reads its configuration from `/etc/default/mina-dispatch`. This file must exist and be owned by root. Do not modify it unless you know what you are doing. diff --git a/docs/network-upgrades/mesa/upgrade-modes.mdx b/docs/network-upgrades/mesa/upgrade-modes.mdx index e5f4fdb57..b7e2571fa 100644 --- a/docs/network-upgrades/mesa/upgrade-modes.mdx +++ b/docs/network-upgrades/mesa/upgrade-modes.mdx @@ -83,14 +83,16 @@ Pick the install method that matches how you run your daemon today. -Install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: +Install the automode package — it ships the pre-fork binary, the post-fork binary, and the dispatcher together so the daemon routes to the correct binary before and after the fork: ```bash sudo apt-get update -sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa +sudo apt-get install mina-{network}-automode=4.x.x ``` -Both packages are required for automode to work. The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the configuration in `/etc/default/mina-dispatch`. +The package installs the pre-fork binary at `/usr/lib/mina/berkeley/mina`, the post-fork binary at `/usr/lib/mina/mesa/mina`, the dispatcher at `/usr/local/bin/mina-dispatch`, and the dispatcher configuration in `/etc/default/mina-dispatch`. + +`mina-{network}-automode` is an umbrella package — it depends on `mina-{network}-prefork-mesa` and `mina-{network}-postfork-mesa`, which apt pulls in automatically. You do not need to install them by hand. Start your node as usual — the dispatcher routes to the correct binary based on fork state. See the Debian automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. diff --git a/docs/network-upgrades/mesa/upgrade-steps/examples.mdx b/docs/network-upgrades/mesa/upgrade-steps/examples.mdx index cb3f9d3ec..6adc5bdf2 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/examples.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/examples.mdx @@ -26,7 +26,7 @@ Imagine you are **Alice**, a block producer running on a Debian server. Here is ```bash sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x +sudo apt-get install mina-mainnet-automode=4.x.x ``` She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. diff --git a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx index 084a021fa..5020afa9f 100644 --- a/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx +++ b/docs/network-upgrades/mesa/upgrade-steps/pre-upgrade.mdx @@ -47,7 +47,7 @@ Hardware specifications (RAM, CPU, storage) for every role live on the [Requirem
  • Chosen an upgrade mode: automode (recommended) or manual
  • Upgraded node to the current stable version
  • Installed stop-slot release 3.x.x before the stop-transaction-slot
  • -
  • If using automode: installed both mina-{network}-prefork-mesa and mina-{network}-postfork-mesa packages (or the automode Docker image)
  • +
  • If using automode: installed the mina-{network}-automode package (or the automode Docker image)
  • If using manual mode: installed mina-mainnet=3.x.x (stop-slot release only)
  • @@ -81,7 +81,7 @@ Hardware specifications (RAM, CPU, storage) for every role live on the [Requirem
  • Chosen an upgrade mode: automode (recommended) or manual
  • Upgraded node to the current stable version
  • Installed stop-slot release 3.x.x before the stop-transaction-slot
  • -
  • If using automode: installed both prefork and postfork packages
  • +
  • If using automode: installed the mina-{network}-automode package
  • If using manual mode: installed stop-slot release only
  • diff --git a/static/llms-full.txt b/static/llms-full.txt index 608e3eadc..883f3f342 100644 --- a/static/llms-full.txt +++ b/static/llms-full.txt @@ -5862,11 +5862,11 @@ The Docker image that bundles the [automode](#automode) runtime — both the [pr ### Pre-Fork Binary {#pre-fork-binary} -The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is packaged as `mina-{network}-prefork-mesa` and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the [automode image](#automode-image) includes this binary. +The binary that runs the current (Berkeley) chain up to the [stop-network-slot](#stop-network-slot). In [automode](#automode), this is shipped as part of the `mina-{network}-automode` package and installed at `/usr/lib/mina/berkeley/mina`. In Docker, the [automode image](#automode-image) includes this binary. ### Post-Fork Binary {#post-fork-binary} -The binary that runs the new Mesa chain after the fork activates. In [automode](#automode), this is packaged as `mina-{network}-postfork-mesa` and installed at `/usr/lib/mina/mesa/mina`. The [dispatcher](#dispatcher) switches to this binary once the [activation file](#activation-file) is created. +The binary that runs the new Mesa chain after the fork activates. In [automode](#automode), this is shipped as part of the `mina-{network}-automode` package and installed at `/usr/lib/mina/mesa/mina`. The [dispatcher](#dispatcher) switches to this binary once the [activation file](#activation-file) is created. ### Dispatcher {#dispatcher} @@ -5910,7 +5910,7 @@ Mesa increases the on-chain state available to zkApps from 8 fields (indexes `0 ### Mesa Package Naming Convention -The [automode](#automode) Debian packages are published with a `-mesa` suffix (`mina-{network}-prefork-mesa`, `mina-{network}-postfork-mesa`) to distinguish the dual-binary automode variants from the standard manual-mode `mina-{network}` package. This allows operators to install the automode packages side-by-side with the existing daemon without one replacing the other. +The [automode](#automode) Debian package is published as `mina-{network}-automode` to distinguish the dual-binary automode variant from the standard manual-mode `mina-{network}` package. This allows operators to install the automode package side-by-side with the existing daemon without one replacing the other. `mina-{network}-automode` is an umbrella package: under the hood it depends on `mina-{network}-prefork-mesa` (the [pre-fork binary](#pre-fork-binary)) and `mina-{network}-postfork-mesa` (the [post-fork binary](#post-fork-binary) plus the [dispatcher](#dispatcher)), and apt resolves both transitively when you install it. ### Node Status Service @@ -6002,7 +6002,7 @@ The table below is a high-level summary. The concrete install commands (Debian, | Actor | What to do | |---|---| | **All operators** | Verify [hardware requirements](/network-upgrades/mesa/requirements) (32 GB RAM, 8-core CPU with AVX/BMI2). Back up keys. | -| **Block Producers** | Choose [upgrade mode](/network-upgrades/mesa/upgrade-modes): **automode** (recommended) or manual. Install stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases). If automode, install both prefork and postfork packages. | +| **Block Producers** | Choose [upgrade mode](/network-upgrades/mesa/upgrade-modes): **automode** (recommended) or manual. Install stop-slot release [3.x.x](https://github.com/MinaProtocol/mina/releases). If automode, install the `mina-{network}-automode` package — see [Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). | | **SNARK Coordinators** | A coordinator is a daemon node — follow the Block Producer path (automode or manual). | | **Standalone SNARK Workers** | Workers spawned by a coordinator (`--run-snark-worker`) need no separate action — they inherit the coordinator's binary. Workers run as a separate `mina internal snark-worker` process or container must be redeployed with the Mesa release after the fork. | | **Archive Nodes** | Install stop-slot release. Choose upgrade method: _trustless_ (run upgrade script now) or _trustful_ (import o1Labs dump later). If trustless, run the [archive upgrade script](/network-upgrades/mesa/archive-upgrade) — it is backward compatible and can be applied early. | @@ -6818,12 +6818,12 @@ You **will not earn block rewards** during State Finalization (no coinbase), but ### Dual-Binary Architecture -The automode release ships with **two complete sets of Mina binaries** in a single package: +The automode release ships **two complete sets of Mina binaries plus the dispatcher** in a single `mina-{network}-automode` Debian package: | Component | Path | Purpose | |---|---|---| -| **Pre-fork binary** (`mina-{network}-prefork-mesa`) | `{RUNTIMES_BASE_PATH}/berkeley/mina` | Runs the current chain up to the stop-network-slot | -| **Post-fork binary** (`mina-{network}-postfork-mesa`) | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | +| **Pre-fork binary** | `{RUNTIMES_BASE_PATH}/berkeley/mina` | Runs the current chain up to the stop-network-slot | +| **Post-fork binary** | `{RUNTIMES_BASE_PATH}/mesa/mina` | Runs the Mesa chain after the fork | | **Dispatcher** (`mina-dispatch`) | `/usr/local/bin/mina-dispatch` | Routes your commands to the correct binary | When you install the automode package (or use the [automode Docker image](/network-upgrades/mesa/glossary#automode-image)), all three components are installed together. @@ -6928,9 +6928,8 @@ If your Helm chart or pod spec uses `emptyDir` for the config directory, the `ac Operator install instructions (Debian packages, Docker image) live on [Upgrade Modes — Installing automode](/network-upgrades/mesa/upgrade-modes#installing-automode). The detail worth keeping here is what each artifact contributes to the mechanism described above: -- The `mina-{network}-prefork-mesa` Debian package supplies the pre-fork binary (`/usr/lib/mina/berkeley/mina`). -- The `mina-{network}-postfork-mesa` Debian package supplies the post-fork binary (`/usr/lib/mina/mesa/mina`), the dispatcher (`/usr/local/bin/mina-dispatch`), and the dispatcher configuration (`/etc/default/mina-dispatch`). -- The `minaprotocol/mina-daemon-auto-hardfork` Docker image bundles both packages and sets `MINA_APP=/usr/local/bin/mina-dispatch` and `MINA_HARDFORK_STATE_DIR=/root/.mina-config` in the entrypoint. +- The `mina-{network}-automode` Debian package is an umbrella package whose dependencies pull in the pre-fork binary, post-fork binary, dispatcher, and dispatcher configuration. Internally it depends on `mina-{network}-prefork-mesa` (supplies `/usr/lib/mina/berkeley/mina`) and `mina-{network}-postfork-mesa` (supplies `/usr/lib/mina/mesa/mina`, plus `/usr/local/bin/mina-dispatch` and `/etc/default/mina-dispatch`). Operators only need to install `mina-{network}-automode`; apt resolves the rest. +- The `minaprotocol/mina-daemon-auto-hardfork` Docker image bundles the same artifacts and sets `MINA_APP=/usr/local/bin/mina-dispatch` and `MINA_HARDFORK_STATE_DIR=/root/.mina-config` in the entrypoint. :::caution The dispatcher reads its configuration from `/etc/default/mina-dispatch`. This file must exist and be owned by root. Do not modify it unless you know what you are doing. @@ -7055,14 +7054,16 @@ Pick the install method that matches how you run your daemon today. -Install **both** the prefork and postfork packages — they ship together so the dispatcher can route to the correct binary before and after the fork: +Install the automode package — it ships the pre-fork binary, the post-fork binary, and the dispatcher together so the daemon routes to the correct binary before and after the fork: ```bash sudo apt-get update -sudo apt-get install mina-{network}-prefork-mesa mina-{network}-postfork-mesa +sudo apt-get install mina-{network}-automode=4.x.x ``` -Both packages are required for automode to work. The `postfork-mesa` package also installs the dispatcher at `/usr/local/bin/mina-dispatch` and the configuration in `/etc/default/mina-dispatch`. +The package installs the pre-fork binary at `/usr/lib/mina/berkeley/mina`, the post-fork binary at `/usr/lib/mina/mesa/mina`, the dispatcher at `/usr/local/bin/mina-dispatch`, and the dispatcher configuration in `/etc/default/mina-dispatch`. + +`mina-{network}-automode` is an umbrella package — it depends on `mina-{network}-prefork-mesa` and `mina-{network}-postfork-mesa`, which apt pulls in automatically. You do not need to install them by hand. Start your node as usual — the dispatcher routes to the correct binary based on fork state. See the Debian automode example on the [Examples](/network-upgrades/mesa/upgrade-steps/examples) page. @@ -7183,7 +7184,7 @@ Imagine you are **Alice**, a block producer running on a Debian server. Here is ```bash sudo apt-get update -sudo apt-get install mina-mainnet-prefork-mesa=3.x.x mina-mainnet-postfork-mesa=4.x.x +sudo apt-get install mina-mainnet-automode=4.x.x ``` She starts her node normally. The automode dispatcher runs the pre-fork binary until the fork activates. @@ -7958,7 +7959,7 @@ Hardware specifications (RAM, CPU, storage) for every role live on the [Requirem
  • Chosen an upgrade mode: automode (recommended) or manual
  • Upgraded node to the current stable version
  • Installed stop-slot release 3.x.x before the stop-transaction-slot
  • -
  • If using automode: installed both mina-{network}-prefork-mesa and mina-{network}-postfork-mesa packages (or the automode Docker image)
  • +
  • If using automode: installed the mina-{network}-automode package (or the automode Docker image)
  • If using manual mode: installed mina-mainnet=3.x.x (stop-slot release only)
  • @@ -7992,7 +7993,7 @@ Hardware specifications (RAM, CPU, storage) for every role live on the [Requirem
  • Chosen an upgrade mode: automode (recommended) or manual
  • Upgraded node to the current stable version
  • Installed stop-slot release 3.x.x before the stop-transaction-slot
  • -
  • If using automode: installed both prefork and postfork packages
  • +
  • If using automode: installed the mina-{network}-automode package
  • If using manual mode: installed stop-slot release only
  • From bf26f1b4318225eb9aa3d05789b30927065a7be4 Mon Sep 17 00:00:00 2001 From: dkijania Date: Mon, 18 May 2026 23:31:06 +0200 Subject: [PATCH 40/45] Remove redundant "Please refer to Mesa release notes" line Address PR #1133 review comment by glyh (#3198891299): the placeholder sentence pointing at the GitHub releases filter sat between the opening paragraph and the "New to the Mesa upgrade?" info admonition without adding information beyond what later sections (Network Details, Quick Reference) already cover. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 0b897cf7d..8d12ecdc6 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -15,8 +15,6 @@ keywords: The Mesa upgrade is a major network upgrade (hard fork) for the Mina Protocol mainnet. It is not backward compatible: every consensus-participating Mina daemon (block producers, SNARK coordinators, archive nodes, Rosetta API nodes, and seed nodes) must run a Mesa-compatible release to remain on the network. Wallets, off-chain services, and downstream tooling do not run a daemon and only need to update if they pin to a specific transaction format or version. -Please refer to the Mesa node release notes [here](https://github.com/MinaProtocol/mina/releases?q=mesa). {/* TODO(PR #1133): Replace with the specific Mesa mainnet release tag URL once published. Until then this filter surfaces all `*mesa*` tags (preflight builds today). */} - :::info New to the Mesa upgrade? This documentation uses terms like _automode_, _stop-slot_, _trustless upgrade_, _dispatcher_, and more. If you encounter an unfamiliar term, check the **[Glossary](/network-upgrades/mesa/glossary)** for definitions. ::: From b6f16fca7adf9c66ba4a65bc9a16d689144059fb Mon Sep 17 00:00:00 2001 From: dkijania Date: Mon, 18 May 2026 23:31:45 +0200 Subject: [PATCH 41/45] Narrow "node operators" claims to roles that automode actually supports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR #1133 review comment by glyh (#3198895612): the opening framing on the Mesa index page over-claimed who is affected. Two residual cases of the same overreach were left in the working tree: - mesa/index.mdx, Automode Upgrades section: "node operators can upgrade through a hard fork without manual intervention" implied every operator could opt in. Tighten to "block producers" and add an explicit note that archive node and Rosetta API operators still use manual mode — automode is not available for those node types. Matches the constraint already stated on upgrade-modes.mdx. - mesa/requirements.mdx frontmatter: the page description was a carbon-copy of the original mainnet-wide claim ("requires all nodes in a network to upgrade"). Rewrite it to describe the page's actual scope: hardware and connectivity requirements for daemon node operators, with the same role list used on the index page. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 2 +- docs/network-upgrades/mesa/requirements.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 8d12ecdc6..5b0f995cf 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -58,7 +58,7 @@ This depends on the SNARK-worker parallelization shipped as a prerequisite for [ ### Automode Upgrades -For the first time in Mina's history, node operators can upgrade through a hard fork **without manual intervention**. The automode mechanism ships both the pre-fork and post-fork binaries in a single package, with a dispatcher that automatically transitions to the new chain when the fork activates. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for details. +For the first time in Mina's history, block producers can upgrade through a hard fork **without manual intervention**. The automode mechanism ships both the pre-fork and post-fork binaries in a single package, with a dispatcher that automatically transitions to the new chain when the fork activates. Archive node and Rosetta API operators still use manual mode — automode is not available for those node types. See [Upgrade Modes](/network-upgrades/mesa/upgrade-modes) for details. ### Simplified Archive Upgrade diff --git a/docs/network-upgrades/mesa/requirements.mdx b/docs/network-upgrades/mesa/requirements.mdx index 5b419e038..95f014786 100644 --- a/docs/network-upgrades/mesa/requirements.mdx +++ b/docs/network-upgrades/mesa/requirements.mdx @@ -2,7 +2,7 @@ title: Requirements sidebar_label: Requirements hide_title: true -description: Mesa upgrade is a major upgrade that requires all nodes in a network to upgrade to a newer version. It is not backward compatible. +description: Hardware and connectivity requirements for daemon node operators upgrading to Mesa — block producers, SNARK coordinators, archive nodes, Rosetta API nodes, and seed nodes. keywords: - Mesa - upgrade From 277af1926b3a4d7fd965487405b1740745393a2d Mon Sep 17 00:00:00 2001 From: dkijania Date: Mon, 18 May 2026 23:32:05 +0200 Subject: [PATCH 42/45] Replace AI-generated timeline placeholder with official Mesa diagram MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Address PR #1133 review comments by glyh (#3198904627), cjjdespres (#3220486292), and yamimaio (#3228350952): the original timeline diagram was AI-generated and flagged for replacement with an official design asset. The earlier commit had removed the diagram and left a TODO comment pointing at the slide deck / Berkeley upgrade-steps reference; this commit drops in the final asset. - Add `static/img/network-upgrades/mesa/mesa-upgrade-timeline.png` (960x540) — the four-phase timeline shown on the Mesa upgrade slide deck, covering Pre-Upgrade → State Finalization → Upgrade → Post-Upgrade with the stop-transaction-slot and network shutdown markers. - mesa/index.mdx Overview section: swap the TODO MDX comment for an `` tag at full width with an alt-text description of the diagram's content. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/network-upgrades/mesa/index.mdx | 2 +- .../mesa/mesa-upgrade-timeline.png | Bin 0 -> 641183 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 static/img/network-upgrades/mesa/mesa-upgrade-timeline.png diff --git a/docs/network-upgrades/mesa/index.mdx b/docs/network-upgrades/mesa/index.mdx index 5b0f995cf..e714ba66e 100644 --- a/docs/network-upgrades/mesa/index.mdx +++ b/docs/network-upgrades/mesa/index.mdx @@ -70,7 +70,7 @@ The Mesa upgrade follows four phases. The timeline below shows what happens at e ### Overview -{/* TODO(PR #1133): Replace with updated timeline diagram from design (Rebecca). Reference: the diagram used in the Berkeley upgrade-steps page and the Mesa upgrade slide deck. The previous AI-generated `simplified-schedule.png` has been removed pending the official version. */} +Mina's Mesa Upgrade — four-phase timeline from Pre-Upgrade through Post-Upgrade, with state finalization and network shutdown markers The upgrade moves through four phases — **Pre-Upgrade**, **State Finalization**, **Upgrade**, and **Post-Upgrade** — anchored by three key moments: diff --git a/static/img/network-upgrades/mesa/mesa-upgrade-timeline.png b/static/img/network-upgrades/mesa/mesa-upgrade-timeline.png new file mode 100644 index 0000000000000000000000000000000000000000..65c6dbe4d45efd9a3d711e8c5a8180ac7e9989b8 GIT binary patch literal 641183 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