Yamale docs ← back to the site

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 with code: 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.