Run a testnet validator
Public testnet: chain 6913 (0x1b01), RPC https://testnet-rpc.boing.network/, explorer boing.observer.
boing validator register). You join the set at the next epoch (every 100 blocks) and muststay online: missing more than 10% of your scheduled proposals jails you (bond kept; unjail after a cooldown). No operator approval and no 10,000 BOING stake are needed. Details inOpen validator registration.1. Hardware and network
- Minimum: 2 vCPU (x86_64 or arm64), 2 GB RAM, 10 GB SSD.
- Recommended: 4 vCPU, 4 GB RAM, 50 GB SSD, static public IPv4.
- Inbound TCP 4001 (P2P) must be reachable. RPC 8545 only needs to be public if you serve RPC to others.
2. Get the node
Binary (Linux x86_64, macOS arm64, Windows x86_64) from the testnet-v0.1.12 release; the zip contains boing-node and the boing CLI.
curl -LO https://github.com/Boing-Network/boing.network/releases/download/testnet-v0.1.12/release-linux-x86_64.zip
unzip release-linux-x86_64.zip && chmod +x boing-node boing
./boing-node --versionDocker (build from source):
git clone https://github.com/Boing-Network/boing.network && cd boing.network
git checkout testnet-v0.1.12
docker build -t boing-node .3. Keys
- Open Boing Express and Create wallet (or import a key) on Boing Testnet. Use a dedicated key for the validator.
- This wallet is the validator owner: it pays and holds the 100 BOING bond and signs register / deregister / unjail / claim.
- Create a separate node key (
BOING_VALIDATOR_KEY, 32-byte hex): use Generate a new node key in the Validate tab (generated locally, never sent anywhere). Keep it in a file only you can read; never paste it into chat, a repo or shell history.
4. Fund the bond
Registering locks a 100 BOING bond; keep a few BOING extra for fees (about 1 BOING per transaction). The faucet sends 20 BOING per request, once a minute, so a few requests cover the bond. Stuck or want help? Reach out with your AccountId and node multiaddr (/ip4/<public-ip>/tcp/4001):
- Email: [email protected]
- Discord: https://discord.gg/boing (operators channel)
- Also register as an operator so your node shows on the leaderboard.
5. Sync from the testnet bootnodes
Official bootnodes (see Bootnodes):
/ip4/169.155.48.188/tcp/4001
/ip4/109.105.220.118/tcp/4001Binary:
export BOING_CHAIN_ID=6913
./boing-node \
--data-dir ./boing-data \
--p2p-listen /ip4/0.0.0.0/tcp/4001 \
--bootnodes /ip4/169.155.48.188/tcp/4001,/ip4/109.105.220.118/tcp/4001 \
--rpc-port 8545Docker:
docker run -d --name boing-node --restart unless-stopped \
-p 4001:4001 -p 127.0.0.1:8545:8545 \
-v boing-data:/data \
-e BOING_CHAIN_ID=6913 \
-e BOING_BOOTNODES=/ip4/169.155.48.188/tcp/4001,/ip4/109.105.220.118/tcp/4001 \
boing-nodeYour node is synced when boing_health reports the same head_height as the public RPC.
6. Register
From Boing Express → Validate with the owner wallet (or boing validator register --node-key-hex <node key>):
- Unlock the owner wallet on Boing Testnet and open the Validate tab.
- Paste your node key (or generate one), check the node id, then Register validator (100 BOING bond).
- Your validator shows as pending and joins at the next epoch. The tab shows its status, uptime, missed blocks, bond and jail stats.
To leave: Deregister; the bond unlocks after about 100 blocks, then Claim unbond. Jailed? Unjail after the cooldown.
7. Run as a validator
Run with the validator flags and the open-mode settings used by the public nodes (key in an env file, not on the command line). Have it synced and running before your registration's epoch boundary:
# validator.env (chmod 600; never commit or share)
BOING_CHAIN_ID=6913
BOING_VALIDATOR_SET=open
BOING_OPEN_VALIDATOR_ACTIVATION_HEIGHT=400
BOING_VALIDATOR_KEY=<32-byte node key hex>
set -a; . ./validator.env; set +a
./boing-node --validator --data-dir ./boing-data \
--p2p-listen /ip4/0.0.0.0/tcp/4001 \
--bootnodes /ip4/169.155.48.188/tcp/4001,/ip4/109.105.220.118/tcp/4001 \
--rpc-port 8545Docker: add --env-file validator.env -e BOING_VALIDATOR=1.
8. Monitoring
curl -fsS http://127.0.0.1:8545/live
curl -s -X POST http://127.0.0.1:8545 -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"boing_health","params":[]}'Watch that head_height keeps pace with the public RPC, you have at least one peer, and disk has room. Run under a supervisor (systemd Restart=always or Docker --restart unless-stopped) and alert when /live fails.
Open validator registration
Live on testnet since block 400. Run your node with BOING_VALIDATOR_SET=open and BOING_OPEN_VALIDATOR_ACTIVATION_HEIGHT=400 (the same values as the public nodes), then register from the CLI or the boing.express Validate tab:
- Register:
boing validator register --node-key-hex <node seed>locks a 100 BOING bond. Your node key signs a proof that binds it to your account. One validator per account. - Join: at the next epoch boundary (every 100 blocks), up to a capped set size, in deterministic order.
- Liveness: miss more than 10% of your scheduled proposals over the last 1,000 produced blocks and you're jailed at the next boundary. Idle periods never count. Your bond is kept; after a cooldown run
boing validator unjail. - Leave:
boing validator deregister; the bond unlocks after 100 blocks (claim withClaimUnbond). - Status:
boing validator statusor RPCboing_getValidators: status, uptime %, missed count and bond. - Anchors: the permanent bootstrap validators keep the chain producing even if every open validator is offline.
Future: stake-based validator set (not active)
The node also implements a stake-weighted mode that may be enabled later at an announced activation height. It is not active: today validators join through open registration (100 BOING bond, above). If it is ever enabled:
- Joining: every 100 committed blocks (epoch boundary) all nodes recompute the set from chain state: accounts with at least 10,000 BOING bonded, highest stake first (ties by AccountId), top 21. Qualify and you join at the next boundary, so have your node synced and running with
BOING_VALIDATOR=1before then. - Leaving: unbonding lowers active stake immediately; below 10,000 BOING (or outside the top 21) you leave at the next boundary.
- Deterministic and persistent: every node derives the same set; it is saved as
stake_validator_set.jsonin the data directory and restored on restart. - Bootstrap fallback: if nobody qualifies, the static bootstrap list is used, so the chain never runs with an empty set.
- Flags (identical on all nodes):
BOING_VALIDATOR_SET=stakeandBOING_STAKE_VALIDATOR_ACTIVATION_HEIGHT. Wait for the announcement; don't enable stake mode early.
Stopping? Keep your node online until the boundary after your unbond has removed you.
9. Duties
- Keep the node online and in sync; missed rounds hurt the network and your leaderboard standing.
- Upgrade promptly when a new
testnet-v*release is announced; consensus changes are coordinated in an announced window. - Protect the validator key and report a suspected compromise immediately.
- Keep TCP 4001 reachable so other nodes can peer with you.
- This is a testnet: BOING has no monetary value and the chain may be reset.
Full guide in the repo: docs/TESTNET-VALIDATOR-GUIDE.md.
