A Trust-Minimized Re-Genesis

Changing a chain's block time means halting it and relaunching from the old ledger. We built that migration on a live testbed — and made it so nobody has to trust that the balances carried over honestly.

— how often a chain seals a new block — is one of the few settings baked into that a running chain can’t change after it launches. If you ever did want to change it — say, drop it from two seconds to 500 milliseconds — there’s only one honest way to do it: stop the chain, and start a new one that picks up exactly where the old one left off.

That maneuver has a name — — and it raises a question much scarier than block time. When the new chain boots, everyone’s balances are simply declared in its genesis. So how does anyone know those balances are the real ones? How do you know that whoever ran the migration didn’t quietly add a zero to their own account on the way through?

We built the whole thing on a live testbed and recorded it. This post is how it works — and, more importantly, how it’s built so that you don’t have to trust us to believe it.

Halted at
#100
a final, frozen ledger
State entries
141
every account, carried over
Signed by
2 of 3
validator threshold
Block time
2s → 500ms
the only thing that changed

A 60-second primer

If you already know what a is, skip ahead. If not, five ideas carry the whole post.

  • Genesis is a chain’s first block — block zero. It’s not mined; it’s a file everyone agrees on that declares the starting state (who owns what, what the rules are). Every chain begins from one.
  • State is the ledger: every account and its balance, plus the chain’s settings. It changes with every block.
  • The state root is a single short fingerprint — a hash — of that entire state. Change one balance by one unit and the fingerprint changes completely. Every block header carries the state root, so the chain is constantly committing to “here is the exact ledger right now.”
  • Validators are the known machines that run the network and take turns producing blocks. On a chain this set is small and identified.
  • The authority set is which validators are currently in charge — and, crucially, it’s part of the state. The ledger itself records who the validators are.

Hold onto the third one. The state root is the hinge the whole design turns on.

What re-genesis actually is

Re-genesis is a deliberate, planned restart. You freeze the chain at a chosen block, take a snapshot of its state, and write that state into the genesis of a new chain that runs different rules. The new chain’s block zero is the old chain’s final ledger. Nothing is lost; only the rules change.

  1. 1
    Haltthe chain stops at block #100 — a known, final, frozen ledger
  2. 2
    Snapshotexport every balance, plus the state root — the ledger’s fingerprint
  3. 3
    Sign≥2⁄3 of the validators sign the checkpoint: halt-hash · state-root
  4. 4
    Verifyrecompute the root, check the signatures — tampered state or too few signers → refuse
  5. 5
    Relaunchnew genesis boots from the inherited state at 500 ms — balances carry over exactly
Re-genesis in five stages. The ledger is frozen, snapshotted, signed, verified, and relaunched under new rules — here, a faster block time.

Stages 1, 2, and 5 are mechanical — stop, copy, boot. The entire trust problem lives in stages 3 and 4. Get those right and re-genesis is safe. Skip them and you’ve just asked the world to trust a spreadsheet.

The problem: a snapshot is just a file

Here’s the naive version. Halt the chain, dump the state to a file, paste it into the new genesis, launch. It works perfectly — and it’s completely unsafe.

A snapshot is just a file. Between “export” and “relaunch” it passes through someone’s hands. That someone could open it, change one number, and hand it on. The new chain would boot happily from the altered ledger, because a fresh chain has no memory of what the balances should have been. Everyone would have to simply trust that the file wasn’t touched.

For a chain that’s supposed to remove middlemen, “trust the person who ran the migration” is the wrong answer. So we need two checks: one that makes tampering detectable, and one that makes the honest snapshot authoritative.

Check 1 — the state root catches any tampering

This is where the fingerprint earns its keep. The old chain already committed to its exact ledger: block #100’s header contains the state root. In our run that root was 0xacd8…6fae.

So the new chain doesn’t have to trust the snapshot file. It re-computes the root from the file itself and compares. If the snapshot is honest, the numbers match. If anyone changed even a single balance by a single unit, the recomputed fingerprint is wildly different and the mismatch is obvious.

ledgerAlice1,000Charlie40Bob2502491 unit changedhashBlake2state root0xacd8…6fae0x9a3c…21b0✓ matches✗ mismatchre-hash the snapshot · compare to the committed root
The state root is a fingerprint of the whole ledger. Recompute it from the snapshot and compare to the root the old chain already committed. One changed unit → a completely different root → rejected.

We tested exactly this: take the verified snapshot, flip one byte in one balance, and run it back through. The verifier refuses.

Flip one byte in one balance and the recomputed root no longer matches. The migration is rejected — a tampered ledger can't boot.
Flip one byte in one balance and the recomputed root no longer matches. The migration is rejected — a tampered ledger can't boot.

