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 ID | Branch |
|---|---|
| test-13 | chain/test13 |
| Service | URL |
|---|---|
| RPC | https://rpc.test13.testnets.gno.land |
| Explorer | https://test13.testnets.gno.land |
| Faucet | https://test13.testnets.gno.land/faucet |
| Valopers (candidates) | https://test13.testnets.gno.land/r/gnops/valopers |
| Active Validators | https://test13.testnets.gno.land/r/sys/validators/v3 |
| Official Docs | https://docs.gno.land |
| GitHub | https://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
| Component | Minimum | Recommended |
|---|---|---|
| OS | Ubuntu 22.04+ | Ubuntu 24.04 |
| CPU | 4 cores | 8 cores |
| RAM | 8 GB | 16 GB |
| Disk | 200 GB SSD | 500 GB NVMe SSD |
| Network | 100 Mbps | 1 Gbps |
Installation
- Install Dependencies
sudo apt update && sudo apt upgrade -y
sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y- Install Go
gno.land requires Go 1.22+.
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/binVerify:
go version- Set Vars
Configuration:
Generated Code:
Loading...- Build Binary
gno.land is built from source per branch — there are no versioned release tarballs like a typical Cosmos chain.
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.gnokeyVerify:
gnoland version
gnokey version- Initialize Node
cd $HOME/gno
gnoland config init
gnoland secrets init -data-dir $HOME/gno/gnoland-data/secrets/- Configure Node
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.
- Genesis
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.jsonVerify the hash — it must match exactly:
shasum -a 256 genesis.jsonExpected:
56f56e135174feff9f93283d5ec7e4ec955cd5155108aff5009d4fd51c5adaf2 genesis.json⚠️ Do not proceed if the hash doesn't match. Re-download the genesis file.
- Create Service
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-verificationis required — test13's genesis replays historical transactions whose signatures a fresh node can't re-verify, so the node panics on startup without it.
- Start Service
sudo systemctl daemon-reload
sudo systemctl enable gnoland
sudo systemctl restart gnoland && sudo journalctl -u gnoland -f --no-hostname -o catCheck sync status — don't proceed to validator registration until catching_up is false:
curl -s http://localhost:${GNOLAND_PORT}657/status | jq .result.sync_infoWallet Setup
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:
gnokey add $WALLET --recoverList your wallet and grab your g1... address:
gnokey listRequest test GNOT from the faucet: https://test13.testnets.gno.land/faucet
Check balance:
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:
cd $HOME/gnoland-data && gnoland secrets get validator_key⚠️ Only the
pub_keyfrom this output is used for registration. Theaddressshown alongside it is your consensus key address, not your operator address — the operator address is yourgnokey listwallet address, and it's the one that must sign the registration transaction.
Register on the valoper realm:
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| Parameter | Description |
|---|---|
$MONIKER | pulled from .bash_profile |
DESCRIPTION | short description of your validator (2048 char limit) |
data-center | your infrastructure type: cloud, on-prem, or data-center |
VAL_PUBKEY | the pub_key from gnoland secrets get validator_key |
$WALLET | pulled 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:
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 \
$WALLETRegistering 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
sudo systemctl start gnoland
sudo systemctl stop gnoland
sudo systemctl restart gnoland
sudo systemctl status gnolandLogs & sync
# 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_peersNode info
# Node ID
cd $HOME/gnoland-data && gnoland secrets get node_id
# Validator key
cd $HOME/gnoland-data && gnoland secrets get validator_keySend tokens
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" \
$WALLETUpdating 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:
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
# 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
- Discord: Gnoland Discord
- GitHub: gnolang/gno
- Official Docs: docs.gno.land
- Explorer: test13.testnets.gno.land
