Installation
Full guide to run a validator node on gno.land topaz testnet.
Quick start: Use the automated setup script —
bash scripts/setup.sh
💢 Auto Install
wget -O setup.sh https://raw.githubusercontent.com/Edsny1/Gnoland-Topaz/Edsny/scripts/setup.sh
chmod +x setup.sh
bash setup.shOr with curl:
curl -o setup.sh https://raw.githubusercontent.com/Edsny1/Gnoland-Topaz/Edsny/scripts/setup.sh
chmod +x setup.sh
bash setup.sh💢 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 |
| Go | 1.22+ | latest |
💢 Manual Setup
💢 1. Install dependencies
sudo apt update && sudo apt install -y git make wget curl zstd pvInstall Go (skip if already installed with version >= 1.22):
GO_VERSION="1.22.4"
wget -q "https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz"
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf "go${GO_VERSION}.linux-amd64.tar.gz"
rm "go${GO_VERSION}.linux-amd64.tar.gz"
echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.bashrc
source ~/.bashrc💢 2. Build binaries
git clone https://github.com/gnolang/gno.git
cd gno && git checkout chain/topaz
make -C gno.land install.gnoland install.gnokeyOr build a Docker image:
docker build --target gnoland -t gnoland:topaz .Or pull prebuilt image:
docker pull ghcr.io/gnolang/gno/gnoland:chain-topazVerify:
gnoland version
gnokey --help💢 3. Download and verify genesis
cd ~/gno
wget -O genesis.json \
https://github.com/gnolang/gno/releases/download/chain/topaz/genesis.json
# Verify SHA256 — must match exactly
shasum -a 256 genesis.json
# expected: 2dd049f973b82858727440df9aff5722cb0b322fd00890f40f2b0688276898ff💢 4. Initialize config and keys
cd ~/gno
gnoland config init
gnoland secrets init💢 5. Configure node
Apply required chain-wide settings:
# Seeds (required — note: topaz uses p2p.seeds, not persistent_peers)
gnoland config set p2p.seeds \
"g19q07ssuafhmg6r7ys7wp7rpc4jxc85cpvdy426@seed-1.topaz.testnets.gno.land:26656,g15k98e65gm8h7fdr3yr4tqn82lvch4a97a3sg3j@seed-2.topaz.testnets.gno.land:26656"
# Chain-wide consensus settings (must match exactly)
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
# Performance
gnoland config set mempool.size 10000
gnoland config set p2p.max_num_outbound_peers 40Set your node-specific values:
gnoland config set moniker "YOUR-NODE-NAME"
gnoland config set p2p.external_address "YOUR-SERVER-IP:26656"
gnoland config set p2p.pex true💢 Using custom ports (17xxx)
If port 26xxx is already in use on your server:
gnoland config set p2p.laddr "tcp://0.0.0.0:17656"
gnoland config set rpc.laddr "tcp://127.0.0.1:17657"
gnoland config set telemetry.prometheus_listen_addr ":17660"Update
p2p.external_addressto match your P2P port.
💢 6. Load snapshot (fast sync)
Skip hours of syncing by using a community snapshot:
# Stop node if running
sudo systemctl stop gnoland 2>/dev/null || pkill -f "gnoland start" 2>/dev/null || true
# Clear old data (keys and config are NOT touched)
rm -rf ~/gno/gnoland-data/db ~/gno/gnoland-data/wal
# Download and extract snapshot
curl -L https://snapshots.luckystar.asia/gnolandtopaz/gnoland_data.tar.zst \
| zstd -d \
| tar -xf - -C ~/gno/gnoland-data💢 7. Create systemd service
sudo tee /etc/systemd/system/gnoland.service > /dev/null <<EOF
[Unit]
Description=Gnoland topaz Node
After=network-online.target
Wants=network-online.target
[Service]
User=$USER
WorkingDirectory=$HOME/gno
Environment=GNOROOT=$HOME/gno
Environment=HOME=$HOME
ExecStart=$(which gnoland) start \
--chainid topaz-1 \
--genesis $HOME/gno/genesis.json \
--skip-genesis-sig-verification
Restart=on-failure
RestartSec=5s
LimitNOFILE=65535
StandardOutput=journal
StandardError=journal
SyslogIdentifier=gnoland
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable gnoland
sudo systemctl start gnolandCheck logs:
sudo journalctl -u gnoland -f💢 8. Check sync status
# Replace 17657 with 26657 if you're using default ports
curl -s http://127.0.0.1:17657/status | python3 -c "
import sys, json
d = json.load(sys.stdin)
info = d['result']['sync_info']
print('Latest block :', info['latest_block_height'])
print('Catching up :', info['catching_up'])
"Wait until catching_up: False before proceeding.
💢 9. Add operator wallet
Create a new wallet:
gnokey add YOUR-KEY-NAMEOr recover from existing mnemonic:
gnokey add YOUR-KEY-NAME --recoverGet your operator address:
gnokey list💢 10. Get testnet GNOT
Visit the faucet and request tokens for your g1... operator address:
https://topaz.testnets.gno.land/faucet
Verify balance:
gnokey query \
-remote "https://rpc.topaz.testnets.gno.land" \
auth/accounts/YOUR-G1-ADDRESS💢 11. Register as validator candidate
Get your consensus public key:
gnoland secrets get validator_key
# Note the gpub1... valueRegister on the valoper realm:
gnokey maketx call \
--pkgpath gno.land/r/gnops/valopers \
--func Register \
--args "YOUR-MONIKER" \
--args "YOUR-DESCRIPTION" \
--args "data-center" \
--args "YOUR-G1-OPERATOR-ADDRESS" \
--args "YOUR-GPUB1-CONSENSUS-PUBKEY" \
--gas-fee 1000000ugnot \
--gas-wanted 50000000 \
--chainid topaz-1 \
--remote https://rpc.topaz.testnets.gno.land \
--broadcast \
YOUR-KEY-NAMENote: Registration only makes you a candidate. A GovDAO member must create and pass a proposal to add you to the active validator set.
💢 12. Update description (optional)
Description limit is 2048 characters. To update after registration:
gnokey maketx call \
--pkgpath "gno.land/r/gnops/valopers" \
--func "UpdateDescription" \
--args "YOUR-G1-OPERATOR-ADDRESS" \
--args "YOUR-NEW-DESCRIPTION" \
--gas-fee 1000000ugnot \
--gas-wanted 50000000 \
--chainid topaz-1 \
--remote https://rpc.topaz.testnets.gno.land \
--broadcast \
YOUR-KEY-NAME💢 Useful commands
# Service management
sudo systemctl start gnoland
sudo systemctl stop gnoland
sudo systemctl restart gnoland
sudo systemctl status gnoland
# Logs
sudo journalctl -u gnoland -f
sudo journalctl -u gnoland --since "1 hour ago"
# Sync status
curl -s http://127.0.0.1:17657/status | python3 -c \
"import sys,json; d=json.load(sys.stdin)['result']['sync_info']; print('Height:', d['latest_block_height'], '| Catching up:', d['catching_up'])"
# Validator key info
gnoland secrets get validator_key
# Wallet list
gnokey list💢 Explorer & resources
💢 Firewall
# P2P — must be open to public
sudo ufw allow 17656/tcp comment "gnoland P2P"
# RPC — open if you serve public endpoints
sudo ufw allow 17657/tcp comment "gnoland RPC"
# Prometheus — restrict to monitoring server only
sudo ufw allow from YOUR-MONITORING-IP to any port 17660