To perform the upgrade from 1.5 to 2.0, first connect a node to the 1.5 network.
When it has synchronized, the fork_config
GraphQL endpoint produces the protocol
state needed to start the new chain:
curl --location "http://localhost:3085/graphql" \
--header "Content-Type: application/json" \
--data "{\"query\":\"query MyQuery {\n fork_config\n}\n\",\"variables\":{}}" | jq '.data.fork_config' > fork_config.json
You may now shut down the node. mv ~/.mina-config ~/mina-1-final-config
. This is your last chance to save or archive the transition frontier as it existed at the end of the chain.
If you installed mina from a package, skip to the next section. This section is if you build from source.
Now that you have moved the old config directory, build or install Mina 2.0. Use mina-create-genesis
(or, dune exec --profile=mainnet src/app/runtime_genesis_ledger/runtime_genesis_ledger.exe
) to bundle the ledgers and kickstart the new config. The 1.5 ledger format is slightly different than the 2.0 format which now includes a version number. A simple sed command corrects for this difference. This step will take some time, as it must hash the exported ledgers.
sed -i -e 's/"set_verification_key": "signature"/"set_verification_key": {"auth": "signature", "txn_version": "1"}/' fork_config.json
mkdir -p ~/.mina-config/genesis
mina-create-genesis --config-file fork_config.json --genesis-dir ~/.mina-config/genesis --hash-output-file ~/.mina-config/genesis_hashes.json
Next, drop the accounts from the fork config to form the start of the new config:
jq --slurpfile hashes ~/.mina-config/genesis_hashes.json 'del(.ledger) | del(.epoch_data.staking.accounts) | del(.epoch_data.next.accounts) * $hashes[0]' fork_config.json > ~/.mina-config/daemon.json
Finally, edit the daemon.json
to also include the correct genesis timestamp. You will need to consult the release documentation for this value.
As an optional check, you can use ldb
to compare the generated key-value databases to those archived on the web. The ldb
tool is part of rocksdb, packaged as:
- Nix:
rocksdb.tools
(eg run this insidenix-shell -p rocksdb.tools
) - Debian/Ubuntu/Fedora:
rocksdb-tools
- homebrew:
rocksdb
- Arch Linux:
rocksdb-ldb
(AUR)
workdir=$(mktemp -d)
ldb_cmd=$(command -v rocksdb-ldb || command -v rocksdb_ldb || command -v ldb)
error=0
for file in ~/.mina-config/genesis/*.tar.gz; do
tarname=${$(basename "$file")%.tar.gz}
tardir="$workdir/verify-ledgers/$tarname"
mkdir -p "$tardir/{web,generated}"
tar -xzf "$file" -C "$tardir/generated"
curl "https://s3-us-west-2.amazonaws.com/snark-keys.o1test.net/$tarname.tar.gz" | tar -xz -C "$tardir/web"
$ldb_cmd --hex --db="$tardir/web" scan > $workdir/web.scan
$ldb_cmd --hex --db="$tardir/generated" scan > $workdir/generated.scan
if ! cmp $workdir/generated.scan $workdir/web.scan; then
echo "Error: kvdb contents mismatch for $tarname"
error=1
fi
done
A script is installed (from ./scripts/mina-verify-packaged-fork-config
) that automates this process. If you want to verify that an installed Mina package was generated from the same configuration as the one exported earlier, it is as easy as:
mina-verify-packaged-fork-config (mainnet|devnet) fork_config.json /tmp/mina-verification
Many of the script inputs are environment variables that default to the locations used by the debs. If you are building from source, inspect the script, determine what you need to change, and then run it.
Here are some general instructions that should help you get most of the way there.
-
Use a Debian Environment:
- It is recommended to perform package verification in a Debian environment because macOS Intel emulation doesn’t support the required AVX instructions for libp2p.
-
Environment Preparation:
- Install mina-create-legacy-genesis
echo "deb [trusted=yes] http://packages.o1test.net bullseye stable" > /etc/apt/sources.list.d/o1.list apt-get update apt-get install mina-create-legacy-genesis=1.4.1-97f7d8c
- Direct Installation Script:
- NOTE this currently needs to be run as root
#!/bin/bash export CONFIG_JSON_GZ_URL="https://storage.googleapis.com/tmp-hardfork-testing/fork-config-3NLRTfY4kZyJtvaP4dFenDcxfoMfT3uEpkWS913KkeXLtziyVd15.json.gz" export GENESIS_TIMESTAMP="2024-06-05T00:00:00Z" export NETWORK_NAME="mainnet" mkdir -p genesis_ledgers cp /var/lib/coda/config_93e02797.json genesis_ledgers/mainnet.json curl https://storage.googleapis.com/tmp-hardfork-testing/fork-config-3NLRTfY4kZyJtvaP4dFenDcxfoMfT3uEpkWS913KkeXLtziyVd15.json.gz > config.json.gz && gunzip config.json.gz && mina-verify-packaged-fork-config mainnet config.json /workdir/verification
- Install mina-create-legacy-genesis
- Prepare Environment Variables: Set up the necessary environment variables manually to match the expected configuration for verification.
- Create
genesis_ledgers
Directory: Temporarily, create a new directory namedgenesis_ledgers
in the working directory and place the daemon config for the required chain, typicallymainnet.json
there. Alternatively, make sure thatgenesis_ledgers/mainnet.json
is present. The script assumes that it is running in a directory where this is present.
- Set Environment Variables:
- GSUTIL Path:
export GSUTIL=/usr/bin/gsutil
- Download Block Data:
- Example command to download the block data:
gsutil cp gs://mina_network_block_data/mainnet-<some-version>.json ./block_data.json export PRECOMPUTED_FORK_BLOCK=./block_data.json
- Example command to download the block data:
- Verify Additional Variables:
- Confirm the following variables are properly set:
CONFIG_JSON_GZ_URL=<url to fork config zip> ex: "https://storage.googleapis.com/fork-config-dryrun.json.gz" GENESIS_TIMESTAMP=<same ts as your genesis config> ex: "2024-05-03T00:00:00Z" NETWORK_NAME=<this should match the intended network> ex: mainnet PRECOMPUTED_BLOCK_GS_PREFIX=<url to the network block data> ex: "gs://mina_network_block_data/mainnet"
- Confirm the following variables are properly set:
- GSUTIL Path:
- Run the Verification Command:
- If the fork config is not already on your machine, you can download it with a command similiar to:
curl https://storage.googleapis.com/fork-config-dryrun.json.gz > config.json.gz && gunzip config.json.gz && mina-verify-packaged-fork-config mainnet config.json /workdir/verification gs://mina_network_block_data/mainnet-pre-hf-dry-run-2
- If the fork config is already available locally, use:
mina-verify-packaged-fork-config mainnet fork-config-dryrun.json /tmp/mina-verification
- If the fork config is not already on your machine, you can download it with a command similiar to: