Docs/Operate

Mainnet launch runbook

The difficulty schedule (ASERT) is anchored at the genesis block's timestamp. A genesis in the past keeps difficulty at the minimum until the chain catches up; a genesis in the future makes mining impossible until then. So the mainnet genesis time is set once, at launch, to the announced launch moment. Everything below is in order; do not skip steps.

T minus 2 weeks

  1. Freeze consensus: docs/SPEC.md §13 open items resolved, external review findings closed (docs/SECURITY-REVIEW.md), go test ./... and the fuzzers green on Linux, macOS and Windows.
  2. Decide the launch moment T (unix seconds, UTC). Announce it publicly with the genesis message that will be embedded.
  3. Final names: chain name, unit name, address prefix (HRP in consensus/params.go), ports, user agent. Changing the HRP after this point invalidates every printed address.
  4. Stand up at least three seed nodes (deploy/README.md) on testnet first; confirm they peer with each other.

T minus 1 day

  1. Mine the genesis block for T:
    go run ./cmd/genesis -time <T> -message "<the announced message>" mainnet
    
    It prints the nonce and hash. Paste T into genesisTime and the nonce into MainNet's genesisSpec in consensus/params.go. Record the hash in README.md.
  2. go test ./consensus/ must pass (TestGenesisBlocksValid checks the proof of work, the chain tag and the round trip).
  3. Set the DNS seeds and hardcoded seed IPs in cmd/argonmined/main.go and cmd/argonmine-app/main.go. Create the DNS records.
  4. Build the release: scripts/release.ps1 -Version 1.0.0 (or scripts/release.sh 1.0.0). Publish the zips and SHA256SUMS; sign the checksum file with a key announced in advance.
  5. Deploy the release to the seed nodes with -network mainnet. They will sit at height 0 and refuse to mine until T (block timestamps must exceed the genesis time).

T

  1. Start mining on at least one node you control so the first blocks arrive on schedule; stop when public hashrate takes over. Never premine: the genesis coinbase is unspendable by rule and the first real block is at height 1, after T.
  2. Watch getblockchaininfo on every seed: heights equal, same best hash.
  3. Start the explorer against a seed node; it also serves work to browser miners.

T plus 1 hour and later

  1. Check ASERT behaviour: difficulty should move smoothly toward the 600-second target as hashrate arrives. If blocks are coming faster than one per minute for over an hour, something is wrong with the anchor; stop and investigate before more coins are issued.
  2. Keep the signing key and seed node credentials offline. Rotate the RPC tokens.
  3. Tag the release commit; from now on every consensus change is a scheduled hard fork with a version bump (SPEC §3.2).

Abort criteria

Abort before T if any of: tests red, a seed node unreachable, a review finding of High or Critical severity open, or the genesis hash in the release binaries does not match the one you mined. After T, a consensus bug means a coordinated restart with a new genesis; announce, do not patch silently.