Skip to content

Validator Node Installation

Running a validator node for the 0G-Galileo-Testnet in the 0G ecosystem means actively participating in the network’s security and consensus through the Proof-of-Stake (PoS) mechanism. As a validator, you’ll validate transactions, propose new blocks, and earn rewards for your contribution to the network’s integrity and decentralization.

ComponentMainnetTestnet
Memory64 GB64 GB
CPU8 cores8 cores
Disk1 TB NVME SSD4 TB NVME SSD
Bandwidth100 MBps for Download / Upload100 MBps for Download / Upload
Terminal window
sudo apt update
sudo apt install curl git make jq build-essential gcc unzip wget lz4 aria2 -y
Terminal window
wget https://github.com/0glabs/0gchain-ng/releases/download/v1.0.1/galileo-v1.0.1.tar.gz
tar -xzvf galileo-v1.0.1.tar.gz -C $HOME
Terminal window
sudo chmod 777 $HOME/galileo/bin/geth
sudo chmod 777 $HOME/galileo/bin/0gchaind
cp $HOME/galileo/bin/geth $HOME/go/bin/geth
cp $HOME/galileo/bin/0gchaind $HOME/go/bin/0gchaind
source $HOME/.bash_profile
geth version
0gchaind version
Terminal window
echo "export WALLET='allnodesone'" >> $HOME/.bash_profile
echo "export MONIKER='allnodesone'" >> $HOME/.bash_profile
echo "export OG_PORT='26'" >> $HOME/.bash_profile
source $HOME/.bash_profile
Terminal window
mkdir -p $HOME/.0gchaind
cp -r $HOME/galileo/0g-home $HOME/.0gchaind
# Init Geth
geth init --datadir $HOME/.0gchaind/0g-home/geth-home $HOME/galileo/genesis.json
# Init 0gchaind
0gchaind init "allnodesone" --home $HOME/.0gchaind/tmp
# Copy node files
cp $HOME/.0gchaind/tmp/data/priv_validator_state.json $HOME/.0gchaind/0g-home/0gchaind-home/data/
cp $HOME/.0gchaind/tmp/config/node_key.json $HOME/.0gchaind/0g-home/0gchaind-home/config/
cp $HOME/.0gchaind/tmp/config/priv_validator_key.json $HOME/.0gchaind/0g-home/0gchaind-home/config/
rm -rf $HOME/.0gchaind/tmp
Terminal window
sed -i -e "
s%:26658%:${OG_PORT}658%g;
s%:26657%:${OG_PORT}657%g;
s%:6060%:${OG_PORT}060%g;
s%:26656%:${OG_PORT}656%g;
s%^external_address = \"\"%external_address = \"$(wget -qO- eth0.me):${OG_PORT}656\"%;
s%:26660%:${OG_PORT}660%g
" $HOME/.0gchaind/0g-home/0gchaind-home/config/config.toml
sed -i -e "s|^node *=.*|node = \"tcp://localhost:${OG_PORT}657\"|" $HOME/.0gchaind/0g-home/0gchaind-home/config/client.toml
sed -i -e "s|^keyring-backend *=.*|keyring-backend = \"os\"|" $HOME/.0gchaind/0g-home/0gchaind-home/config/client.toml
Terminal window
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.0gchaind/0g-home/0gchaind-home/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.0gchaind/0g-home/0gchaind-home/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"50\"/" $HOME/.0gchaind/0g-home/0gchaind-home/config/app.toml
sed -i -e "s/prometheus = false/prometheus = true/" $HOME/.0gchaind/0g-home/0gchaind-home/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"null\"/" $HOME/.0gchaind/0g-home/0gchaind-home/config/config.toml

Create Systemd Service Files 0gchaind.service

Section titled “Create Systemd Service Files 0gchaind.service”
Terminal window
sudo tee /etc/systemd/system/0gchaind.service > /dev/null <<EOF
[Unit]
Description=0G Chain Daemon
After=network-online.target
[Service]
User=root
ExecStart=$(which 0gchaind) start \\
--rpc.laddr tcp://0.0.0.0:26657 \\
--beacon-kit.kzg.trusted-setup-path=$HOME/galileo/kzg-trusted-setup.json \\
--beacon-kit.engine.jwt-secret-path=$HOME/galileo/jwt-secret.hex \\
--beacon-kit.kzg.implementation=crate-crypto/go-kzg-4844 \\
--beacon-kit.block-store-service.enabled \\
--beacon-kit.node-api.enabled \\
--beacon-kit.node-api.logging \\
--beacon-kit.node-api.address 0.0.0.0:3500 \\
--pruning=custom \\
--home $HOME/.0gchaind/0g-home/0gchaind-home \\
--p2p.seeds [email protected]:26656 \\
--p2p.external_address $(curl -s http://ipv4.icanhazip.com):${OG_PORT}656
Environment=CHAIN_SPEC=devnet
WorkingDirectory=$HOME/galileo
Restart=always
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
Terminal window
sudo tee /etc/systemd/system/geth.service > /dev/null <<EOF
[Unit]
Description=Go Ethereum Client
After=network-online.target
Wants=network-online.target
[Service]
User=root
ExecStart=$HOME/go/bin/geth \\
--config $HOME/galileo/geth-config.toml \\
--datadir $HOME/.0gchaind/0g-home/geth-home \\
--networkid 80087 \\
--port 30303 \\
--http.port 8645 \\
--authrpc.port 8551
Restart=always
WorkingDirectory=$HOME/galileo
RestartSec=3
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
EOF
Terminal window
sudo systemctl daemon-reload
sudo systemctl enable 0gchaind
sudo systemctl enable geth
sudo systemctl start 0gchaind
sudo systemctl start geth
Terminal window
sudo systemctl status 0gchaind
sudo systemctl status geth
sudo journalctl -fu 0gchaind -o cat
sudo journalctl -fu geth -o cat
Terminal window
0gchaind status | jq '{ latest_block_height: .sync_info.latest_block_height, catching_up: .sync_info.catching_up }'
Terminal window
while true; do
PORT=$(grep -A 3 '^\[rpc\]' $HOME/.0gchaind/0g-home/0gchaind-home/config/config.toml | grep -oP 'laddr = "tcp://[0-9.:]+:\K\d+')
local=$(curl -s localhost:$PORT/status | jq -r '.result.sync_info.latest_block_height//0')
network=$(curl -s http://8.218.94.246:26657/status | jq -r '.result.sync_info.latest_block_height//0')
left=$((network - local))
echo -e "Local: \033[1;34m$local\033[0m | Network: \033[1;36m$network\033[0m | Left: \033[1;31m$left\033[0m"
sleep 5
done
🚨 Danger

Please, before proceeding with the next step! All chain data will be lost! Make sure you have backed up your wallet key & priv_validator_key.json!

Terminal window
cd $HOME
sudo systemctl stop 0gchaind geth
sudo systemctl disable 0gchaind geth
sudo rm /etc/systemd/system/0gchaind.service
sudo rm /etc/systemd/system/geth.service
sudo systemctl daemon-reload
sudo rm -f $(which 0gchaind)
sudo rm -rf $HOME/.0gchaind