Skip to content

Gno Land Test13 Validator

Gno.land is a platform for writing smart contracts in Gno, a deterministic version of Go, built on top of Tendermint2 consensus. test13 is the current public testnet used to trial the validator set and governance flow ahead of mainnet.

Chain IDBranch
test-13chain/test13
ServiceURL
RPChttps://rpc.test13.testnets.gno.land
Explorerhttps://test13.testnets.gno.land
Faucethttps://test13.testnets.gno.land/faucet
Valopers (candidates)https://test13.testnets.gno.land/r/gnops/valopers
Active Validatorshttps://test13.testnets.gno.land/r/sys/validators/v3
Official Docshttps://docs.gno.land
GitHubhttps://github.com/gnolang/gno

⚠️ NOTE

test13 uses a GovDAO-based validator registration model. Registering on the valoper realm only lists you as a candidate — a GovDAO member still has to create and pass a proposal (via r/sys/validators/v3) before your node joins the active validator set.

Hardware Requirements

ComponentMinimumRecommended
OSUbuntu 22.04+Ubuntu 24.04
CPU4 cores8 cores
RAM8 GB16 GB
Disk200 GB SSD500 GB NVMe SSD
Network100 Mbps1 Gbps

Installation

  1. Install Dependencies
bash
sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y
  1. Install Go

gno.land requires Go 1.22+.

bash
cd $HOME
VER="1.23.0"
wget "https://golang.org/dl/go$VER.linux-amd64.tar.gz"
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "go$VER.linux-amd64.tar.gz"
rm "go$VER.linux-amd64.tar.gz"
[ ! -f ~/.bash_profile ] && touch ~/.bash_profile
echo 'export PATH=/usr/local/go/bin:$HOME/go/bin:$PATH' >> ~/.bash_profile
echo 'export GNOROOT=$HOME/gno' >> ~/.bash_profile
source $HOME/.bash_profile
[ ! -d ~/go/bin ] && mkdir -p ~/go/bin

Verify:

bash
go version
  1. Set Vars

Configuration:

Generated Code:

Loading...
  1. Build Binary

gno.land is built from source per branch — there are no versioned release tarballs like a typical Cosmos chain.

bash
cd $HOME
rm -rf gno
git clone https://github.com/gnolang/gno.git
cd gno
git checkout chain/test13
make -C gno.land install.gnoland install.gnokey

Verify:

bash
gnoland version
gnokey version
  1. Initialize Node
bash
cd $HOME/gno
gnoland config init
gnoland secrets init -data-dir $HOME/gno/gnoland-data/secrets/
  1. Configure Node
bash
gnoland config set rpc.laddr tcp://0.0.0.0:${GNOLAND_PORT}657
gnoland config set p2p.laddr tcp://0.0.0.0:${GNOLAND_PORT}656
gnoland config set proxy_app tcp://127.0.0.1:${GNOLAND_PORT}658
gnoland config set moniker $MONIKER
gnoland config set application.prune_strategy syncable
gnoland config set consensus.timeout_commit 3s
gnoland config set consensus.peer_gossip_sleep_duration 10ms
gnoland config set p2p.flush_throttle_timeout 10ms
gnoland config set mempool.size 10000
gnoland config set p2p.max_num_outbound_peers 40
gnoland config set p2p.external_address "$(wget -qO- eth0.me):${GNOLAND_PORT}656"
gnoland config set p2p.persistent_peers \
  "g142k7zc2qym3c0u6jmkf6rv26llgr2f4nakmlmt@sentry-1.test13.testnets.gno.land:26656,g1lxkf9gn7kddrr26c640ww5wg3ezsm22we8cjpc@sentry-2.test13.testnets.gno.land:26656"

INFO

p2p.persistent_peers and the other chain-wide values above must match exactly across every node on test13 — don't change them. Running a sentry-node setup instead of a standalone node? Follow the sentry architecture guide at gnops.io.

  1. Genesis
bash
mv $HOME/gno/gnoland-data $HOME/gnoland-data
cd $HOME/gnoland-data/config
wget -O genesis.json https://github.com/gnolang/gno/releases/download/chain/test13/genesis.json

Verify the hash — it must match exactly:

bash
shasum -a 256 genesis.json

Expected:

56f56e135174feff9f93283d5ec7e4ec955cd5155108aff5009d4fd51c5adaf2  genesis.json

⚠️ Do not proceed if the hash doesn't match. Re-download the genesis file.

  1. Create Service
bash
sudo tee /etc/systemd/system/gnoland.service > /dev/null <<EOF
[Unit]
Description=Gnoland node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME
Environment=HOME=$HOME
Environment=GNOROOT=$HOME/gno
ExecStart=$(which gnoland) start \
  --chainid test-13 \
  --genesis $HOME/gnoland-data/config/genesis.json \
  --data-dir $HOME/gnoland-data/ \
  --skip-genesis-sig-verification
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

