Owners: @David Rusu @Hong-Sheng Zhou
Reviewers: 🟢@Thomas Lavaur 🟢@Giacomo Pasini 🟢@Marcin Pawlowski 🟢@Mehmet 🟨@Álvaro Castro-Castilla 🟢@Daniel Sanchez Quiros
The Genesis Block defines the starting state for the Bedrock chain, including the initial bedrock service providers, NMO token distribution and protocol parameters. Its design draws from best practices in the Ouroboros family of protocols (notably Praos and Genesis), as well as privacy and resilience advances from Cryptarchia and related research. The Genesis Block is the root of trust for all subsequent protocol operations and must be constructed in a way that is deterministic, verifiable, and robust against long-range or bootstrap attacks.
The Genesis Block establishes the initializing values for the various protocols and services. This includes the initial token distribution, initial nodes participating in Blend Network and the DA network and the result of running the epoch nonce ceremony.
The block body is a single Mantle Transaction containing a Ledger Transaction distributing the notes to initial token holders. The bedrock services are initialized through SDP_DECLARE
Operations embedded in the Mantle Transaction’s Operations list and protocol initializing constants are encoded through a CHANNEL_INSCRIBE
Operation also embedded in the Operations list.
Not all protocol constants are encoded in the genesis block, the principle we use to decide whether a value is in the genesis block or not is whether it is a value that is derived from blockchain activity or whether its updated through a protocol update (hard / soft fork). For example, epoch nonce is updated through normal blockchain Operations and therefore it should be specified in the genesis block. Gas constants are only changed through protocol updates and hard forks and therefore they will be hardcoded in the node implementation.
The Genesis Block is composed of the Genesis Block Header and the Genesis Mantle Transaction (there is a single transaction in the genesis block). The Mantle Transaction contains all information necessary for initializing Bedrock services and Cryptarchia state, as well as distributing the initial tokens to stakeholders.
Initial tokens will be distributed through a Ledger Transaction containing zero inputs and one output note for each initial stakeholder. Note that since the Ledger is transparent, the initial stake allocation is visible to everyone, those wishing to hide their initial stake may opt to subdivide their note into a few different notes of an equal value.
In order to participate in the Cryptarchia lottery, stakeholders must generate their note keys in accordance with the Proof of Leadership protocol specified at Protocol.
The initial state of the Ledger will be derived through normal execution of this Ledger Transaction, that is, each output’s note ID will be added to the unspent notes set.
Example
STAKE_DISTRIBUTION_TX = LedgerTx(
inputs=[],
outputs=[
Note(value=1000, public_key=STAKE_HOLDER_0_PK),
Note(value=2000, public_key=STAKE_HOLDER_1_PK),
Note(value=1500, public_key=STAKE_HOLDER_2_PK),
# ...
]
)
Data Availability and Blend Network MUST initialize their set of providers. This is done through a set of SDP_DECLARE
Operations in the genesis Mantle Transaction.
There must be at least 40 declarations for DA, and at least 40 declarations for Blend in order for the DA and Blend to be active. The choice of 40 declarations for Blend is done somewhat arbitrarily, we will have at least 40 initial nodes servicing DA, we plan to have them contribute to Blend Network as well.
Example