Run a Node
Validate
Create a Core Validator

This guide assumes you've completed the Setting Up Your Node step and synced the node using of the provided options.

This guide is design for simplicity and does not cover the intricacies of secure key management. We recommend you follow best practices when it comes to secure key generation and key management. We are unable to offer support outside of the basic setup of a ZetaChain validator.

This guide should be run as the account under which your validator will be running. If you have completed our node setup documentation, the command to switch to that user is:

sudo su -l zetachain

Create a Validator Account

Create the account operator.

Make sure to store the mnemonic from the output in a safe place. You will need this information to later access your account.

zetacored keys add operator --algo secp256k1

Add Funds to the Validator Account

Check your validator account balance. It’s newly created so balances should be empty.

zetacored query bank balances $(zetacored keys show operator -a)

Add funds to your validator account.

Send tokens from your own wallet or from an exchange to your validators address. Make sure you are sending them using the ZetaChain's Cosmos based network, not the ZetaChain's EVM network.

Check your validator account funds balances.

zetacored query bank balances $(zetacored keys show operator -a)

Create Your Validator

Create a new validator by staking azeta tokens. Here is an example of creating a validator on the Zetachain Mainnet Beta network. Save the transaction hash from the output.

First, create and adjust as needed a ~/validator.json file, copying the template below. Be sure to update all fields with appropriate values:

{
	"pubkey": {"@type":"/cosmos.crypto.ed25519.PubKey","key":"EXAMPLE+F405Jcm2vXV+2v4fnjodh6aafuIdeoW+rUw="},
	"amount": "1000000000000000000azeta",
	"moniker": "myvalidator",
	"identity": "validator's (optional) identity signature (ex. UPort or Keybase)",
	"website": "validator's (optional) website",
	"security": "validator's (optional) security contact email",
	"details": "validator's (optional) details",
	"commission-rate": "0.1",
	"commission-max-rate": "0.2",
	"commission-max-change-rate": "0.01",
	"min-self-delegation": "1000000"
}
  • amount is the amount of tokens to be bonded
  • moniker is the validator's name
  • commission-rate is the commission rate on block rewards and fees charged to delegators
  • commission-max-rate is the maximum commission rate that this validator can charge. This parameter is fixed and cannot be changed after the validator is created
  • commission-max-change-rate is the maximum daily increase of the validator commission. This parameter is fixed cannot be changed after the validator is created
  • min-self-delegation is the minimum amount of azeta the validator requires to have bonded at all time. If the validator's self-delegated stake falls below this limit, the validator gets jailed and kicked out of the active validator set
  • When specifying commission parameters, the commission-max-change-rate is used to measure % point change over the commission-rate. E.g. 1% to 2% is a 100% rate increase, but only 1 percentage point
  • min-self-delegation is a strictly positive integer that represents the minimum amount of self-delegated voting power your validator must always have

Next, ensure that you have replaced the validator's pubkey in validator.json with the output from this command: zetacored tendermint show-validator.

Finally, create and execute your validator creation transaction, capturing the txhash from the output.

zetacored tx staking create-validator ~/validator.json \
  --gas=10000000 \
  --gas-prices=10000000000azeta \
  --from=operator

Check Transaction Status

Check the log of the transaction hash that created your validator and make sure there are no errors. If there are errors, your validator creation failed and you will need to troubleshoot it.

zetacored query tx <your transaction hash>

Check Validator Status

To confirm your validator is created, run this command which shows the current status of your validator.

zetacored query staking validator $(zetacored keys show operator --bech val -a)

It’s possible that you don’t have enough azeta tokens to be part of the active set of validators in the beginning. If the status is unbonded status: BOND_STATUS_UNBONDED, you didn’t stake enough tokens amount when you created your validator.

In this case, your validator is not in the active set. It cannot sign blocks and it does not earn rewards. It can however, receive delegations.

To delegate additional tokens to your validator use the following command. Adjust the amount of tokens accordingly to reach the minimum required bonded tokens. Your validator must have enough tokens to be in the top 100 validators by voting power. As of early Q1 2025, this requires a minimum of 700 ZETA.

zetacored tx staking delegate $(zetacored keys show operator --bech val -a) 2000000azeta \
--gas=10000000 --gas-prices=10000000000azeta  --from operator

Once your validator receives sufficient bonded tokens it automatically join the active set and its status is updated to status: BOND_STATUS_BONDED.

Confirm Your Validator is Running

Once your validator is bonded, you can check if it is in the validator set by executing the following command and it should return your validator address.

zetacored query tendermint-validator-set | grep $(zetacored tendermint show-address)

You can also check the validator signing information using the following command and verify that missed_blocks_counter: "0” and index_offset: is increasing.

zetacored query slashing signing-info $(zetacored tendermint show-validator)

Backup Your Validator's Concensus Key

By default, the validator's consensus key exists only on the validator node itself. It is important to maintain a backup of this key to protect yourself from losing control of your validator in the event of unexpected data loss. Please ensure that you create a backup copy of the ~/.zetacored/config/priv_validator_key.json file, and securely save in another location other than the node itself.

Unjail Your Validator

If your validator falls out-of-sync with the chain (downtime), it can be “jailed”. Check your validator status for jailed: true. Once your validator is back in sync with the chain (it is at same block height as the validators in the active set), it can be “unjailed” jailed: false with the following command.

zetacored tx slashing unjail --from=operator

Check the transaction status for any error and confirm that your validator is part of the active set again with the command in the previous section.

Withdrawing Funds

You can withdraw rewards including comissions using this command.

zetacored tx distribution withdraw-rewards --commission [validator_address]

Optionally, you can set up different address to receive your payouts instead of rewards being sent directly to the validator's wallet address.

zetacored tx distribution set-withdraw-addr [withdraw-addr]