Some failures announce themselves. This one does not. A new EmpoorioChain validator that falls into it looks perfectly healthy — blocks authored, Role: AUTHORITY, no errors — and is completely alone, on a chain of its own, forever. This post explains why, because the official guide used to walk operators straight into it.
What a chain spec is
The chain spec is the file that defines a network's genesis: the initial state, the initial validator set, the runtime code, the bootnodes. Every node on a network must start from the same genesis, because the genesis block's hash is the root of everything that follows. EmpoorioChain's live testnet genesis is:
0xe973931eb0041952249c6a5f6d66537ced5acfe7e1334c44b531ddbbffeae7aa
The raw spec that produces it ships in the repository root as chainspec.raw.json. It is the only file that connects you to the public testnet.
The trap
Substrate nodes have a build-spec subcommand. The previous version of the operator guide said:
empoorio-node build-spec --chain testnet > chainspecs/testnet.json # DO NOT DO THIS
build-spec does not download the network's spec. It constructs a new one from the node's chain-spec module, using whatever keys and parameters the code currently contains. The result has a different genesis hash. A validator started with it:
- authors block 1 of a brand-new chain,
- connects to the real bootnodes,
- is immediately banned by them for
Genesis mismatch, - and shows
0 peersfrom then on — with no message saying the chain spec is wrong.
This was reproduced on 4 September 2026. The operator sees a running validator and an empty peer list, and has no clue which of a dozen things to check.
The check that was broken too
The guide did include a sanity check to run before anything else. It was written as:
empoorio-node --chain chainspec.raw.json --base-path /tmp/prueba --tmp
--base-path and --tmp are mutually exclusive. The binary exits with an argument error before reading the spec. So the check designed to stop operators from starting with the wrong genesis failed every single time it was run — which, in a way, prevented anyone from noticing that the rest of the guide was wrong too. Verified and corrected on 5 September.
The correct check
./target/release/empoorio-node --chain chainspec.raw.json --tmp 2>&1 | head -5
Expected output includes header-hash: 0xe973…e7aa and, within a few seconds, (2 peers). Anything else — Genesis mismatch, a different hash, 0 peers persisting — means you are not on the public testnet. Stop; do not proceed to key generation.
Why the network was relaunched
The current genesis dates from the testnet relaunch of 31 August 2026. Earlier genesis hashes that circulated in documents (one from 25 August) are no longer live; a node started from any of them is on a dead chain. The single source of truth for the live genesis, spec version and endpoints is RED.json in the chain repository, checkable with scripts/verificar_red.py. When a document and RED.json disagree, RED.json wins.
The general lesson
The operator guide was corrected in three places on the same day: this trap, the missing node key requirement, and the broken sanity check. All three were found by doing the guide against the live chain rather than by reading it. Every guide in the chain repository now carries a header stating when it was last verified against a running node and at which spec version. A guide without that header is a guide nobody has run.
Based on VALIDATOR_IN_30_MINUTES.md and chainspecs/testnet/LEEME_CHAINSPEC.md, verified 2026-09-04/05.


