Running a
Sunima Chain Validator
This guide walks you through setting up a full validator node on the Sunima Chain testnet — a sovereign Cosmos SDK + CometBFT chain. Validators propose and sign blocks, earn staking rewards, and form the decentralised foundation of the network.
curl -fsSL https://sunima.uk/install/operator.sh | ROLE=cpu bash
curl -fsSL https://sunima.uk/install/kit-update.sh | sudo bash -s -- --install
1. What your node does
A Sunima Chain validator node runs the full Cosmos SDK application state machine and the CometBFT consensus engine. It:
- Receives and validates transactions from the mempool
- Participates in BFT consensus rounds — proposing and pre-voting blocks
- Signs committed blocks with its consensus key (ed25519)
- Earns staking rewards proportional to bonded stake
A BFT chain needs at least four validators to tolerate one Byzantine fault. With a healthy multi-validator set the chain keeps producing blocks even if some validators go offline.
2. System requirements
Sunima has three node tiers. Each plays a different role and has different hardware needs.
Tier 1 — Validator
Participates in BFT consensus. Proposes and signs blocks (ed25519 — pure CPU work, no GPU needed). Runs the CURARE rule-based runtime sensor alongside the chain daemon. This is the role that secures the network.
| Component | Minimum | Recommended |
|---|---|---|
| OS | Ubuntu 22.04 LTS x86-64 | Ubuntu 24.04 LTS x86-64 |
| CPU | 16 cores | 24+ cores |
| RAM | 32 GB | 64+ GB |
| Disk | 1 TB NVMe SSD | 2 TB NVMe SSD |
| Network | 100 Mbit, static public IP, outbound TCP 26656 | 1 Gbit, dedicated |
| GPU | Not required | |
| Reference class | Dedicated-CPU VPS (~€45/mo) | Dedicated-CPU or bare-metal (~€60-90/mo) |
Tier 2 — GPU Worker (intake closed)
Performs encrypted computation off-chain and signs attestations. Not part of consensus. These workers are protocol-operated and are not currently a paid role: the gas-fee split pays burn, the validator set, and the protocol treasury — it has no compute channel, so accelerator hardware earns no fee income on this network. We are not asking anyone to buy a card against revenue that does not exist, so this tier is not open for applications. Tier 1 below is open and needs no GPU.
Tier 3 — RPC / Full Node
Serves API requests (read-only queries: balances, history, staking info). Keeps a full copy of chain history. Not a validator — does not participate in consensus, does not sign blocks, no stake required. Useful for integrators (wallets, exchanges, block explorers) and the wider community.
| Component | Minimum | Recommended |
|---|---|---|
| OS | Ubuntu 22.04 LTS x86-64 / arm64, macOS (Apple Silicon), Windows WSL2 | Ubuntu 24.04 LTS |
| CPU | 8 cores | 12+ cores |
| RAM | 16 GB | 32 GB |
| Disk | 500 GB SSD | 1 TB NVMe SSD (chain history grows ~1 GB/day at 1M users) |
| Network | 100 Mbit | 1 Gbit |
| GPU | Not required | |
Tier comparison: Tier 1 (Validator) is the only tier with stake, slashing, and staking rewards — and the only tier the gas-fee split pays. Tier 2 (GPU Worker) is protocol-operated and earns nothing from fees; intake is closed. Tier 3 (RPC) operates on volunteer or service-provider basis (no native rewards). On testnet all tokens are non-transferable test tokens with no monetary value.
3. Downloads
The installer above does all of this for you. The steps below are for a manual setup.
| Platform | Binary | SHA-256 |
|---|---|---|
| Linux x86-64 | sunimad-linux-amd64 | .sha256 |
| macOS Apple Silicon (M1/M2/M3/M4) | sunimad-darwin-arm64 | .sha256 |
| Windows | Use WSL2 and the Linux x86-64 binary | |
curl -LO https://sunima.uk/chain/sunimad-linux-amd64 curl -LO https://sunima.uk/chain/sunimad-linux-amd64.sha256 sha256sum -c sunimad-linux-amd64.sha256 curl -LO https://sunima.uk/chain/genesis.json
The binary links the privacy-core library libkzg_ffi.so (macOS: libkzg_ffi.dylib). Put it in /usr/local/lib and run ldconfig.
Signed releases
Every network upgrade ships as a signed release: https://sunima.uk/chain/upgrades/<name>/manifest.json lists the sha256 of each file, and manifest.json.sig is its Ed25519 signature by the Sunima release key:
-----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAhiLCLBA8nfNEqO/ui0d+avp8TrtyN8fCYg5vOkP6JJQ= -----END PUBLIC KEY-----
# save the key above as release.pub.pem, then (OpenSSL 3): openssl pkeyutl -verify -pubin -inkey release.pub.pem -rawin \ -in manifest.json -sigfile manifest.json.sig
4. Initialise
Replace my-validator with your preferred moniker (display name).
chmod +x sunimad-linux-amd64 && mv sunimad-linux-amd64 sunimad ./sunimad init my-validator --chain-id sunima_8081-2 cp genesis.json ~/.sunima/config/genesis.json
~/.sunima/ — not ~/.sunimad/.
5. Configure
Peer — ~/.sunima/config/config.toml
SEED="[email protected]:26656" sed -i "s|^persistent_peers = .*|persistent_peers = \"$SEED\"|" ~/.sunima/config/config.toml
The current peer list is always at /install/peers.txt.
State sync
A new node joins from a recent snapshot, not from genesis (replaying from block 1 is not supported):
RPC=https://sunima.uk/chain-rpc H=$(curl -s $RPC/block | python3 -c "import json,sys;print(int(json.load(sys.stdin)['result']['block']['header']['height'])//1000*1000-2000)") HASH=$(curl -s "$RPC/block?height=$H" | python3 -c "import json,sys;print(json.load(sys.stdin)['result']['block_id']['hash'])") C=~/.sunima/config/config.toml sed -i "/^\[statesync\]/,/^\[/ s|^enable = .*|enable = true|" $C sed -i "s|^rpc_servers = .*|rpc_servers = \"https://sunima.uk:443/chain-rpc/,https://sunima.uk:443/chain-rpc/\"|" $C sed -i "s|^trust_height = .*|trust_height = $H|; s|^trust_hash = .*|trust_hash = \"$HASH\"|" $C
6. Start the node
Run it under Cosmovisor:
export DAEMON_NAME=sunimad DAEMON_HOME=~/.sunima export DAEMON_ALLOW_DOWNLOAD_BINARIES=false UNSAFE_SKIP_BACKUP=true cosmovisor init ./sunimad cosmovisor run start --minimum-gas-prices=1000000000asuna
Cosmovisor on its own does not switch Sunima nodes at an upgrade height (it cannot read the node's height through the binary's startup warning). The switch is done by sunima-upgrade-switch: when the node halts at the upgrade height it checks the staged binary against the signed release manifest, points cosmovisor/current at it and restarts the node. The installer sets it up, together with a 10-minute timer that stages each scheduled upgrade into ~/.sunima/cosmovisor/upgrades/<name>/bin/sunimad ahead of time. On a node set up by hand, or by an older installer, run once:
curl -fsSL https://sunima.uk/install/kit-update.sh | sudo bash -s -- --install
sunima-node-run) passes --consensus.double_sign_check_height=0 only for the restart at an upgrade halt. Without it, a value above 0 in config.toml makes the node refuse to sign while the chain waits.
Wait until catching_up is false before you bond:
curl -s http://localhost:26657/status | python3 -m json.tool | grep -E "latest_block_height|catching_up"
7. Become a validator
The installer script handles the entire validator lifecycle automatically: it downloads the binary and native library, installs genesis and the confidential-layer artifacts, seeds peers, creates your account key, requests a starter stake from the on-chain faucet, registers the operator, submits create-validator, and starts the node in the background.
curl -fsSL https://sunima.uk/install/operator.sh | ROLE=cpu bash
The script prints your sunima1… address and a 24-word mnemonic when done.
7a. Starter stake — automatic
The installer requests your starter stake from the on-chain faucet automatically and waits for it to confirm before bonding. No manual request is needed. The faucet is rate-limited per network address.
7b. Manual create-validator (advanced)
The installer already submits this for you. If you configured the node by hand and want to bond manually, run (replace my-key with the key name you chose):
./sunimad tx staking create-validator validator.json \ --from=my-key \ --keyring-backend=test \ --chain-id=sunima_8081-2 \ --node=http://localhost:26657 \ --gas=300000 \ --gas-prices=2000000000asuna \ --yes
validator.json automatically with the correct key type. If you edit it manually, use ./sunimad comet show-validator — not keys show.
After one block your validator appears on the Network page with status Bonded.
8. Monitoring
Check your node's sync status and peer count via the local RPC:
# Sync status curl -s http://localhost:26657/status | python3 -m json.tool | grep -E "latest_block_height|catching_up" # Peer count curl -s http://localhost:26657/net_info | python3 -m json.tool | grep n_peers
The live network dashboard shows all bonded validators, block height, and stake in real time:
9. Troubleshooting
| Error | Cause | Fix |
|---|---|---|
Node stops at the upgrade height and stays there (UPGRADE "…" NEEDED in the log) | Upgrade switch not installed — cosmovisor alone does not switch | Run curl -fsSL https://sunima.uk/install/kit-update.sh | sudo bash -s -- --install. It switches the halted node within seconds. By hand: systemctl stop sunima-node; ln -sfn upgrades/<name> ~/.sunima/cosmovisor/current; systemctl start sunima-node |
failed to initialize database: resource temporarily unavailable |
Another sunimad process is already running and holds the DB lock | Run sudo pkill -f sunimad, delete any stale lock files with find ~/.sunima/data -name LOCK -delete, then restart |
auth failure: secret conn failed |
Connecting from the same external IP as another validator (NAT) | Add allow_duplicate_ip = true under [p2p] in the seed node's config.toml and restart it |
validator pubkey type is not supported |
Used the account key (secp256k1) instead of the consensus key (ed25519) in validator.json | Replace pubkey with the output of ./sunimad comet show-validator |
persistent_peers not connecting (timeout) |
Port 26656 blocked by firewall | Allow outbound TCP 26656 in your firewall / router. On Linux: ufw allow 26656/tcp |
| genesis.json path error on curl | Wrong home directory path (~/.sunimad vs ~/.sunima) |
The home directory is ~/.sunima/ (no trailing 'd'). Use ~/.sunima/config/genesis.json |