Skip to main content

Post-Upgrade

Exactly 3 hours after the network reaches the stop-network-slot, at the predefined Mesa genesis timestamp, block production starts and the network is successfully upgraded.

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

First, confirm your node is on the Mesa chain — this check is identical for every role:

# If using automode, check the activation file exists
ls ~/.mina-config/auto-fork-mesa-mainnet/activated

# Check node status
mina client status

You should see:

  • Sync status: Synced
  • Chain ID matching the Mesa chain ID for your network. The chain ID changes at the fork and is network-specific (mainnet, devnet, and preflight each get their own) — the exact value is published in the Mesa release announcement alongside the first Mesa packages.
  • Git SHA-1 matching the published Mesa daemon commit
  • Genesis timestamp matching the published Mesa genesis timestamp
  • Block height advancing

Then run the role-specific checks below.

Verify block production

Verify block production the same way you would on Berkeley — see Block Producer Node for the relevant mina client status fields and checks. If you are a Delegation Program participant, your uptime continues to be tracked on the Mesa chain.

Check logs for errors

# Look for any errors in recent logs
journalctl -u mina --since "1 hour ago" --no-pager | grep -i error

# For Docker
docker logs mina --since 1h 2>&1 | grep -i error

In-Depth Validation

The checks in the tabs above cover basic health. This section provides deeper validation procedures for operators who want thorough verification.

  1. Verify signature kind — query the GraphQL endpoint to confirm the correct signature kind:

    query {
    signatureKind
    }

    For mainnet, this should return mainnet.

  2. Verify connectivity — ensure your node has peers and is connected to the network. Check that the node is receiving and gossiping blocks.


Help Monitor the Network

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:

--simplified-node-stats
--node-status-url https://nodestats.minaprotocol.com/submit/stats
--node-error-url https://nodestats.minaprotocol.com/submit/stats
  • --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

If you encounter any problems after the upgrade:

  • Report bugs on GitHub with the label mesa
  • Reach out on Discord in the appropriate channel

Flag and Configuration Reference

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.

What changed in Mesa
  • Only if you manually manage your genesis config or genesis ledgers, repoint --genesis-ledger-dir and -config-file at the Mesa-specific files. Operators who rely on the package-installed genesis config — including all automode users — do not need to change anything. If you do override them, 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).
  • 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.
Block Producer flags
mina daemon
--block-producer-key <path to the wallet private key file>
--config-directory <path to the mina configuration directory>
--file-log-rotations 500
--libp2p-keypair <keyfile path>
--log-json
--peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt

ENVIRONMENT VARIABLES
RAYON_NUM_THREADS=6
MINA_LIBP2P_PASS
MINA_PRIVKEY_PASS
SNARK Coordinator flags
mina daemon
--config-directory <path to the mina configuration directory>
--enable-peer-exchange true
--file-log-rotations 500
--libp2p-keypair <keyfile path>
--log-json
--peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt
--run-snark-coordinator <public key>
--snark-worker-fee 0.001
--work-selection [seq|rand|roffset]

ENVIRONMENT VARIABLES
MINA_LIBP2P_PASS
SNARK Worker flags
mina internal snark-worker
--proof-level full
--shutdown-on-disconnect false
--daemon-address <snark coordinator IP:port>

ENVIRONMENT VARIABLES
RAYON_NUM_THREADS=8
Archive Node flags

Running an Archive Node involves a non-block-producing daemon connected to the archive process and a PostgreSQL database. For more information, see Archive Node.

Daemon (non-block-producing):

mina daemon
--archive-address <archive_address>:3086
--config-directory <path to mina config>
--enable-peer-exchange true
--file-log-rotations 500
--libp2p-keypair <keyfile path>
--log-json
--peer-list-url https://bootnodes.minaprotocol.com/networks/mainnet.txt

ENVIRONMENT VARIABLES
MINA_LIBP2P_PASS

Archive process:

mina-archive run
--metrics-port <port>
--postgres-uri postgres://<user>:<password>@<address>:<port>/<db>
--server-port 3086
--log-json
--log-level DEBUG
Rosetta API

Once your Archive Node stack is running:

docker run \
--name rosetta --rm \
-p 3088:3088 \
--entrypoint '' \
minaprotocol/mina-rosetta:<mesa-version>-bullseye-mainnet \
/usr/local/bin/mina-rosetta \
--archive-uri "${PG_CONNECTION_STRING}" \
--graphql-uri "${GRAPHQL_URL}" \
--log-json \
--log-level ${LOG_LEVEL} \
--port 3088