5. Chain identity and chainspec

Draft protocolSource at 169cbd2 ↗Excerpt SHA-256 0e130ea…d85

A chain is defined by one document of pure data, the genesis chainspec, and by the genesis block built from it. This chapter defines chain_id, states what the chainspec commits, fixes the shape of genesis and the way a node installs it, defines the two consensus profiles, and states what a reset creates. Every namespace in the protocol derives from the value this chapter defines, so nothing signed for one chain verifies on another.

5.1 Chain identity

chain_id identifies a chain and is derived from the genesis chainspec:

chain_id = BLAKE3("makechain.chainspec" || canonical(GenesisChainSpec))

Networks are chainspecs, not names, and there is no network enumeration.

R-5.1. The chainspec MUST NOT contain its own chain_id.

R-5.2. Every Makechain consensus, DKG, p2p, command, and settlement-import wrapper namespace derives from chain_id, so a Makechain signature or certificate produced for another chain cannot verify.

An external Tempo certificate retains Tempo's own namespace and trust domain, and the chain-bound import wrapper prevents Makechain-envelope replay. The same external fact may independently satisfy another chain's pinned Tempo profile, under the reset rule of section 5.7.

5.2 What the chainspec commits

The genesis chainspec commits:

Committed Detail
deployment_incarnation_nonce every wipe mints a new chain
genesis_timestamp_ms the declared genesis timestamp
consensus_profile section 5.4
genesis validator committee with its transport directory
exporter roster the identities and transport addresses of the non-voting mesh peers that publish history, namely the active exporter and its standby (chapter 17); a governed parameter (chapter 18)
profile-specific epoch and threshold-identity inputs sections 5.5 and 5.6
genesis release and governance key set
format identifiers of the canonical artifacts
resource limits
price table
command limits
time parameters
consensus parameters leader terms, timeouts, track_historical_votes
membership-log window
settlement bootstrap Tempo chain id, contract and code-control identity, beneficiary-slot derivation, initial threshold identity, checkpoint, and external certificate profile

Other chapters name further chainspec values where they define them, among them the set-once multisig_recovery_factory (chapter 7), the username parameters (chapter 8), and the root-affecting storage parameters (chapter 17).

R-5.3. Genesis contains no credit allocation and no pre-created credit ledger.

5.3 Genesis

Genesis has two parts. The chainspec is pure data and is reproducible from its bytes. The public threshold output and the epoch-zero EpochInfo are carried by the published genesis block, whose hash is published alongside chain_id; the origin of those two artifacts and their binding to the chainspec depend on consensus_profile, as defined in sections 5.5 and 5.6. The light-client trust anchor is therefore chain_id plus the published genesis block, never the chainspec alone. The bounded initial protocol records of the genesis block are defined in the encoding contract.

R-5.4. Genesis construction from the chainspec plus the applicable EpochInfo is deterministic and MUST reproduce the published genesis block exactly.

R-5.5. No parameter depends on an operator environment after genesis.

R-5.6. The genesis block has:

a. height zero; b. an all-zero parent hash; c. epoch zero and view zero; d. the declared genesis timestamp; e. an empty command list; f. the profile's genesis-only epoch artifact.

R-5.7. Genesis creates no user accounts and no credit ledgers.

R-5.8. The native membership and history databases retain their bootstrap commit only, with size one and floor zero, and their genesis targets MUST NOT be produced by an additional empty batch.

R-5.9. On a fresh genesis installation with no selected peer-sync floor, a node seeds the current-state member once, before the execution host opens the members, by applying the deterministic sorted genesis write batch to the native initial target and awaiting its finalize barrier, and never by ordinary block execution.

R-5.10. A node whose reopened current-state member already matches the expected genesis current root and target performs no further genesis work, a reopened member that matches a different target is fatal, and those root and target values are the idempotence marker rather than a separate mutable initialization flag.

R-5.11. A peer-floor or state-sync installation skips preseeding and imports the certified operations instead.

R-5.12. A crash during seeding retries from recovered native initial state, or recognizes the durable genesis target.

Bootstrap handles are dropped before the execution host opens the members (../docs/architecture.md). Genesis and header reproduction and crash-cut vectors must qualify this path (../docs/validation.md).

5.4 Consensus profiles

consensus_profile is a canonical enum with exactly two variants.

Profile Genesis threshold source Epoch and membership lifecycle Permitted deployment
FixedEpochZeroV1 one trusted-dealer test output and seven real shares exactly seven fixed validators; epoch zero only; no bootstrap DKG, reshare, or validator-set transition local/CI and disposable devnet or testnet workload qualification; never production-path qualification or mainnet
DynamicReshareV1 one-shot trustless glue::dkg::bootstrap finite epochs, continuous reshare, governed validator scheduling, and epoch-start activation production-path qualification testnets and mainnet; also later disposable staging networks