Notice what this check does not need: it doesn’t need to trust anyone. It’s pure arithmetic. Re-hash, compare. This part is genuinely trustless.

Check 2 — but who says that’s the real root?

Check 1 proves the snapshot matches a root. It doesn’t prove that root is the right one. A dishonest operator could build a fake ledger, hash it, and present a matching fake root. The recompute would pass — it’s internally consistent — it’s just not the real chain.

So the real root has to come from an authority you already trust. On this chain, that authority is the . At the halt, the validators sign a small : the halt block’s hash bound together with its state root. The new chain accepts the root only if enough of them signed it.

How many is enough? The same threshold the chain already runs on: more than two-thirds. That’s not an arbitrary number — it’s the exact honest-majority assumption the chain’s already depends on, block after block. If you trust the chain to produce blocks at all, you already trust two-thirds of its validators to be honest. Re-genesis asks for nothing more.

And the list of which validators count isn’t taken on faith either — remember the lives in the state. So we read the valid signers straight out of the snapshot that Check 1 already proved honest. The two checks lock into each other.

Two of three validators sign; the root recomputes and the signatures clear the two-thirds bar, so the checkpoint verifies. A checkpoint with only one signature is correctly rejected.
Two of three validators sign; the root recomputes and the signatures clear the two-thirds bar, so the checkpoint verifies. A checkpoint with only one signature is correctly rejected.

In our three-validator run, Alice and Bob sign — two of three, which clears the bar. Then we show the failure mode on purpose: a checkpoint carrying only one signature is rejected, because one of three is below two-thirds. The threshold isn’t decoration; it’s enforced.

The run, end to end

With both checks in place, the migration itself is almost anticlimactic — which is the point. Halt the two-second chain at #100 and take the snapshot:

Real transactions run on the two-second chain, then it's halted at block #100 and its 141-entry state is exported with the committed root.
Real transactions run on the two-second chain, then it's halted at block #100 and its 141-entry state is exported with the committed root.

Then build the new genesis from the verified snapshot — same balances, same validators, one changed rule: a 500-millisecond block time. Boot it, and confirm every account arrives with the balance it had at #100.

The new chain boots from the inherited state and seals blocks every 500 ms instead of 2 s. Balances at old #100 match the new chain exactly — the ledger survived, the rules changed.
The new chain boots from the inherited state and seals blocks every 500 ms instead of 2 s. Balances at old #100 match the new chain exactly — the ledger survived, the rules changed.

That’s the full arc: a running chain, stopped, verified, and relaunched under new rules with its ledger provably intact. If you’d rather watch it uncut, the complete recording is here.

So is this trustless?

No — and it’s worth being precise about why, because the honest answer is more useful than a slogan.

Check 1 is trustless. Tampering is caught by arithmetic; no one has to be believed. Check 2 is trust-minimized. Deciding which root is legitimate rests on an honest two-thirds of the validator set. If two-thirds of them colluded, they could sign a false root — but two-thirds colluding could already rewrite the live chain, so re-genesis adds no new trust. It inherits exactly the assumption the chain already makes.

For a permissioned chain, that’s the right bar: the migration is as trustworthy as the chain itself, no more and no less. The word for that is trust-minimized, not trustless — and the difference matters.

  • Validity proofThe sequel
    trust only math

    A zk proof that the new genesis is the correct continuation of the old chain. Even a fully malicious validator set can’t forge it. Genuinely trustless — and the subject of the next post.

  • Signed checkpointThis post
    trust an honest ⅔ of validators

    Recompute the root so the data can’t be tampered with, then require ⅔ of the old validators to sign it. That’s the same honest-supermajority the chain already runs on — no new trust. Trust-minimized.

  • Copy & hopeNaive
    trust whoever ran the migration

    Just carry the state over and relaunch. Anyone handling the snapshot could quietly edit a balance and no one could tell. Too much trust in one party.

What each approach asks you to trust. We shipped the middle rung; the top rung — trusting nothing but math — is the next post.

The frontier: removing trust in our own validators

There’s one rung left to climb. What if you didn’t have to trust the validators at all — not even a two-thirds majority?

That’s what a buys you. Instead of validators attesting that the new genesis correctly continues the old chain, you attach a zero-knowledge proof that it does — a compact piece of cryptography that anyone can check in milliseconds and that not even a fully malicious validator set could forge. The trust in the operators drops to zero; all that remains is trust in the math.

That’s a genuinely harder build, and it’s the subject of the next post. For now, the result stands on its own: we halted a live chain, changed a rule that’s supposed to be unchangeable, and relaunched it with its entire ledger provably carried over — without asking anyone to trust the people who ran the migration.

That’s re-genesis. It’s how a chain can evolve its own rules without ever asking its users for a leap of faith.