Skip to main content

Validator Setup Guide

A step-by-step guide to becoming a validator on the Babylon mainnet (bbn-1)

⚠️ Important: This guide is for mainnet setup. Make sure you understand the risks and requirements before proceeding.


Before You Start​

What You Need to Know​

Babylon validators have special requirements:

  • Must participate in BLS signature voting every epoch
  • Need both consensus keys and BLS keys
  • Validator activation happens only at epoch boundaries

Hardware & System Setup​

CPU:     8 cores (minimum 4 cores)
RAM: 32GB (minimum 16GB)
Storage: 2TB SSD
Network: 1Gbps connection, minimal latency

Initial System Setup​

1. Update your system:

sudo apt update && sudo apt upgrade -y

2. Install essential tools:

sudo apt install curl git wget htop tmux build-essential jq make lz4 gcc unzip -y

🔧 Installing Dependencies​

Install Go Programming Language​

1. Remove any existing Go installation:

sudo rm -rf /usr/local/go

2. Download and install Go 1.23.1:

cd $HOME
VER="1.23.1"
wget "https://golang.org/dl/go$VER.linux-amd64.tar.gz"
sudo tar -C /usr/local -xzf "go$VER.linux-amd64.tar.gz"
rm "go$VER.linux-amd64.tar.gz"

3. Set up Go environment:

[ ! -f ~/.bash_profile ] && touch ~/.bash_profile
echo "export PATH=$PATH:/usr/local/go/bin:~/go/bin" >> ~/.bash_profile
source $HOME/.bash_profile
[ ! -d ~/go/bin ] && mkdir -p ~/go/bin

4. Verify installation:

go version
# Should output: go version go1.23.1 linux/amd64

🏗️ Setting Up Babylon Node​

Configure Environment Variables​

1. Set up your node configuration:

echo "export WALLET=\"wallet\"" >> $HOME/.bash_profile
echo "export MONIKER=\"your-validator-name\"" >> $HOME/.bash_profile # Change this!
echo "export BABYLON_CHAIN_ID=\"bbn-1\"" >> $HOME/.bash_profile
echo "export BABYLON_PORT=\"27\"" >> $HOME/.bash_profile
source $HOME/.bash_profile

Download and Build Babylon​

1. Clone the repository:

cd $HOME
rm -rf babylon
git clone https://github.com/babylonlabs-io/babylon.git
cd babylon

2. Checkout the mainnet version:

git checkout v2.1.0

3. Build for mainnet:

BABYLON_BUILD_OPTIONS="mainnet" make install

4. Verify installation:

babylond version

Initialize Your Node​

1. Initialize the node:

babylond init $MONIKER --chain-id $BABYLON_CHAIN_ID

2. Configure client settings:

sed -i \
-e "s/chain-id = .*/chain-id = \"${BABYLON_CHAIN_ID}\"/" \
-e "s/keyring-backend = .*/keyring-backend = \"os\"/" \
-e "s/node = .*/node = \"tcp:\/\/localhost:${BABYLON_PORT}657\"/" $HOME/.babylond/config/client.toml

Download Network Configuration​

1. Download genesis file:

wget -O $HOME/.babylond/config/genesis.json https://server-2.itrocket.net/mainnet/babylon/genesis.json

2. Download address book:

wget -O $HOME/.babylond/config/addrbook.json https://server-2.itrocket.net/mainnet/babylon/addrbook.json

Configure Network Settings​

1. Set seeds and peers:

SEEDS="145ee7d64ae5d3f6a8ceb6b7dba889f7de48de06@babylon-mainnet-seed.itrocket.net:27656"
PEERS="b16397b576f2431c8a80efa4f5338c1b82583916@babylon-mainnet-peer.itrocket.net:27656"

sed -i -e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*seeds *=.*/seeds = \"$SEEDS\"/}" \
-e "/^\[p2p\]/,/^\[/{s/^[[:space:]]*persistent_peers *=.*/persistent_peers = \"$PEERS\"/}" $HOME/.babylond/config/config.toml

Configure Ports and Performance​

1. Set custom ports in app.toml:

sed -i.bak -e "s%:1317%:${BABYLON_PORT}317%g;
s%:8080%:${BABYLON_PORT}080%g;
s%:9090%:${BABYLON_PORT}090%g;
s%:9091%:${BABYLON_PORT}091%g;
s%:8545%:${BABYLON_PORT}545%g;
s%:8546%:${BABYLON_PORT}546%g;
s%:6065%:${BABYLON_PORT}065%g" $HOME/.babylond/config/app.toml

2. Set custom ports in config.toml:

sed -i.bak -e "s%:26658%:${BABYLON_PORT}658%g;
s%:26657%:${BABYLON_PORT}657%g;
s%:6060%:${BABYLON_PORT}060%g;
s%:26656%:${BABYLON_PORT}656%g;
s%^external_address = \"\"%external_address = \"$(wget -qO- eth0.me):${BABYLON_PORT}656\"%;
s%:26660%:${BABYLON_PORT}660%g" $HOME/.babylond/config/config.toml

