Run a validator
How to join the set of nodes that produce blocks on Yamale — which, unlike most chains, requires a vote first.
You need: a Linux host, the blockchaind binary, and enough YML to
self-bond. Every command below was run against a real node.
You will end with: an approved candidacy and a bonded validator.
Why there is an approval step
On a permissionless chain, anyone with enough stake validates. Yamale is permissioned: the token is a payments instrument for institutions that have to know who is processing their transactions, so the validator set is a decision the chain makes rather than an auction it runs.
That decision lives in x/validatorgov. Its enforcement is not advisory — an
unapproved account's create-validator transaction is rejected before it is
even processed, by the ante handler.
One exception: the gate does not apply at genesis. That is what makes the founding ceremony possible — the initial validators are established by the genesis file itself, not by voting. See the deployment runbook.
1. Sync a node first
Before applying, run a full node and let it catch up. You are asking to be trusted with block production; having demonstrably kept up is the argument.
blockchaind init <your-moniker> --chain-id yamale-testnet-1 --default-denom uyml
Replace ~/.blockchain/config/genesis.json with the network's genesis, set
persistent_peers in config.toml to existing nodes, and start it. Confirm
catching_up has gone false:
blockchaind status
2. Apply
blockchaind tx validatorgov apply-validator "Carol Node" "carol@example.org" \
--from carol --chain-id yamale-testnet-1 --keyring-backend file --fees 500uyml --yes
A moniker and a way to reach you. Put something real in the second field — it is how governance asks you questions before voting.
blockchaind query validatorgov list-validator-application
validator_application:
- candidate: yml1yu77rjnwumn4kr9jhezshhddujj2cugzy5ffwp
status: pending
3. Governance decides
Somebody with a stake submits MsgApproveValidator, which only the governance
module account may sign:
{
"messages": [{
"@type": "/blockchain.validatorgov.v1.MsgApproveValidator",
"authority": "yml10d07y265gmmuvt4z0w9aw880jnsr700jrghjur",
"candidate": "yml1yu77rjnwumn4kr9jhezshhddujj2cugzy5ffwp",
"approve": true
}],
"metadata": "",
"deposit": "10000000uyml",
"title": "Admit Carol Node as a validator",
"summary": "Carol Node has run a full node for three months without a missed block."
}
Get the authority value from blockchaind query auth module-account gov — it
is the gov module's address, not yours.
blockchaind tx gov submit-proposal proposal.json \
--from alice --chain-id yamale-testnet-1 --keyring-backend file \
--gas 400000 --fees 500uyml --yes
--gas 400000: the 200,000 default is not enough for a proposal carrying a message, and it fails withcode: 11, out of gas.
After the voting period:
blockchaind query validatorgov list-approved-validator
approved_validator:
- approved: "true"
candidate: yml1yu77rjnwumn4kr9jhezshhddujj2cugzy5ffwp
4. Create the validator
Now the standard staking transaction works. Write the description to a file:
{
"pubkey": {"@type":"/cosmos.crypto.ed25519.PubKey","key":"<from `blockchaind comet show-validator`>"},
"amount": "100000000000uyml",
"moniker": "Carol Node",
"commission-rate": "0.10",
"commission-max-rate": "0.20",
"commission-max-change-rate": "0.01",
"min-self-delegation": "1"
}
blockchaind tx staking create-validator validator.json \
--from carol --chain-id yamale-testnet-1 --keyring-backend file --fees 500uyml --yes
Confirm you are bonded:
blockchaind query staking validators --output json | grep -c BOND_STATUS_BONDED
Or run the network's own health check, which also confirms every node agrees on the same block:
./scripts/testnet/07-verify.sh http://<peer1>:26657 http://<peer2>:26657
5. Feed prices
This is not optional in practice. x/oracle needs a majority of stake to
report, so on a small validator set a couple of non-participating validators
leave the chain with no prices at all — measured on a three-validator network,
one reporter of three agrees nothing, two agree a rate.
Delegate to a hot key so the operator key stays offline, then submit once per vote period:
blockchaind tx oracle delegate-feeder <your-valoper-address> <feeder-address> \
--from carol --chain-id yamale-testnet-1 --keyring-backend file --fees 500uyml --yes
See Price feeds and asset valuations for the whole picture.
Things worth knowing
Keep the operator key offline. It is the key that can move your stake and change your commission. The feeder delegation above exists so that voting on prices — the thing you must do every minute — does not require it.
Losing your node stops more than your rewards. With three equal validators
the network tolerates no failures; a fourth would let it survive one. Run under
systemd with Restart=always, as the runbook
does.
Your reliability is on the chain. blockchaind query oracle misses shows
how many vote periods each validator failed to report in. Nothing is slashed for
it — the record is the consequence.
Full reference: x/validatorgov — every message, query, parameter and error code, generated from the source.