Gno.land Sapphire
Manual node installation
Official operator documentationProject websiteSource repositoryExplorer
Network: Testnet
Chain ID: sapphire-1
Guide review: 2026-08-12 ยท 5 source references
Go version: 1.25.9+
The guide was reviewed against current project metadata and official operator documentation. Hosted BonyNode infrastructure is not implied; confirm the selected release and network parameters before using a production host.
Sapphire uses a fresh testnet state and does not carry state from the retired network. This guide pins the reviewed chain/sapphire release commit and verifies the official genesis hash; check the official validator notes again before installing after a network upgrade.
Prerequisites from project metadata
sudo apt-get update
sudo apt-get install -y curl ca-certificates git make build-essential jqReviewed project installation steps
1. Fetch and verify the pinned Sapphire source commit
set -euo pipefail
SOURCE_DIR="$HOME/gno-sapphire-9ab5198"
EXPECTED_COMMIT=9ab5198acac68016341655c82290ecaff5591edb
test ! -e "$SOURCE_DIR" || { echo "Stop: $SOURCE_DIR already exists; review it before continuing." >&2; exit 1; }
mkdir -p "$SOURCE_DIR"
cd "$SOURCE_DIR"
git init
git remote add origin https://github.com/gnolang/gno.git
git fetch --depth 1 origin "$EXPECTED_COMMIT"
git checkout --detach FETCH_HEAD
ACTUAL_COMMIT=$(git rev-parse HEAD)
test "$ACTUAL_COMMIT" = "$EXPECTED_COMMIT"2. Build and install gnoland and gnokey from verified source
set -euo pipefail
cd "$HOME/gno-sapphire-9ab5198"
go version | grep -E 'go1\.(25\.(9|[1-9][0-9]+)|2[6-9]\.[0-9]+|[3-9][0-9]\.[0-9]+)'
make -C gno.land install.gnoland install.gnokey
GOBIN=$(go env GOPATH)/bin
test -x "$GOBIN/gnoland"
test -x "$GOBIN/gnokey"
sudo install -m 0755 "$GOBIN/gnoland" /usr/local/bin/gnoland
sudo install -m 0755 "$GOBIN/gnokey" /usr/local/bin/gnokey
/usr/local/bin/gnoland version
/usr/local/bin/gnokey version3. Checksum and install the official Sapphire genesis
set -euo pipefail
id -u gnoland >/dev/null 2>&1 || sudo useradd --system --home-dir /var/lib/gnoland --create-home --shell /usr/sbin/nologin gnoland
sudo install -d -o gnoland -g gnoland -m 0750 /var/lib/gnoland
GENESIS=/tmp/gno-sapphire-genesis.json
test ! -e "$GENESIS" || { echo "Stop: $GENESIS already exists; review it before continuing." >&2; exit 1; }
curl --fail --location --retry 3 \
--output "$GENESIS" \
https://github.com/gnolang/gno/releases/download/chain/sapphire/genesis.json
printf '%s %s\n' 'd511e0e5b767d4e53f5c1afeeea1bc61d2c7b2118146c820f1f3e4296f67498e' "$GENESIS" | sha256sum --check -
jq -e '.chain_id == "sapphire-1"' "$GENESIS" >/dev/null
sudo install -o gnoland -g gnoland -m 0640 "$GENESIS" /var/lib/gnoland/genesis.json4. Initialize keys and apply the official Sapphire network parameters
set -euo pipefail
CONFIG=/var/lib/gnoland/config/config.toml
PEERS='g10xll77gz6yzg43v9mdalj8360ng6sunt2vvvhf@seed-1.sapphire.testnets.gno.land:26656,g1gw2d7qsmrg06p204ty2qs8ygzd32t2c7p46te0@seed-2.sapphire.testnets.gno.land:26656'
NODE_MONIKER='YOUR_NODE_NAME'
PUBLIC_HOST='YOUR_PUBLIC_IP_OR_DNS'
test "$NODE_MONIKER" != 'YOUR_NODE_NAME'
test "$PUBLIC_HOST" != 'YOUR_PUBLIC_IP_OR_DNS'
sudo -u gnoland /usr/local/bin/gnoland config init --config-path "$CONFIG"
sudo -u gnoland /usr/local/bin/gnoland secrets init --data-dir /var/lib/gnoland/secrets
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" p2p.persistent_peers "$PEERS"
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" application.prune_strategy syncable
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" consensus.timeout_commit 3s
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" consensus.peer_gossip_sleep_duration 10ms
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" p2p.flush_throttle_timeout 10ms
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" p2p.pex true
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" p2p.max_num_outbound_peers 40
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" mempool.size 10000
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" moniker "$NODE_MONIKER"
sudo -u gnoland /usr/local/bin/gnoland config set --config-path "$CONFIG" p2p.external_address "$PUBLIC_HOST:26656"5. Start Sapphire under a hardened systemd service
sudo tee /etc/systemd/system/gnoland-sapphire.service >/dev/null <<'EOF'
[Unit]
Description=Gno.land Sapphire full node
Documentation=https://github.com/gnolang/gno/blob/chain/sapphire/misc/deployments/sapphire.gno.land/VALIDATOR.md
After=network-online.target
Wants=network-online.target
[Service]
User=gnoland
Group=gnoland
WorkingDirectory=/var/lib/gnoland
ExecStart=/usr/local/bin/gnoland start --data-dir=/var/lib/gnoland --chainid=sapphire-1 --genesis=/var/lib/gnoland/genesis.json --skip-genesis-sig-verification --log-level=info
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
NoNewPrivileges=true
PrivateTmp=true
ProtectHome=true
ProtectSystem=strict
ReadWritePaths=/var/lib/gnoland
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now gnoland-sapphire
sudo systemctl status gnoland-sapphire --no-pager6. Verify the local Sapphire chain ID and sync status
curl --fail --silent --show-error http://127.0.0.1:26657/status \
| jq -e '.result.node_info.network == "sapphire-1" and (.result.sync_info.catching_up | type == "boolean")'