3. Configure pruning and gas settings:

# Set pruning
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.babylond/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.babylond/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"19\"/" $HOME/.babylond/config/app.toml

# Set minimum gas prices and enable monitoring
sed -i 's|minimum-gas-prices =.*|minimum-gas-prices = "0.002ubbn"|g' $HOME/.babylond/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.babylond/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.babylond/config/config.toml

Creating Your Validator Keys​

Create System Service​

1. Create the service file:

sudo tee /etc/systemd/system/babylond.service > /dev/null <<EOF
[Unit]
Description=Babylon node
After=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME/.babylond
ExecStart=$(which babylond) start --home $HOME/.babylond --bls-password-file="$HOME/.babylond/config/bls_password.txt"
Restart=on-failure
RestartSec=5
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

2. Enable the service:

sudo systemctl daemon-reload
sudo systemctl enable babylond

Create Wallet​

1. Create a new wallet:

babylond keys add $WALLET

🔐 CRITICAL: Save your mnemonic phrase securely! You cannot recover your validator without it.

2. Or restore an existing wallet:

babylond keys add $WALLET --recover

3. Save wallet addresses:

WALLET_ADDRESS=$(babylond keys show $WALLET -a)
VALOPER_ADDRESS=$(babylond keys show $WALLET --bech val -a)
echo "export WALLET_ADDRESS=\"$WALLET_ADDRESS\"" >> $HOME/.bash_profile
echo "export VALOPER_ADDRESS=\"$VALOPER_ADDRESS\"" >> $HOME/.bash_profile
source $HOME/.bash_profile

echo "💰 Wallet Address: $WALLET_ADDRESS"
echo "🔑 Validator Operator Address: $VALOPER_ADDRESS"

Syncing Your Node​

1. Reset and download snapshot:

babylond tendermint unsafe-reset-all --home $HOME/.babylond

# Download snapshot if available
if curl -s --head https://server-2.itrocket.net/mainnet/babylon/null | head -n 1 | grep "200" > /dev/null; then
echo "📥 Downloading snapshot..."
curl https://server-2.itrocket.net/mainnet/babylon/null | lz4 -dc - | tar -xf - -C $HOME/.babylond
echo "✅ Snapshot downloaded successfully"
else
echo "⚠️ No snapshot found - will sync from genesis"
fi

Start Your Node​

1. Start the node:

sudo systemctl restart babylond

2. Monitor logs:

sudo journalctl -u babylond -fo cat

3. Check sync status:

# This should show 'false' when fully synced
babylond status 2>&1 | jq .SyncInfo.catching_up

Monitor Sync Progress​

Create a sync monitoring script:

