Promote a synced Stable node to an active validator: prepare keys, register with the staking precompile, verify, and self-delegate.
A validator is a synced full node that has registered on-chain and bonded stake. You install and sync the node first, then register it by calling createValidator on the staking precompile (0x0000000000000000000000000000000000000800). This page covers the registration step. For the node itself, see Install a node and Node configuration.
Register only after your node is fully synced. A validator that signs before it has caught up can double-sign and be permanently removed from the set (tombstoned). Set double_sign_check_height = 2 or higher in config.toml before you start (see Node configuration). Setting it to 1 performs no check.
Create the operator account, then read the two values createValidator needs: the consensus public key (base64) and the validator’s EVM address.
# Create the validator operator accountstabled keys add validator# Consensus public key (base64) — save thisstabled comet show-validator | jq .key# Derive the validator's EVM address (0x form)stabled keys parse $(stabled keys show validator -a)
"AbCd...base64PubKey...=="# ...# then, evm address is 0xCAEA59C7476C87D0FF6BE6F04DA207601D5BE7D0
Back up ~/.stabled/config/priv_validator_key.json offline and never run two nodes with the same key. Two instances signing with one key is double-signing and results in a permanent slash.
Call createValidator on the staking precompile. The function takes a description tuple, a commissionRates tuple, the minimum self-delegation, the validator address, the consensus pubkey, and the bonded amount. Encode and send it with cast.
The commission tuple is (rate, maxRate, maxChangeRate), each scaled to 18 decimals. The example sets a 10% rate (100000000000000000), a 20% ceiling, and a 1% maximum daily change. maxRate and maxChangeRate are fixed at creation and cannot be edited later. A successful call emits a CreateValidator event. See the staking precompile reference for every field.