Repository navigation
Releases: minanode/mina-rust
Release list
0.20.0
minanode 0.20.0 release notes
What 0.20.0 is
0.20.0 is the first public release of the revived Rust Mina node. It runs on the
public devnet as a full node, a SNARK worker or a block producer, and follows
Mesa chains next to OCaml peers. It is one program for Linux on x86-64 or ARM64,
with the dashboard built in. 0.20.0 is a beta release. Run it on devnet and in
test setups. Expect changes before it is ready for production.
The comparison baseline is o1Labs'
v0.17.0 release (17
September 2025, pre-Mesa OCaml 3.2.0-beta2 devnet). The inherited changelog also
has 0.18.x and 0.19.0 sections; they are not the baseline.
Highlights
- Mesa support. The node follows Mesa devnet and mainnet chains. It serves
history and ledgers to OCaml peers. It produces proved blocks on public
devnet. Devnet circuits and genesis configurations are embedded. - Sync speed. A fresh devnet node syncs from OCaml peers in under a minute.
Mainnet takes a few minutes from an empty store, most of it downloading the
ledger. A restart replays its saved chain and is synced in seconds. - Memory. A synced devnet full node uses a few hundred MB of RAM. Epoch and
root ledger accounts live on disk, proofs live in a checked disk cache, and
scan trees share memory between snapshots. It runs on a Raspberry Pi 4 and on
a 1 GB Raspberry Pi 3. - Dashboard.
minaserves a dashboard for sync, blocks, accounts, block
production and the SNARK worker, and prepares bug reports locally. - Light-client endpoints.
/light/best-tipand/light/account/{pk}return
the tip with its proof and account Merkle paths for a light client to check. - Web node relay readiness. A native node may serve browser web nodes
through a signaling-only listener (--webrtc-signal-port). The web node and
the relay guide launch separately from this release. - Docker. A multi-arch image is built from the signed release archives.
Upgrade notes
-
Key passwords. Key passwords come from the environment, never the command
line:MINA_PRIVKEY_PASSfor producer and wallet keys,MINA_LIBP2P_PASSfor
libp2p keys. A password given on the command line is refused at startup, with
a message naming the variable. See
key passwords. -
Key file permissions. Encrypted key files must be accessible by their
owner only, as the OCaml node requires. Runchmod 600on a producer, libp2p
or wallet key file before starting; the node refuses a file that group or
other users can read or write. Key files the node writes are already private.
See
key file permissions. -
HTTP binding and CORS. The operator HTTP API and dashboard listen on
127.0.0.1by default;--http-addrchanges the binding. The dashboard works
without a flag atlocalhostor an IP address. A dashboard opened at a host
name needs--http-cors-origin http://NAME:PORT, and the refusal names the
exact value.--http-cors-origin '*'restores the previous behaviour. See
dashboard on a server. -
GraphQL limits. The node now admits zkApp commands as o1js builds them, up
to the largest Mesa accepts (15 proofs). A valid command padded with many
empty events can still exceed the limits. A request may carry up to 1.25 MiB
of query text and body and 24,576 tokens.--public-graphqlkeeps the earlier
limits and refuses mutations. Transaction submission stays off unless the node
starts with--enable-tx-submission. See
GraphQL. -
Proof cache on a producer. A block producer keeps proofs in memory unless
started with--proof-cache. Full nodes and SNARK workers use the disk cache
by default;--no-proof-cacheturns it off. See
proof cache. -
CLI changes. Options were renamed before this first public release. Old
names kept as hidden aliases still work; the rest are refused. See the
CLI reference.- Every environment variable starts with
MINA_.PORT,LIBP2P_PORT,
SEED,CONFIG,GENESIS_CONFIG,PEER_LIST_FILE,PEER_LIST_URL,
PRODUCER_KEY,RUN_SNARKER,SNARKER_FEE,SNARKER_STRATEGY,
SNARKER_BLOCK_FIRST_LEAD,VERBOSITY,RECORD,RNG_SEED,ARCHIVE_*
andFROMare read only with the prefix, asMINA_PORT. The bare names are
ignored without a warning. wallet send --amountand--fee, andwallet delegate --fee, take MINA
with up to 9 decimal places (--fee 0.1), as OCaml does. A script that
passed nanomina must divide by 1,000,000,000: the old value now means a
billion times more.wallet statusshows amounts and fees in MINA too.--node <URL>, the node's HTTP base URL, withMINA_NODE_URL, names the
node on every command that talks to one. It replacesnode status --urland
wallet balance --endpoint, which stay as hidden aliases.mina miscis nowmina keys.misc mina-encrypted-keyruns
wallet generate, which needs--outputand a non-empty password.
frontier-store-checkis nowmina node frontier-store-check. The old
paths are hidden aliases.- A secret key argument reads
MINA_SEC_KEY, askeys mina-key-pairdid;
MINA_ENC_KEYis read only when neither--secret-keynorMINA_SEC_KEY
gives a key. --no-frontier-store(MINA_NO_FRONTIER_STORE) and--no-proof-cacheturn
the frontier store and the proof cache off.--proof-cachetakes no value,
and--proof-cache=<BOOL>is refused.--frontier-store=<BOOL>and
MINA_PROOF_CACHEstill work but are hidden.- Removed:
mina snark,--experimental-catchup-rpc,--catchup-rpc-peer
andwallet send --fee-payer. - OCaml's
--external-port,--run-snark-worker,--snark-worker-feeand
--block-producer-keyare accepted as aliases.
- Every environment variable starts with
-
WebRTC backend. Server-side WebRTC (browser peers and web node relays) now
uses rustrtc 0.4.9, pinned invendor/rustrtcwith our patches: resource
limits, data channel and port fixes, no UPnP.mina --versionand
mina build-infoname the backend. The defaultp2p-webrtcfeature selects
rustrtc. Thep2p-webrtc-rsfeature selects the previous backend at build
time; there is no automatic fallback. See the
fallback build command. -
ARM64 allocator. ARM64 builds now use jemalloc, built for 64 KiB pages so
it runs on 4, 16 and 64 KiB kernels, with the samenarenas:4default as
x86-64._RJEM_MALLOC_CONFoverrides allocator options on both. See
memory. -
Data directories from release candidates. A work directory written by RC4
restores on 0.20.0; the frontier-store format has not changed since. Accounts
files from an earlier run are removed at start. Directories from earlier
candidates were not tested. See
upgrading.
Changes by area
Ledger and storage
- The staking, next epoch and root snarked ledgers keep their accounts in files
under<work dir>/ledger-accounts/.--no-ledger-diskkeeps them in memory. - A bootstrap holds one full ledger in memory and syncs the others as masks over
it. - A ledger read from disk is retried before the node gives up, and the node then
exits cleanly instead of aborting. - A refreeze that fails, for example on a full disk, backs off from 60 seconds
up to one hour. - An abandoned frontier-store restore is cancelled before the node bootstraps.
If the cancellation does not finish within 30 seconds, the node bootstraps
with the frontier store disabled until the next restart. - The restore timeout follows load progress.
- The genesis ledger cache is written atomically.
- The root staged ledger stays over the root snarked ledger across epoch
boundaries, with bounded memory and ledger correctness matching OCaml.
Memory
- Transaction, zkApp, scan-state and block proofs share memory and use a
digest-checked disk cache underproof-cache/. - Scan trees share unchanged chunks between snapshots.
- The last ledger write, diagnostic stats and action statistics are bounded.
- x86-64 builds use jemalloc with
narenas:4by default. - The frontier-store load runs on at most four threads, which lowers the restart
peak on machines with many CPUs. - The web node reports its heap and frees large WebRTC receive buffers.
Networking
-
Block fetch backs off after errors and fails over to other peers.
-
A peer's best tip is refreshed while no bootstrap target exists.
-
A ledger, block or staged-ledger query that never gets an answer is retried.
-
Useful advertised addresses are kept, Kademlia buffers are bounded, and
OCaml's parallel Yamux RPCs are supported. -
Reliability fixes for input checks, resource limits and request handling.
-
Server-side WebRTC uses rustrtc by default.
GraphQL and RPC
- Large zkApp commands are admitted with bounded memory per request.
account { index leafHash merklePath }and
encodedSnarkedLedgerAccountMembershipmatch OCaml's names and shapes.- The light-client HTTP endpoints are on the operator router, with request
limits and a 10 second deadline. - Answered ledger-read and transaction-submission requests are removed from the
request map.
CLI
--network mainnetselects the embedded mainnet genesis; an explicit
--genesis-configstill wins.- Key passwords are read from the environment, never from the command line.
mina reportandmina triagecollect a local bug report.- The SNARK worker selects jobs randomly by default;
--snarker-strategy seq
selects them in order. - A node at genesis o...