Because chain_id covers the whole chainspec, the profile is part of the bytes hashed into it.

R-5.13. Startup, proposal, verification, replay, sync, proof verification, and command validity all dispatch from consensus_profile, and no command-line flag, environment variable, database marker, or other node-local setting selects or overrides it.

INV-CONS-07. Every node derives the consensus profile from the genesis chainspec; no node-local option can change profile validity, committee lifecycle, epoch admission, or block shape.

5.5 FixedEpochZeroV1

Under FixedEpochZeroV1 the chainspec commits the ordered seven-validator identity set and transport directory, the BLS12-381 threshold VRF variant and pre-chain_id namespace inputs, the trusted-dealer public output, the epoch-zero EpochInfo, and fixed epoch length u64::MAX. Observers MAY be verifier-only, and are not committee members.

R-5.14. Participant order is ascending canonical identity public-key bytes.

R-5.15. The trusted-dealer public output MUST:

a. name exactly those seven dealers; b. have total = 7; c. have required = quorum<N3f1>(7) = 5.

R-5.16. The public output in the genesis block MUST equal the chainspec value byte for byte.

R-5.17. Private shares and dealer randomness MUST NOT be chainspec or block fields.

R-5.18. Retired; the procedure is in development profile.

R-5.19. Retired; the procedure is in development profile.

R-5.20. Retired; the procedure is in development profile.

R-5.21. Retired; the procedure is in development profile.

R-5.22. Retired; the procedure is in development profile.

R-5.23. The committed fixed EpochInfo has outcome = Success, epoch = 0, and output.dealers, output.players, players, and next_players all equal to the same ordered seven-member set, with output.revealed empty and a directory that matches exactly that set.

Success describes the usable public fixture, does not assert that a DKG ran, and creates no transcript or certificate. That artifact occupies the genesis-only genesis_epoch_info body field, which is distinct from the optional per-block dkg_outcome field.

R-5.24. dkg_outcome remains None under FixedEpochZeroV1.

R-5.25. FixedEpochZeroV1 uses FixedEpocher::new(NonZeroU64::MAX), whose epoch zero is finite and covers heights 0..=u64::MAX - 1.

R-5.26. Height u64::MAX is rejected, and every node MUST stop before it.

R-5.27. Retired; its content is R-13.9.

R-5.28. Retired; its content is R-13.9.

5.6 DynamicReshareV1

Under DynamicReshareV1 the chainspec instead commits the finite epoch schedule and the bootstrap ceremony inputs, namely the participant set, the namespace, the sharing and reveal modes, the epoch length, the parameters, and the bounds.

R-5.29. The threshold identity is the output of the one-shot trustless bootstrap DKG in which every participant deals and plays, so no single party knows the group secret.

That ceremony's public output and epoch-zero EpochInfo enter the genesis block, and continuous reshare governs later epochs (chapter 13). FixedEpochZeroV1 success does not qualify this ceremony, reshare, membership changes, or production custody.

5.7 Reset

R-5.30. Changing a profile, a fixed committee or any of its members, a fixed directory snapshot, a fixed output, a group key, or an epoch construction is reset-class (chapter 18), never a local reconfiguration and never a release.

R-5.31. A reset creates a fresh deployment_incarnation_nonce, chainspec, chain_id, threshold output and shares, genesis block and hash, storage namespace, consensus journal, and peer namespace, and imports no Makechain state, credits, release or validator schedule, history, certificate, receipt, or proof root.

Artifacts of the pre-reset chain fail the new chain and genesis binding. An mkit content identity or a Tempo proof may remain valid in its own external domain, and confers no new-chain state.

R-5.32. A Tempo proof affects the reset chain only through a new canonical IMPORT_CREDITS envelope that independently passes that chain's complete settlement profile and ordinary strict-advance rules.

5.8 Rationale

This subsection is informative.

Deriving chain_id from the chainspec bytes binds every profile, namespace, domain, and certificate to one genesis definition, so nothing can be replayed across networks and no separate network name can drift from the parameters it stands for. The group public key is a ceremony output rather than a governed continuing-chain value: under DynamicReshareV1 the DKG primitive produces it and keeps it invariant across reshares, while under FixedEpochZeroV1 the chainspec commits the test fixture explicitly. A new key is a new chain, which is the property light clients rely on. Genesis is seeded by a deterministic write batch rather than by ordinary block execution, because executing a block at height zero would append extra log commits and move the committed genesis targets.