⚠️ --skip-genesis-sig-verification is required — test13's genesis replays historical transactions whose signatures a fresh node can't re-verify, so the node panics on startup without it.

  1. Start Service
bash
sudo systemctl daemon-reload
sudo systemctl enable gnoland
sudo systemctl restart gnoland && sudo journalctl -u gnoland -f --no-hostname -o cat

Check sync status — don't proceed to validator registration until catching_up is false:

bash
curl -s http://localhost:${GNOLAND_PORT}657/status | jq .result.sync_info

Wallet Setup

bash
gnokey add $WALLET

⚠️ CRITICAL: the mnemonic phrase is shown once — save it securely immediately. It cannot be recovered if lost.

Recover an existing wallet instead:

bash
gnokey add $WALLET --recover

List your wallet and grab your g1... address:

bash
gnokey list

Request test GNOT from the faucet: https://test13.testnets.gno.land/faucet

Check balance:

bash
gnokey query \
  -remote "https://rpc.test13.testnets.gno.land" \
  auth/accounts/$(gnokey list | grep "^*" | awk '{print $3}')

Validator Registration

Get your validator consensus public key:

bash
cd $HOME/gnoland-data && gnoland secrets get validator_key

⚠️ Only the pub_key from this output is used for registration. The address shown alongside it is your consensus key address, not your operator address — the operator address is your gnokey list wallet address, and it's the one that must sign the registration transaction.

Register on the valoper realm:

bash
gnokey maketx call \
  --pkgpath gno.land/r/gnops/valopers \
  --func Register \
  --args "$MONIKER" \
  --args "DESCRIPTION" \
  --args "data-center" \
  --args "$(gnokey list | grep "^*" | awk '{print $3}')" \
  --args "VAL_PUBKEY" \
  --gas-fee 1000000ugnot \
  --gas-wanted 50000000 \
  --chainid test-13 \
  --remote https://rpc.test13.testnets.gno.land \
  --broadcast \
  $WALLET
ParameterDescription
$MONIKERpulled from .bash_profile
DESCRIPTIONshort description of your validator (2048 char limit)
data-centeryour infrastructure type: cloud, on-prem, or data-center
VAL_PUBKEYthe pub_key from gnoland secrets get validator_key
$WALLETpulled from .bash_profile

After a successful transaction, view your profile at https://test13.testnets.gno.land/r/gnops/valopers

Update your description later if needed:

bash
gnokey maketx call \
  --pkgpath gno.land/r/gnops/valopers \
  --func UpdateDescription \
  --args "$(gnokey list | grep "^*" | awk '{print $3}')" \
  --args "NEW-DESCRIPTION" \
  --gas-fee 1000000ugnot \
  --gas-wanted 50000000 \
  --chainid test-13 \
  --remote https://rpc.test13.testnets.gno.land \
  --broadcast \
  $WALLET

Registering only lists you as a candidate — a GovDAO member still needs to pass a proposal via r/sys/validators/v3 before your node is added to the active set.

Useful Commands

Service management

bash
sudo systemctl start gnoland
sudo systemctl stop gnoland
sudo systemctl restart gnoland
sudo systemctl status gnoland

Logs & sync

bash
# Live logs
sudo journalctl -u gnoland -f --no-hostname -o cat

# Sync status
curl -s http://localhost:${GNOLAND_PORT}657/status | jq .result.sync_info

# Peer count
curl -s http://localhost:${GNOLAND_PORT}657/net_info | jq .result.n_peers

Node info

bash
# Node ID
cd $HOME/gnoland-data && gnoland secrets get node_id

# Validator key
cd $HOME/gnoland-data && gnoland secrets get validator_key

Send tokens

bash
gnokey maketx send \
  -send "1000000ugnot" \
  -to "RECIPIENT_ADDRESS" \
  -gas-fee 1000000ugnot \
  -gas-wanted 10000000 \
  -broadcast \
  -chainid "test-13" \
  -remote "https://rpc.test13.testnets.gno.land" \
  $WALLET

Updating to a New Chain Branch

gno.land testnets iterate by branch rather than by governance-triggered binary upgrade. When a new testnet (e.g. chain/test14) is announced:

bash
sudo systemctl stop gnoland

cd $HOME/gno
git fetch --all --tags
git checkout chain/test14
make -C gno.land install.gnoland install.gnokey

sudo systemctl restart gnoland
sudo journalctl -u gnoland -f --no-hostname -o cat

🛡️ Security

bash
# P2P — must be public
sudo ufw allow ${GNOLAND_PORT}656/tcp comment 'gnoland P2P'

# RPC — only open if you're serving a public endpoint
sudo ufw allow ${GNOLAND_PORT}657/tcp comment 'gnoland RPC'

🔐 For a more secure and maintainable setup, check out our Essentials Guide, including SSH key setup, Fail2Ban protection, and a full VPS hardening checklist.

Stay Updated