Skip to main content

Mainnet

The genesis of the mainnet is the mainnet preset of the runtime (runtime/src/genesis_config_presets.rs). Its specification does not exist yet: it is generated once, at the launch, from the runtime of the release, then frozen in chain-specs/mainnet.json.

Genesis​

Supply14,000,000 TESS: 85% mined, 10% team, 5% foundation
Mining0.85 TESS a block of 18 seconds, halving every 7,000,000 blocks
Team1,400,000 TESS, half to each member, released from a six-month cliff to 48 months
Foundation700,000 TESS to a 2-of-3 multisig, 140,000 liquid and the rest released over 36 months
Sudonone: referenda decide, the technical committee is the three signatories of the foundation
Difficulty1,000,000 at genesis, about 55 kH/s at 18 seconds a block
Other balancesnone: every other TESS is mined

Accounts:

AccountAddress
Team member 1, foundation signatorytetTtAxXxBzRTTsc5otocLgRrGZVCcxzBeK4NSGwdqAsee7XM
Team member 2, foundation signatorytetBiN5GwskQqq8ykcMUQbqCPdWPRaE5PoYwfazsJ2jHGtTZw
Backup key, foundation signatoryterN4gSZpiFpeERvb1PoaJiiBRqSEmXw56xF5MqqjLbp7eH3x
Foundationthe 2-of-3 multisig of the three signatories

Any two of the three keys approve a spending of the foundation, or whitelist a call as the technical committee; losing one key blocks nothing, and one stolen key is not enough. Keep the backup key offline.

The test mainnet_genesis_creates_the_allocations_only (runtime/src/tests/allocations.rs) checks these balances, the cliff of the team, the liquid part of the foundation and the technical committee.

Initial difficulty​

The difficulty follows the miners from the first blocks (LWMA over 120 blocks), but its value at genesis decides the first hour. Too low, the first miners find blocks in seconds and take a large share of the early emission until the difficulty catches up; too high, the first blocks are slow until it comes down. Set MAINNET_INITIAL_DIFFICULTY just before the launch to the hashrate expected at the start, in hashes per second, times 18: the hashrate of the testnet is a good measure.

Launch​

  1. Freeze the runtime of the release and build it reproducibly: scripts/build-runtime.sh writes target/runtime-release/tesserax_runtime.compact.compressed.wasm and its BLAKE2-256 hash. Publish the hash with the release, so that anyone can rebuild the runtime and compare.

  2. Generate the specification with that runtime:

    tesserax export-chain-spec --chain mainnet-genesis > mainnet-plain.json
    # Replace genesis.runtimeGenesis.code by 0x and the hexadecimal of the reproducible runtime.
    tesserax export-chain-spec --chain mainnet-plain.json --raw > chain-specs/mainnet.json
  3. Add the bootnodes to bootNodes, make the node load chain-specs/mainnet.json for --chain mainnet, as it does for the testnet, and release the node.

  4. Open the mainnet in the wallet (tesserax-wallet, src/lib/networks.ts): set its genesisHash, which makes the network selectable, and its node and explorer if they differ from wss://rpc.tesserax.app and https://explorer.tesserax.app. To open the wallet on the mainnet by default, set VITE_NETWORK=Mainnet in .env.production and .env.desktop; the explorer database variables without prefix then serve the mainnet, and those of the testnet take the VITE_TESTNET_ prefix. A build can also set the mainnet alone, without a new release of the code, with VITE_MAINNET_GENESIS, VITE_MAINNET_NODE_URL and VITE_MAINNET_EXPLORER_URL.

  5. Announce the genesis hash and the launch time; the first block is mined by whoever starts first.

Running a node​

The mainnet needs the same machines as the testnet: 2 cores, 4 GB of memory and a 100 GB SSD for a full node, more for a public, archive or mining node. See node.md. Once the mainnet is launched:

tesserax --chain mainnet --base-path /var/lib/tesserax

Governance​

The mainnet starts without a sudo key: referenda decide from the first block (governance.md), and the technical committee is the three signatories of the foundation, fixed at genesis. The allocations of the team and of the foundation do not vote while they vest.