Skip to content

Running a validator

How to join the network as a validator, from an empty machine to a node signing blocks. Every value here was taken from node2, the network's second validator, which was onboarded with exactly this procedure.

Where something must come from the KriptoNyx team, it is marked [obtain from the team].

Before you start

Hardware. The reference node runs comfortably inside a 6 GB memory cap with LimitNOFILE=65535. Budget an SSD — syncing replays every block from genesis and is I/O-bound, not CPU-bound.

Ports. Only one has to be reachable from the internet:

PortPurposeExposure
26656P2P — peers connect herepublic
26657Tendermint RPClocalhost only
8545EVM JSON-RPClocalhost only
9090 / 9091gRPC / gRPC-weblocalhost only
1317Cosmos REST APIdisabled by default

Keep 26657 and 8545 on localhost

A world-readable Tendermint RPC lets anyone query and spam your node. An open JSON-RPC is worse.

You will need the kriptonyxd binary and the network genesis.json[obtain from the team], plus enough KNYX to self-delegate. The commands below use jq, curl and sha256sum.

1. Install the binary

bash
sudo install -m 0755 kriptonyxd /usr/local/bin/kriptonyxd
kriptonyxd version --long | head -5

Verify the checksum against the one the team publishes:

sha256  38de7b0e7e1b2c7140e54623c89e690b268df53a96f30cc20c0b8ba79d3bfc62
size    106 320 592 bytes

Compare the checksum, not the version string

The current build reports empty name, version and commit fields, so kriptonyxd version prints nothing useful and web3_clientVersion returns "Version dev ()".

2. Create a dedicated user

Do not run the node as root.

bash
sudo useradd --system --home /var/lib/kriptonyx --shell /usr/sbin/nologin kriptonyx
sudo mkdir -p /var/lib/kriptonyx
sudo chown kriptonyx:kriptonyx /var/lib/kriptonyx

export KNYX_HOME=/var/lib/kriptonyx/.kriptonyxd
sudo -u kriptonyx kriptonyxd init "<your-moniker>" \
     --chain-id kriptonyx_3009-1 --home "$KNYX_HOME"

init writes a fresh genesis.json that is not the network's. Replace it.

3. Install genesis and verify it

bash
sudo -u kriptonyx cp genesis.json "$KNYX_HOME/config/genesis.json"
sha256sum "$KNYX_HOME/config/genesis.json"
# must be b737d821b535482bb20d6c5e95492c4260e715cccef7ddbd2cdc27d95c52dfdd

If the hash differs, stop

You are about to sync a different chain. Get the correct file.

4. Configure peers and ports

In $KNYX_HOME/config/config.toml:

toml
persistent_peers = "25a97a8b3c96ab2380fdadfecd05d7fd01dec8cd@38.242.149.110:26656"
external_address = "<your-public-ip>:26656"

[rpc]
laddr = "tcp://127.0.0.1:26657"     # localhost only

[p2p]
laddr = "tcp://0.0.0.0:26656"       # must be reachable

external_address must be the address other nodes can dial. Get it wrong and you will sync but no one will peer with you.

In $KNYX_HOME/config/app.toml:

toml
minimum-gas-prices = "0aknyx"

[api]
enable = false                       # Cosmos REST, off by default

[json-rpc]
enable  = true
address = "127.0.0.1:8545"

5. Run it under systemd

/etc/systemd/system/kriptonyx.service:

ini
[Unit]
Description=Kriptonyx Node (<your-moniker>)
After=network-online.target
Wants=network-online.target

[Service]
User=kriptonyx
Group=kriptonyx
ExecStart=/usr/local/bin/kriptonyxd start --home /var/lib/kriptonyx/.kriptonyxd --chain-id kriptonyx_3009-1
Restart=on-failure
RestartSec=5s
LimitNOFILE=65535
MemoryHigh=5G
MemoryMax=6G
OOMScoreAdjust=300
Nice=5
IOSchedulingClass=best-effort
IOSchedulingPriority=6

[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now kriptonyx
journalctl -u kriptonyx -f

6. Wait for the sync to finish

Do not register before this reads false

A validator that is registered but still catching up misses blocks and gets jailed for downtime.

bash
curl -s localhost:26657/status \
  | jq '.result.sync_info | {latest_block_height, catching_up}'
json
{ "latest_block_height": "6177961", "catching_up": false }

node2 replayed from genesis at roughly 20 blocks per second, so expect hours, not minutes, on a chain past six million blocks.

7. Fund the validator key

bash
# add --recover to import an existing mnemonic
sudo -u kriptonyx kriptonyxd keys add validator --home "$KNYX_HOME"
sudo -u kriptonyx kriptonyxd keys show validator -a --home "$KNYX_HOME"

Back up the mnemonic offline, now

It cannot be recovered later.

Send that address enough KNYX for the self-delegation plus gas. Amounts are in aknyx: 9 900 000 KNYX = 9900000000000000000000000aknyx.

8. Register as a validator

bash
sudo -u kriptonyx kriptonyxd tx staking create-validator \
  --home "$KNYX_HOME" \
  --chain-id kriptonyx_3009-1 \
  --moniker "<your-moniker>" \
  --amount 9900000000000000000000000aknyx \
  --pubkey "$(kriptonyxd tendermint show-validator --home "$KNYX_HOME")" \
  --commission-rate 0.10 \
  --commission-max-rate 0.20 \
  --commission-max-change-rate 0.05 \
  --min-self-delegation 1 \
  --gas auto --gas-adjustment 1.4 \
  --from validator

Two values are immutable after registration

--commission-max-rate and --commission-max-change-rate can never be changed. The rate itself can be raised later, but never above the max, and never by more than the max-change in a day. Choose them deliberately.

9. Verify you are actually signing

Being in the validator set is not the same as participating.

In the set, with power:

bash
curl -s localhost:26657/status | jq '.result.validator_info'
json
{ "address": "1DDEA9008CD995B73234CA5BAC84FB596810BC0A", "voting_power": "9900000" }

voting_power: "0" means registered but not bonded — usually insufficient stake to displace an existing validator, or still jailed.

Signing blocks — the check that actually matters:

bash
ADDR=$(curl -s localhost:26657/status | jq -r .result.validator_info.address)
H=$(curl -s localhost:26657/status | jq -r .result.sync_info.latest_block_height)
for i in 0 1 2 3 4; do
  curl -s "localhost:26657/commit?height=$((H-i))" \
    | jq --arg a "$ADDR" '.result.signed_header.commit.signatures
        | map(select(.validator_address==$a and .signature!=null)) | length'
done

Five 1s means you signed the last five blocks. Any 0 means you are in the set but missing blocks — investigate before you are jailed.

Next

See Operating a node for jailing, unbonding, backups and upgrades.

KriptoNyx testnet — chain ID 3009 (kriptonyx_3009-1)