Skip to main content

Validator Node


Running a Validator node means providing validator services for the network, processing transactions and maintaining consensus.

What You'll Need
  • Linux/macOS system with adequate hardware
  • Stable internet connection
  • Ethereum RPC endpoint (mainnet for Aristotle, HoleSky testnet for Galileo)

Hardware Requirements

ComponentMainnet (Aristotle)Testnet (Galileo)
Memory64 GB64 GB
CPU8 cores8 cores
Disk1 TB NVME SSD4 TB NVME SSD
Bandwidth100 MBps for Download / Upload100 MBps for Download / Upload

Restaking RPC Configuration

  • Validator Nodes: When running your consensus client, add the following flags to enable restaking and configure the Symbiotic RPC:
--chaincfg.restaking.enabled \
--chaincfg.restaking.symbiotic-rpc-dial-url ${ETH_RPC_URL} \
--chaincfg.restaking.symbiotic-get-logs-block-range ${BLOCK_NUM}
  • ETH_RPC_URL: The RPC endpoint for the Symbiotic network.

  • BLOCK_NUM: The maximum block number range per call when syncing restaking events. Default is 1. Adjust based on your RPC provider limits.

  • Non-Validator Nodes: No restaking-related configuration is required; you can keep your current startup parameters unchanged.

This enables staking in Symbiotic contracts on Ethereum (mainnet: Ethereum, testnet: HoleSky) to participate in 0G Chain consensus. Validators must be able to read the Ethereum contract state to generate and verify new blocks. You can run your own node or use a third-party RPC provider such as QuickNode or Infura for ${ETH_RPC_URL}.

Non-Validator Nodes

Restaking configuration is NOT required for non-validator nodes. Do not add the --chaincfg.restaking.* flags when running non-validator nodes.


Mainnet (Aristotle) Setup Guide

1. Download Package

Download the latest Aristotle mainnet package:

wget -O aristotle.tar.gz https://github.com/0gfoundation/0gchain-Aristotle/releases/download/1.0.2/aristotle-v1.0.2.tar.gz
Version Information

Latest Aristotle mainnet release: v1.0.2. Check releases page for newer versions.

2. Extract Package

Extract the Aristotle node package to your home directory:

tar -xzvf aristotle-v1.0.0.tar.gz -C ~

3. Create Data Directory and Copy Configuration

Create your data directory and copy the default configuration:

cd aristotle-v1.0.2

cp -r 0g-home {your data path}
sudo chmod 777 ./bin/geth
sudo chmod 777 ./bin/0gchaind

4. Initialize Geth

Initialize the Geth execution client with the genesis configuration:

./bin/geth init --datadir {your data path}/0g-home/geth-home ./geth-genesis.json

Expected output: "Successfully wrote genesis state"

5. Initialize 0gchaind for Mainnet

Create a temporary initialization with the mainnet chain specification:

./bin/0gchaind init {node name} --home {your data path}/tmp --chaincfg.chain-spec mainnet

⚠️ Important: The --chaincfg.chain-spec mainnet flag is REQUIRED for validators

6. Copy Node Keys and Validator Keys

Copy all necessary keys to the permanent directory:

cp {your data path}/tmp/data/priv_validator_state.json {your data path}/0g-home/0gchaind-home/data/
cp {your data path}/tmp/config/node_key.json {your data path}/0g-home/0gchaind-home/config/
cp {your data path}/tmp/config/priv_validator_key.json {your data path}/0g-home/0gchaind-home/config/

7. Generate JWT Authentication Token

Generate a JWT token with mainnet specification for secure communication:

./bin/0gchaind jwt generate --home {your data path}/0g-home/0gchaind-home --chaincfg.chain-spec mainnet

cp -f {your data path}/0g-home/0gchaind-home/config/jwt.hex ./

8. Configure Node Name

Update the node moniker in the configuration file:

sed -i 's/moniker = "0G-mainnet-aristotle-node"/moniker = "{your node name}"/' {your data path}/0g-home/0gchaind-home/config/config.toml

9. Verify Configuration Files

Ensure all required configuration files are present:

ls -la {your data path}/0g-home/0gchaind-home/config/

Should display:

  • app.toml
  • client.toml
  • config.toml
  • genesis.json
  • jwt.hex
  • node_key.json
  • priv_validator_key.json

10. Set Environment Variables

Configure required environment variables for Symbiotic restaking:

# Set your Ethereum RPC endpoint (mainnet)
export ETH_RPC_URL="https://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY"

# Set block range for syncing (adjust based on your RPC limits)
export BLOCK_NUM=1

11. Start 0gchaind

Launch the 0gchaind consensus client with validator-specific parameters:

cd aristotle-v1.0.2

nohup ./bin/0gchaind start \
--rpc.laddr tcp://0.0.0.0:26657 \
--chaincfg.kzg.trusted-setup-path=kzg-trusted-setup.json \
--chaincfg.engine.jwt-secret-path=jwt.hex \
--chaincfg.block-store-service.enabled \
--chaincfg.restaking.enabled \
--chaincfg.restaking.symbiotic-rpc-dial-url ${ETH_RPC_URL} \
--chaincfg.restaking.symbiotic-get-logs-block-range ${BLOCK_NUM} \
--home {your data path}/0g-home/0gchaind-home \
--p2p.external_address {your node ip}:26656 > {your data path}/0g-home/log/0gchaind.log 2>&1 &

