All of the moving parts that need to come together to successfully launch an ETH2 network.
Examples are italic, here: Medalla.
The following steps are crucial to design and plan the testnet.
- Design the scope, i.e., dev-net, public testnet, attack-net, incentivized network, etc. pp.
- official public testnet
- Optionally, give it a name. This is only necessary for long-term, public or mid-term, semi-public networks. Long names should come with a short handle for the client's config.
- Medalla, or
medalla
- Medalla, or
- Define the version of the specification, e.g.,
v0.12.2
orv0.11.3
, so that all clients can agree on running the same specification. Make sure the specification has tests and a release in the official spec repository.v0.12.2
- eth2.0-specs#1955 (release pending)
- Pick a chain specification. In most cases, you want to use a
mainnet/phase0
config. But there are also potentially needs forminimal
orphase1
configs. - Deploy the deposit contract. Either use the official Solidity contract, the Vyper contract, or any customly augmented contract that contains features for testing purposes, i.e., withdrawal functions or validator whitelisting. Make sure to verify it on block explorers for public testnets.
- Solidity contract
deposit_contract.sol
- formally verified exact byte code
deposit_contract.json
- Solidty
v0.6.8
, optimized:yes
, runs:5000000
- deployed to address 0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC
- verified on Etherscan address/0x07b3..3fdc#code
- Solidity contract
- Define a minimum genesis time. You don't want to launch the network prior to that timestamp. Only required for coordinated launches, otherwise just use the default and launch right away.
- Gregorian: August 4th, 2020, 1pm UTC
- Unix:
1596546000
- Optionally, choose a custom genesis fork version, or modify any other parameters as per your needs, e.g., number of genesis validators or deposit amounts.
- Genesis fork version:
0x00000001
- Genesis fork version:
- Add the chosen parameters to the chain specification. The selected chain configuration requires to be updated with everything defined above.
- for Medalla: gist/q9f/941b2621214d05ef8759abde30e4f9ef
MIN_GENESIS_TIME: 1596546000 DEPOSIT_CONTRACT_ADDRESS: 0x07b39F4fDE4A38bACe212b546dAc87C58DfE3fDC GENESIS_FORK_VERSION: 0x00000001
- for Medalla: gist/q9f/941b2621214d05ef8759abde30e4f9ef
- That's it, that's the testnet.
The following steps are necessary to implement, deploy, and prepare the launch of the testnet. It assumes launching a public or semi-public testnet that requires some coordination. Private or short-term dev-nets could proceed directly to the launch section.
- Publish the configuration in an accessable location, e.g., Github, Gist, Pad, Hackmd, etc.
- Communicate the scope and chain configuration early with the client teams. They can then decide to bake in the configuration and even, depending on scope and spec version, make it the default testnet.
- Lighthouse github/sigp/lighthouse
- Prysm github/prysmaticlabs/prysm
- Teku github/PegaSysEng/teku
- Nimbus github/status-im/nim-beacon-chain
- Lodestar github/ChainSafe/lodestar
- Trinity github/ethereum/trinity
- Cortex github/NethermindEth/cortex
- Bootnodes: This is always our chicken-and-egg item on that bullet list. Do we provide bootnodes first that we can add to the clients or do we implement the config in the clients before setting up bootnodes? Whatever you do first, please publish the bootnode's ENR and/or Multi-Address to Github/Gist/Pads, so other clients can access this resource. It's recommended that each client provides at least one bootnode.
- Clients: Implement the specification and bootnodes. Consider giving it internally a meaningful name (
medalla
), maybe log the spec version (v0-12-2
), and provide command-line flags for users to be able to connect to the network (--medalla
or--medalla-testnet
). Depending on the scope, also consider making it default or just an additional network. - Communicate the planned launch and the scope of the network with other service providers that are potentially interested in the network. Tell them about the name, scope, config, and planned launch date.
- Block explorers:
- EtherScan/BeaconScan beaconscan.com
- Bitfly/BeaconChain beaconcha.in
- BlockAction blockaction.io
- Network monitors:
- ETH2Stats eth2stats.io
- Staking pools:
- Rocket Pool rocketpool.net
- Miscellaneous:
- Proof of Attendance poap.xyz
- Block explorers:
The following steps are necessary to launch a network. For the sake of completeness, it assumes a launch of a public, coordinated testnet.
- Configure and provide a launchpad. Users that want to validate on the network should be provided with a user interface helping to make validator deposits and get set up completely.
- Ethereum Foundation's Launchpad github/ethereum/eth2.0-deposit
- Prysmatic Labs' Testnet Site github/prysmaticlabs/prysm-testnet-site
- For testnets, provide faucets that allow users to redeem enough testnet tokens to be able to make around one to five validator deposits, e.g., for Goerli.
- DappNode Faucet
206.25 ETH/9 days
goerli-faucet.dappnode.net - Mudit's Faucet
87.50 ETH/9 days
faucet.goerli.mudit.blog - Serverless Faucet
32.50 ETH/day
github/PhilippLgh/serverless-faucet - Prylabs Faucet
32.50 ETH/request
prylabs.net/participate - Metamask Faucet
1.00 ETH/request
faucet.metamask.io - Status Faucet
0.10 ETH/request
faucet-goerli.status.im/faucet-info - Slockit Faucet
0.05 ETH/request
goerli-faucet.slock.it - More: WallEth, Avado, StakeWise, ...
- DappNode Faucet
- Make sure everything above is properly documented, especially custom command-line flags, instructions how to run a beacon node or a validator, how to use the launchpad with a certain client, etc. pp.
- Client teams should prepare properly tagged releases and binaries if desired to ease running the nodes on the new network.
- Provide genesis validators. Key stakeholders and client teams might want to run validators at genesis for various reasons. Make sure to get in deposits before the minimum genesis validator count is met.
- Announce the launch if you want a broad audience, either "officially" through the Ethereum Foundation blog or through the client teams communication channels (discord, blogs, etc.).
- Monitor the launch. Lean back and check validator deposits, some might be invalid due to outdated tooling or bugs that should be squashed immediately once isolated.
- Launch. This is most likely happening automatically once minimum validator deposits are met and the minimum genesis time passed. It's worth comparing the computed genesis time, the fork digest, initial state and block root across the clients. Make sure they match.
That's it. Now proceed to Phase 1. 😄