cat > check_sync.sh << 'EOF'
#!/bin/bash
rpc_port=$(grep -m 1 -oP '^laddr = "\K[^"]+' "$HOME/.babylond/config/config.toml" | cut -d ':' -f 3)
while true; do
local_height=$(curl -s localhost:$rpc_port/status | jq -r '.result.sync_info.latest_block_height')
network_height=$(curl -s https://babylon-mainnet-rpc.itrocket.net/status | jq -r '.result.sync_info.latest_block_height')

if ! [[ "$local_height" =~ ^[0-9]+$ ]] || ! [[ "$network_height" =~ ^[0-9]+$ ]]; then
echo -e "\033[1;31mError: Invalid block height data. Retrying...\033[0m"
sleep 5
continue
fi

blocks_left=$((network_height - local_height))
echo -e "\033[1;33mNode Height:\033[1;34m $local_height\033[0m \033[1;33m| Network Height:\033[1;36m $network_height\033[0m \033[1;33m| Blocks Left:\033[1;31m $blocks_left\033[0m"

if [ $blocks_left -eq 0 ]; then
echo "🎉 Node is fully synced!"
break
fi

sleep 5
done
EOF

chmod +x check_sync.sh
./check_sync.sh

Setting Up BLS Keys​

Why BLS Keys? Babylon validators must sign checkpoints using BLS signatures every epoch to secure the network.

Generate BLS Keys​

1. Create BLS keys for your wallet:

babylond create-bls-key $WALLET_ADDRESS

2. Create BLS password file:

echo "your_secure_bls_password_here" > $HOME/.babylond/config/bls_password.txt
chmod 600 $HOME/.babylond/config/bls_password.txt

🔒 Security: Use a strong, unique password for BLS keys

3. Configure BLS key name:

sed -i -e "s|^key-name *=.*|key-name = \"$WALLET\"|" $HOME/.babylond/config/app.toml

4. Restart node to load BLS keys:

sudo systemctl restart babylond

Creating Your Validator​

Wait for Full Sync​

Before creating your validator, ensure:

  • Node is fully synced (catching_up: false)
  • You have enough tokens to cover both the stake amount and transaction fees.
  • BLS keys are properly configured

Check your balance:

babylond query bank balances $WALLET_ADDRESS

Create Validator Transaction​

1. Create validator configuration file:

cd $HOME
cat > validator.json << EOF
{
"pubkey": {
"@type": "/cosmos.crypto.ed25519.PubKey",
"key": "$(babylond comet show-validator | grep -Po '"key":\s*"\K[^"]*')"
},
"amount": "1000000ubbn",
"moniker": "$MONIKER",
"identity": "",
"website": "",
"security": "",
"details": "Professional Babylon validator",
"commission-rate": "0.05",
"commission-max-rate": "0.20",
"commission-max-change-rate": "0.01",
"min-self-delegation": "1"
}
EOF

2. Customize your validator details:

# Edit the validator.json file with your information
nano validator.json

Important fields to customize:

  • moniker: Your validator name
  • identity: Your Keybase ID (optional)
  • website: Your website/social media
  • details: Description of your validator
  • commission-rate: Your commission (5% = 0.05)

3. Create your validator:

babylond tx staking create-validator validator.json \
--from $WALLET \
--chain-id bbn-1 \
--gas auto \
--gas-adjustment 1.5

Verify Validator Creation​

After submitting the transaction:

  1. Save your transaction hash and check it in explorer

  2. Wait for next epoch (~60 minutes) for activation

  3. Check validator status:

babylond query staking validator $VALOPER_ADDRESS
  1. Check if validator is in active set:
babylond query staking validators --limit 200 | grep -A 5 -B 5 $MONIKER

Security & Monitoring​

Essential Security Steps​

1. Backup critical files:

# Create backup directory
mkdir -p $HOME/validator_backup

# Backup critical files
cp $HOME/.babylond/config/priv_validator_key.json $HOME/validator_backup/
cp $HOME/.babylond/config/bls_password.txt $HOME/validator_backup/
cp $HOME/.babylond/config/node_key.json $HOME/validator_backup/

# Backup your wallet mnemonic (write it down separately!)

2. Set up firewall:

sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh/tcp
sudo ufw allow ${BABYLON_PORT}656/tcp
sudo ufw enable

3. Secure SSH access:

# Edit SSH config
sudo nano /etc/ssh/sshd_config

# Add these lines:
# PermitRootLogin no
# PasswordAuthentication no
# PubkeyAuthentication yes

# Restart SSH
sudo systemctl restart sshd

Monitoring Commands​

Check node status:

babylond status 2>&1 | jq

Check validator info:

babylond query staking validator $VALOPER_ADDRESS

Monitor logs:

sudo journalctl -u babylond -fo cat

Check if validator is jailed:

babylond query slashing signing-info $(babylond tendermint show-validator)

Withdraw rewards:

babylond tx distribution withdraw-rewards $VALOPER_ADDRESS \
--from $WALLET \
--commission \
--chain-id bbn-1 \
--gas auto \
--gas-adjustment 1.5

🔧 Troubleshooting​

Common Issues & Solutions​

❌ Node not syncing:

# Check peers
babylond query staking validators --limit 1 --output json | jq

# Restart with snapshot
sudo systemctl stop babylond
babylond tendermint unsafe-reset-all --home $HOME/.babylond
# Re-download snapshot and restart

❌ BLS signature errors:

# Check BLS configuration
grep -n "key-name" $HOME/.babylond/config/app.toml
cat $HOME/.babylond/config/bls_password.txt

# Regenerate BLS keys if needed
babylond create-bls-key $WALLET_ADDRESS
sudo systemctl restart babylond

❌ Validator not active:

  • Wait for next epoch (up to 60 minutes)
  • Ensure you have enough stake to be in top validators
  • Check your validator hasn't been jailed

❌ Transaction failures:

# Check balance
babylond query bank balances $WALLET_ADDRESS

# Check gas prices
sed -n 's/^minimum-gas-prices = "\(.*\)"/\1/p' $HOME/.babylond/config/app.toml

Useful Commands​

Unjail validator:

babylond tx slashing unjail \
--from $WALLET \
--chain-id bbn-1 \
--gas auto \
--gas-adjustment 1.5

Edit validator details:

babylond tx staking edit-validator \
--new-moniker "New Name" \
--identity "new-keybase-id" \
--website "https://newwebsite.com" \
--details "Updated description" \
--from $WALLET \
--chain-id bbn-1 \
--gas auto \
--gas-adjustment 1.5

Self-delegate more tokens:

babylond tx staking delegate $VALOPER_ADDRESS 1000000ubbn \
--from $WALLET \
--chain-id bbn-1 \
--gas auto \
--gas-adjustment 1.5

Final Checklist​

Before considering your validator fully operational:

  • Node is fully synced and running
  • Validator transaction confirmed
  • BLS keys properly configured
  • Firewall configured
  • Critical files backed up
  • Monitoring is setup
  • Validator appears in explorer
  • Validator is signing blocks

🎉 Congratulations! You're now running a Babylon validator!