Validator-Specific Parameters:

  • --chaincfg.restaking.enabled: Enables restaking functionality
  • --chaincfg.restaking.symbiotic-rpc-dial-url: Ethereum RPC for Symbiotic protocol
  • --chaincfg.restaking.symbiotic-get-logs-block-range: Block range per sync call

12. Start Geth

Launch the Geth execution client:

cd aristotle-v1.0.2

nohup ./bin/geth \
--config geth-config.toml \
--nat extip:{your node ip} \
--datadir {your data path}/0g-home/geth-home \
--networkid 16661 > {your data path}/0g-home/log/geth.log 2>&1 &

13. Verify Node Status

Check that both services are running correctly:

# Check 0gchaind logs
tail -f {your data path}/0g-home/log/0gchaind.log

# Check geth logs
tail -f {your data path}/0g-home/log/geth.log

Validator Operations

Initialize Your Validator

Once your validator node is running and fully synced (catching_up: false), you need to initialize your validator on the blockchain to start validating transactions.

Next Step: Follow the Validator Initialization Guide to:

  1. Generate validator signature
  2. Prepare validator description and settings
  3. Execute the initialization transaction
  4. Verify your validator activation (typically 30-60 minutes)

Monitor Consensus Participation

# Check if your validator is in the active set
curl http://localhost:26657/validators | jq

Check Sync Status

# Should show "catching_up": false when fully synced
curl http://localhost:26657/status | jq '.result.sync_info'

Key Management

⚠️ Critical Security Notice:

  • Backup your validator keys immediately: priv_validator_key.json and node_key.json
  • Never share your private validator key with anyone
  • Store backups in multiple secure locations
  • Test recovery process in a non-production environment first
Backup & Recovery

These files are essential for validator recovery and must be backed up securely:

# Essential validator keys
/{your data path}/0g-home/0gchaind-home/config/

Recovery Process

To restore your validator from backup:

  1. Stop running services:

    pkill 0gchaind
    pkill geth
  2. Restore key files:

    cp ~/validator-backup/node_key.json /{your data path}/0g-home/0gchaind-home/config/
    cp ~/validator-backup/priv_validator_key.json /{your data path}/0g-home/0gchaind-home/config/
  3. Restart services following the appropriate setup guide steps.

Upgrade Validator

Step 1: Extract New Release

# For Testnet (Galileo)
wget -O galileo.tar.gz https://github.com/0gfoundation/0gchain-NG/releases/download/v3.0.2/galileo-v3.0.2.tar.gz
tar -xzvf galileo.tar.gz -C ~

# For Mainnet (Aristotle)
wget -O aristotle.tar.gz https://github.com/0gfoundation/0gchain-Aristotle/releases/download/1.0.2/aristotle-v1.0.2.tar.gz
tar -xzvf aristotle.tar.gz -C ~

# Verify extraction
ls -la {network}-v{version}/

Step 2: Stop Services

# Stop consensus layer (0gchaind)
pkill 0gchaind

# Stop execution layer (geth)
pkill geth

Step 3: Backup Your Data

# Create backup directory with timestamp
BACKUP_DIR="backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p $BACKUP_DIR

# Backup execution layer data (geth-home)
cp -r {your_geth_datadir} $BACKUP_DIR/geth-backup

# Backup consensus layer data (0gchaind-home)
cp -r {your_0gchaind_home} $BACKUP_DIR/0gchaind-backup

Step 4: Start Node

If you get error while starting node due to missing priv_validator_state.json, create an empty priv_validator_state.json file in that directory with {}.

For testnet (Galileo), use --chaincfg.chain-spec testnet:

nohup ./bin/0gchaind start \
--rpc.laddr tcp://0.0.0.0:26657 \
--chaincfg.chain-spec testnet \
--chaincfg.restaking.enabled \
--chaincfg.restaking.symbiotic-rpc-dial-url ${ETH_RPC_URL} \
--chaincfg.restaking.symbiotic-get-logs-block-range ${BLOCK_NUM} \
--chaincfg.kzg.trusted-setup-path=kzg-trusted-setup.json \
--chaincfg.engine.jwt-secret-path=jwt.hex \
--chaincfg.block-store-service.enabled \
--home {your_cl_home} \
--p2p.external_address {your_node_ip}:26656 > {your_log_path}/0gchaind.log 2>&1 &

For mainnet (Aristotle), use --chaincfg.chain-spec mainnet:

nohup ./bin/0gchaind start \
--rpc.laddr tcp://0.0.0.0:26657 \
--chaincfg.chain-spec mainnet \
--chaincfg.restaking.enabled \
--chaincfg.restaking.symbiotic-rpc-dial-url ${ETH_RPC_URL} \
--chaincfg.restaking.symbiotic-get-logs-block-range ${BLOCK_NUM} \
--chaincfg.kzg.trusted-setup-path=kzg-trusted-setup.json \
--chaincfg.engine.jwt-secret-path=jwt.hex \
--chaincfg.block-store-service.enabled \
--home {your_cl_home} \
--p2p.external_address {your_node_ip}:26656 > {your_log_path}/0gchaind.log 2>&1 &

Then start Geth:

nohup ./bin/geth --config geth-config.toml \
--nat extip:{your_node_ip} \
--datadir {your_geth_datadir} \
--networkid {network_id} > {your_log_path}/geth.log 2>&1 &

Step 5: Verify Upgrade Success

# Monitor consensus layer logs
tail -f {your_log_path}/0gchaind.log

# Monitor execution layer logs
tail -f {your_log_path}/geth.log

Next Steps

Staking Integration

Once your validator node is running, you can interact with the staking system programmatically using smart contracts: