DevelopersSeptember 14, 2026by
EmpoorioChain Core
EmpoorioChain Core

Run an EmpoorioChain Validator in 30 Minutes

This is the onboarding path for an external operator joining the EmpoorioChain public testnet. It was verified end to end against the live chain on 5 September 2026 and, in the process, three mistakes in the previous version of the guide were found — each of which would have stopped a new validator from ever joining. They are called out where they were.

0. Requirements

ResourceTestnet minimumRecommended
CPU4 cores8 cores
RAM16 GB32 GB
Disk500 GB NVMe1 TB NVMe
Network100 Mbps1 Gbps
OSUbuntu LTSUbuntu LTS, unattended security updates

Ports: 30333/tcp p2p (or whichever you choose), 9944/tcp RPC — private or behind a proxy — and 9615/tcp Prometheus metrics, monitoring network only. Avoid shared VPS instances with noisy neighbours for the host that holds authoring keys.

1. Build

Before the first build in a fresh clone:

./scripts/restaurar_sdk_vendorizado.sh
cargo build --release -p empoorio-node

The root Cargo.toml redirects Frontier and four polkadot-sdk crates to a vendored patches/sdk/ directory by path. Those 380 MB are git-ignored, so a clone does not carry them and the build dies with failed to read …/patches/sdk/frontier/…/Cargo.toml. The script rebuilds them from the versioned patches. Run validators only from a reviewed commit or a tagged release.

2. The chain spec — use the file, do not generate it

ls chainspec.raw.json   # in the repository root; this is the live network

Trap #1. The old guide said to run build-spec --chain testnet. That command constructs a new genesis from the code's chain-spec module. A validator started with it does not join the network: it creates its own one-block chain and the real validators ban it for Genesis mismatch — and the only symptom is 0 peers, forever. Confirmed on 4 September.

Check your spec before doing anything else:

./target/release/empoorio-node --chain chainspec.raw.json --tmp 2>&1 | head -5

You must see header-hash: 0xe973…e7aa and, within seconds, (2 peers). If you see Genesis mismatch or 0 peers, stop.

Trap #2. That very check used to be written with --base-path /tmp/x --tmp, which are mutually exclusive: the binary exited with an argument error before ever reading the spec. The check that existed to prevent the wrong genesis failed every time.

3. The node key — not optional

sudo mkdir -p /var/lib/empooriochain/chains/empoorio_public_testnet/network
sudo ./target/release/empoorio-node key generate-node-key \
  --file /var/lib/empooriochain/chains/empoorio_public_testnet/network/secret_ed25519
sudo chown -R empoorio:empoorio /var/lib/empooriochain
sudo chmod 600 /var/lib/empooriochain/chains/empoorio_public_testnet/network/secret_ed25519

Trap #3. With --validator on a chainType: Live spec, Substrate refuses to auto-generate the network key and exits with NetworkKeyNotFound. This is deliberate — a validator's p2p identity must be stable and chosen. Until 5 September the guide did not mention the key at all, and its systemd unit had Restart=always: an indefinite crash loop on first start, on the very page meant to onboard external validators. Save the PeerId the command prints; it is how other nodes identify you.

4. First start

./target/release/empoorio-node \
  --chain chainspec.raw.json \
  --base-path /var/lib/empooriochain \
  --name external-validator-01 \
  --validator \
  --node-key-file /var/lib/empooriochain/chains/empoorio_public_testnet/network/secret_ed25519 \
  --prometheus-external --prometheus-port 9615 \
  --port 30333

Verified: with the key present the node starts as Role: AUTHORITY, shows header-hash: 0xe973…e7aa and (2 peers) in under ten seconds. Keep public RPC disabled unless you have rate limiting, TLS, a firewall and observability.

5. Session keys

curl -s -H 'content-type: application/json' \
  -d '{"id":1,"jsonrpc":"2.0","method":"author_rotateKeys","params":[]}' \
  http://127.0.0.1:9944

Register the returned keys on chain from your stash account — through Eoonia, emp-cli, or a manual extrinsic — then bond DMS and declare validator intent.

6. systemd, monitoring, hygiene

A minimal unit runs the command above as user empoorio with Restart=always, RestartSec=10 and LimitNOFILE=65535. Point Prometheus at port 9615; the repository ships a validator-decentralization Grafana dashboard. Minimum checks: process up, peer count, best and finalized block, missed slots, disk, memory, RPC latency, reward and slash events. Never put seeds in shell history; rotate keys on reinstall, shared credentials, a possibly leaked backup, or unknown sessions.

7. Counting as an external operator

Publish your operator identity, expose metrics privately to the monitoring stack, hold ≥ 99 % uptime over 7 days, run an approved client version, share no infrastructure or keys with another counted operator, and accept the incident playbook. That is what moves the decentralization gate from two validators toward ten.

Based on VALIDATOR_IN_30_MINUTES.md and VALIDATOR_GUIDE.md, verified against the live chain on 2026-09-05.

Share this article