⛓️ Safrochain Mainnet Full Node & Validator Setup Guide
A complete guide to running a Safrochain mainnet full node and registering as a validator
Build from source, configuration, statesync, systemd service, and validator creation — step by step.
Author: HazenNetworkSolutions
Network: Safrochain Mainnet (Chain ID: safrochain-1)
Version: v0.2.2
Last Updated: June 2026
Table of Contents
- Hardware Requirements
- Network Endpoints
- Step 1 — System Verification
- Step 2 — System Update and Dependencies
- Step 3 — Install Go
- Step 4 — Build safrochaind from Source
- Step 5 — Set Up Cosmovisor
- Step 6 — Initialize the Node
- Step 7 — Download Genesis
- Step 8 — Configure Peers (config.toml)
- Step 9 — Configure Custom Ports
- Step 10 — App-Level Settings (app.toml)
- Step 11 — Set CLI Defaults (client.toml)
- Step 12 — Statesync (Optional)
- Step 13 — Create Systemd Service
- Step 14 — Start the Node
- Step 15 — Verify Sync
- Step 16 — Create a Wallet
- Step 17 — Register as a Validator
- Useful Commands
Hardware Requirements
| Component | Minimum | Recommended |
|---|---|---|
| Operating System | Ubuntu 22.04+ | Ubuntu 24.04 |
| CPU | 4 cores | 8+ cores |
| RAM | 16 GB | 32 GB |
| Disk | 500 GB NVMe SSD | 1 TB NVMe SSD |
| Network | 100 Mbps | 1 Gbps |
Network Endpoints
Step 1 — System Verification
After SSH-ing into your server, verify the system meets requirements:
lsb_release -a
uname -r
lscpu | grep -E "Model name|CPU\(s\)|Thread|Socket|Core"
free -h
df -h
Step 2 — System Update and Dependencies
sudo apt update && sudo apt upgrade -y
sudo apt install -y git make jq build-essential wget curl htop tmux \
lz4 gcc unzip screen btop iotop nethogs
Step 3 — Install Go
Safrochain mainnet requires Go 1.25.8:
cd $HOME
wget https://go.dev/dl/go1.25.8.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.25.8.linux-amd64.tar.gz
rm go1.25.8.linux-amd64.tar.gz
[ ! -f ~/.bash_profile ] && touch ~/.bash_profile
echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.bash_profile
echo 'export GOPATH=$HOME/go' >> ~/.bash_profile
source $HOME/.bash_profile
[ ! -d ~/go/bin ] && mkdir -p ~/go/bin
Verify the installation:
go version
Expected output:
go version go1.25.8 linux/amd64
Step 4 — Build safrochaind from Source
Clone the official repository and build v0.2.2:
git clone https://github.com/Safrochain-Org/safrochain-node ~/safrochain-node
cd ~/safrochain-node
git fetch --tags
git checkout v0.2.2
make install
After a successful build you will see the install complete banner:
┌──────────────────────────────────────────────────────────────────
│ ✨ INSTALL COMPLETE
├──────────────────────────────────────────────────────────────────
│ ● safrochaind v0.2.2
│ ● Cosmos SDK v0.50.14
│ ● CometBFT v0.38.21
│ ● Go runtime go1.25.8 linux/amd64
│ ● Build tags netgo,ledger
└──────────────────────────────────────────────────────────────────
Verify:
safrochaind version
# safrochaind v0.2.2
safrochaind version --long | grep -E '^version:|^cosmos_sdk_version:|^go:|^build_tags:|^commit:'
Expected output:
build_tags: netgo,ledger
cosmos_sdk_version: v0.50.14
go: go version go1.25.8 linux/amd64
version: v0.2.2
Step 5 — Set Up Cosmovisor
Install cosmovisor and configure the directory structure:
go install cosmossdk.io/tools/cosmovisor/cmd/[email protected]
Create the cosmovisor upgrade directory and place the binary:
mkdir -p $HOME/.safrochain/cosmovisor/upgrades/v0.2.2/bin
cp $HOME/go/bin/safrochaind $HOME/.safrochain/cosmovisor/upgrades/v0.2.2/bin/
Create symlinks so cosmovisor points to the current version:
sudo ln -sfn $HOME/.safrochain/cosmovisor/upgrades/v0.2.2 $HOME/.safrochain/cosmovisor/current
sudo ln -sfn $HOME/.safrochain/cosmovisor/current/bin/safrochaind /usr/local/bin/safrochaind
Verify:
cosmovisor version
safrochaind version
# safrochaind v0.2.2
Step 6 — Initialize the Node
Set your moniker and initialize the home directory:
MONIKER="YOUR_MONIKER"
safrochaind init "$MONIKER" --chain-id safrochain-1 --home ~/.safrochain
echo "export MONIKER=$MONIKER" >> $HOME/.bash_profile
echo "export SAFRO_CHAIN_ID=\"safrochain-1\"" >> $HOME/.bash_profile
echo "export SAFRO_HOME=\"$HOME/.safrochain\"" >> $HOME/.bash_profile
source $HOME/.bash_profile
ℹ️ Replace
YOUR_MONIKERwith your own node display name.
Step 7 — Download Genesis
Pull the canonical mainnet genesis and verify the SHA-256 checksum:
curl -L https://raw.githubusercontent.com/Safrochain-Org/mainnet-genesis/main/genesis.json \
-o ~/.safrochain/config/genesis.json
Verify:
( cd ~/.safrochain/config && \
echo "c05ac5aec1918df9edb257e8e0eea184d73edc51370eb4aa9f0b4f0aad615c4d genesis.json" \
| shasum -a 256 -c - )
# Expected: genesis.json: OK
⚠️ If the checksum does not match, do not continue. Re-download the genesis file.
Step 8 — Configure Peers (config.toml)
Set the foundation seeds and P2P settings:
sed -i.bak 's|^seeds *=.*|seeds = "[email protected]:26666,d323d296ba55e89fb6ce1a724f8da1740bd8cbb0@seed2.safrochain.network:26670"|' "$SAFRO_HOME/config/config.toml"
sed -i 's|^persistent_peers *=.*|persistent_peers = ""|' "$SAFRO_HOME/config/config.toml"
sed -i 's|^addr_book_strict *=.*|addr_book_strict = true|' "$SAFRO_HOME/config/config.toml"
sed -i 's|^pex *=.*|pex = true|' "$SAFRO_HOME/config/config.toml"
Optional — advertise your public IP for inbound P2P:
# Replace <PUBLIC_IP> with your actual server IP
sed -i.bak -e "s|^external_address *=.*|external_address = \"<PUBLIC_IP>:26656\"|" "$SAFRO_HOME/config/config.toml"
Verify:
grep -E '^(seeds|persistent_peers|pex|addr_book_strict|external_address) ' "$SAFRO_HOME/config/config.toml"
Step 9 — Configure Custom Ports
Setting a custom port prefix avoids conflicts when running multiple nodes on the same server.
Enter a 2-digit prefix (e.g. 46) and the commands below will rewrite every port in both config.toml and app.toml:
read -p "Enter your PORT prefix (2-digit, e.g. 46): " SAFRO_PORT
echo "export SAFRO_PORT=$SAFRO_PORT" >> $HOME/.bash_profile
source $HOME/.bash_profile
Apply to app.toml:
sed -i.bak -e "s%:1317%:${SAFRO_PORT}317%g" \
-e "s%:8080%:${SAFRO_PORT}080%g" \
-e "s%:9090%:${SAFRO_PORT}090%g" \
-e "s%:9091%:${SAFRO_PORT}091%g" \
-e "s%:8545%:${SAFRO_PORT}545%g" \
-e "s%:8546%:${SAFRO_PORT}546%g" \
-e "s%:6065%:${SAFRO_PORT}065%g" \
"$SAFRO_HOME/config/app.toml"
Apply to config.toml:
sed -i.bak -e "s%:26658%:${SAFRO_PORT}658%g" \
-e "s%:26657%:${SAFRO_PORT}657%g" \
-e "s%:6060%:${SAFRO_PORT}060%g" \
-e "s%:26656%:${SAFRO_PORT}656%g" \
-e "s%^external_address *=.*%external_address = \"$(wget -qO- eth0.me):${SAFRO_PORT}656\"%" \
-e "s%:26660%:${SAFRO_PORT}660%g" \
"$SAFRO_HOME/config/config.toml"
Verify:
grep -E ":(${SAFRO_PORT})" "$SAFRO_HOME/config/config.toml" | head -5
grep -E ":(${SAFRO_PORT})" "$SAFRO_HOME/config/app.toml" | head -5
Step 10 — App-Level Settings (app.toml)
Apply the recommended app settings:
# Minimum gas price
sed -i.bak 's|^minimum-gas-prices *=.*|minimum-gas-prices = "0.05usaf"|' "$SAFRO_HOME/config/app.toml"
Additional settings via sed:
# Prometheus metrics (config.toml)
sed -i -e "s/prometheus = false/prometheus = true/" "$SAFRO_HOME/config/config.toml"
# Disable indexer (saves disk)
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" "$SAFRO_HOME/config/config.toml"
# Pruning
sed -i -e "s/^pruning *=.*/pruning = \"default\"/" "$SAFRO_HOME/config/app.toml"
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" "$SAFRO_HOME/config/app.toml"
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"10\"/" "$SAFRO_HOME/config/app.toml"
Full recommended app.toml block:
minimum-gas-prices = "0.05usaf"
[api]
enable = true
swagger = false
address = "tcp://0.0.0.0:1317"
[grpc]
enable = true
address = "0.0.0.0:9090"
[grpc-web]
enable = true
address = "0.0.0.0:9091"
[telemetry]
enabled = true
prometheus-retention-time = 60
# use "nothing" for archive nodes
pruning = "default"
pruning-keep-recent = "100"
pruning-interval = "10"
Step 11 — Set CLI Defaults (client.toml)
safrochaind config set client chain-id safrochain-1 --home "$SAFRO_HOME"
safrochaind config set client node tcp://127.0.0.1:${SAFRO_PORT}657 --home "$SAFRO_HOME"
safrochaind config set client keyring-backend file --home "$SAFRO_HOME"
safrochaind config set client broadcast-mode sync --home "$SAFRO_HOME"
safrochaind config set client output json --home "$SAFRO_HOME"
Step 12 — Statesync (Optional)
If you want to speed up the initial sync by skipping block replay, statesync is available. See the official statesync guide at:
https://docs.safrochain.com/run-a-node/statesync
Step 13 — Create Systemd Service
sudo bash -c "cat > /etc/systemd/system/safrochaind.service" << EOF
[Unit]
Description=safrochaind node service
After=network-online.target
Wants=network-online.target
[Service]
User=$USER
ExecStart=$(which cosmovisor) run start
Restart=on-failure
RestartSec=10
LimitNOFILE=65535
Environment="DAEMON_HOME=$HOME/.safrochain"
Environment="DAEMON_NAME=safrochaind"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:$HOME/.safrochain/cosmovisor/current/bin"
Environment="LD_LIBRARY_PATH=$HOME/.safrochain"
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable safrochaind
Step 14 — Start the Node
sudo systemctl start safrochaind
sudo journalctl -u safrochaind -f --no-pager -o cat
Verify the service is running:
sudo systemctl status safrochaind --no-pager
Expected output:
● safrochaind.service - Safrochain mainnet node
Active: active (running) since ...
Step 15 — Verify Sync
curl -s http://127.0.0.1:${SAFRO_PORT}657/status \
| jq '.result.sync_info | {latest_block_height, catching_up}'
Compare against the public RPC:
curl -s https://rpc.safrochain.network/status \
| jq '.result.sync_info.latest_block_height'
⚠️ Wait until
catching_upisfalsebefore creating a validator.
Step 16 — Create a Wallet
safrochaind keys add wallet --keyring-backend file --home ~/.safrochain
⚠️ CRITICAL: Save your mnemonic phrase in a secure location. Without it, you cannot recover your wallet.
To recover an existing wallet:
safrochaind keys add wallet --recover --keyring-backend file --home ~/.safrochain
List wallets and get your address:
safrochaind keys list --keyring-backend file --home ~/.safrochain
Check your balance:
safrochaind query bank balances $(safrochaind keys show wallet -a --keyring-backend file --home ~/.safrochain) \
--node https://rpc.safrochain.network:443
Step 17 — Register as a Validator
The node must be fully synced (
catching_up: false) before creating a validator.
Get your consensus public key:
safrochaind comet show-validator --home ~/.safrochain
Create validator JSON:
cat > $HOME/validator.json << EOF
{
"pubkey": $(safrochaind comet show-validator --home ~/.safrochain),
"amount": "1000000usaf",
"moniker": "YOUR_MONIKER",
"identity": "YOUR_KEYBASE_ID",
"website": "https://your-website.com",
"security": "[email protected]",
"details": "Your validator description",
"commission-rate": "0.10",
"commission-max-rate": "0.20",
"commission-max-change-rate": "0.01",
"min-self-delegation": "1"
}
EOF
Submit the transaction:
safrochaind tx staking create-validator $HOME/validator.json \
--from wallet \
--chain-id safrochain-1 \
--gas auto \
--gas-adjustment 1.4 \
--fees 500usaf \
--keyring-backend file \
--home ~/.safrochain \
-y
Verify your validator:
safrochaind query staking validator \
$(safrochaind keys show wallet --bech val -a --keyring-backend file --home ~/.safrochain) \
--node https://rpc.safrochain.network:443
Useful Commands
Service Management
sudo systemctl start safrochaind
sudo systemctl stop safrochaind
sudo systemctl restart safrochaind
sudo systemctl status safrochaind
Logs & Sync
# Live logs
sudo journalctl -u safrochaind -f --no-pager -o cat
# Logs from last hour
sudo journalctl -u safrochaind --since "1 hour ago"
# Sync status
curl -s http://127.0.0.1:${SAFRO_PORT}657/status | jq '.result.sync_info | {latest_block_height, catching_up}'
# Connected peers
curl -s http://127.0.0.1:${SAFRO_PORT}657/net_info | jq '.result.n_peers'
Wallet & Balance
# List wallets
safrochaind keys list --keyring-backend file --home ~/.safrochain
# Show address
safrochaind keys show wallet -a --keyring-backend file --home ~/.safrochain
# Check balance
safrochaind query bank balances $(safrochaind keys show wallet -a --keyring-backend file --home ~/.safrochain) \
--node https://rpc.safrochain.network:443
Staking
# Delegate tokens
safrochaind tx staking delegate \
$(safrochaind keys show wallet --bech val -a --keyring-backend file --home ~/.safrochain) 1000000usaf \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
# Redelegate tokens
safrochaind tx staking redelegate \
$(safrochaind keys show wallet --bech val -a --keyring-backend file --home ~/.safrochain) \
<NEW_VALOPER> 1000000usaf \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
# Undelegate tokens
safrochaind tx staking unbond \
$(safrochaind keys show wallet --bech val -a --keyring-backend file --home ~/.safrochain) 1000000usaf \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
Rewards
# Withdraw all rewards
safrochaind tx distribution withdraw-all-rewards \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
# Withdraw commission
safrochaind tx distribution withdraw-rewards \
$(safrochaind keys show wallet --bech val -a --keyring-backend file --home ~/.safrochain) \
--commission \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
Governance
# List proposals
safrochaind query gov proposals --node https://rpc.safrochain.network:443
# Vote on a proposal
safrochaind tx gov vote 1 yes \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
Validator Operations
# Edit validator
safrochaind tx staking edit-validator \
--new-moniker "NEW_MONIKER" \
--identity "YOUR_KEYBASE_ID" \
--website "https://your-website.com" \
--security-contact "[email protected]" \
--details "Your validator description" \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
# Unjail validator
safrochaind tx slashing unjail \
--from wallet --chain-id safrochain-1 \
--gas auto --gas-adjustment 1.4 --fees 500usaf \
--node tcp://127.0.0.1:${SAFRO_PORT}657 \
--keyring-backend file --home ~/.safrochain -y
# Check signing info
safrochaind query slashing signing-info \
$(safrochaind comet show-validator --home ~/.safrochain) \
--node https://rpc.safrochain.network:443
Firewall
# P2P — must be open to the public
sudo ufw allow ${SAFRO_PORT}656/tcp comment "safrochain P2P"
# RPC — open only if you serve public endpoints
sudo ufw allow ${SAFRO_PORT}657/tcp comment "safrochain RPC"
# REST API
sudo ufw allow ${SAFRO_PORT}317/tcp comment "safrochain REST"
# gRPC
sudo ufw allow ${SAFRO_PORT}090/tcp comment "safrochain gRPC"
About the Author
This guide was prepared by HazenNetworkSolutions.
🌐 hazennetworksolutions.com