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-1 reproduces 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_hash the 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

The Genesis Block: You Cannot Obtain Ours, and the Hash That Claims to Identify It Is a Hash of Its Name · Solidus