The Genesis Block: You Cannot Obtain Ours, and the Hash That Claims to Identify It Is a Hash of Its Name
What a genesis is for
Every chain starts from a state nobody voted on. Who the first validators are, what parameters apply, what balances exist before anything happens.
And it does a second job that matters more than the first: it distinguishes chains. Two networks running identical software are different networks because their genesis differs, and the usual way to say so in one value is a genesis hash.
What ours contains
A small file, about two kilobytes, read on the host:
a chain identifier and a timestamp, dated the nineteenth of May parameters: committee size, quorum threshold, target block time, round timeout, transactions per block a round seed for the leader draw four validators, each with an address and two public keys, plus a declared stake and reputation six initial balance entries and a native unit definition
The parameters are explicit rather than implied, and two of them, the committee size and the quorum, match what the source computes. That agreement is worth having and this page will not overstate how much of the file enjoys it.
You cannot obtain it
The file is on the server and nowhere else.
Three of our own public hosts were probed for it and all three returned nothing: the release host, the endpoint's host, and this surface's own host.
So a reader who wants to know which validators this chain started with, or what its parameters are, cannot look. They can read this page, which is our word for it.
And the genesis hash does not commit to the file
The endpoint reports a genesis hash. It is a thirty-two byte value, and it looks like exactly what you would expect.
It is BLAKE3 of the chain identifier string, and nothing else.
Verified in one command, in a clean directory, against a published library:
hashing the text
solidus-testnet-1reproduces the endpoint's genesis hash character for character
So it commits to the name and not to the contents. Change every validator, every balance, every parameter and the round seed, keep the name, and the reported genesis hash is identical.
Which makes it a restatement rather than an identity
A genesis hash earns its place by being a commitment. It lets you check that the chain you connected to started where you think it started, and it detects a tampered genesis without you having to compare the file field by field.
This one does neither. Anybody can compute it from the name, which means it carries no information the name did not already carry.
The noun promises a commitment and the value is a restatement, and that gap is the whole of this page.
It also compounds a gap at the other end
A transaction's signature on this chain binds no chain identifier, and now the value that claims to identify the chain turns out to be derived from a string.
Neither is dangerous on a network with no value on it. Together they mean the chain-identity story is thin at both ends, and both belong on the list of things to settle before anything on this chain is worth taking.
What would fix it, and it is small
Hash a canonical encoding of the genesis contents instead of the name. The validators, the parameters, the seed, the balances, the timestamp, in a fixed encoding, hashed once.
And publish the file, so a reader can do the same computation independently rather than believing ours.
Neither is a protocol change and one of them is a one-line change. This page is not saying they are scheduled.
What you can check yourself
hash the text of the chain identifier with BLAKE3 and compare it with the
genesis_hashthe endpoint reports
They match. You have now reproduced this chain's genesis hash without ever seeing its genesis, which is the shortest possible demonstration of what the value is worth.
Keep reading
- Safety and Liveness: What This Chain Looked Like It Was Losing, and What It Is Actually Doing
- Finality Here Is Deterministic, and the Wait Is Not Two Rounds. It Is Two Rounds Whenever They Happen
- Fork Choice: The Rule Is the Highest Certificate, and On This Deployment There Is One Database Behind All Four Validators
- The State Root: It Moves When State Moves and Holds When It Does Not, and You Cannot Open It