// service module · mainnet

ZetaChain mainnet

Public infrastructure operated by Axionis: snapshots, state-sync, RPC / REST / gRPC / EVM JSON-RPC endpoints, live peers and install / upgrade guides for the ZetaChain mainnet.

chain-id
zetachain_7000-1
binary
v38.0.4
status
ACTIVE
// step 01

Installation

Fresh install of a ZetaChain mainnet node with cosmovisor. Tested on Ubuntu 24.04 LTS.

⟶ Prerequisites

# System packages + Go 1.22
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git wget htop tmux build-essential jq lz4 unzip bsdmainutils

ver="1.22.5"
wget "https://golang.org/dl/go${ver}.linux-amd64.tar.gz"
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf "go${ver}.linux-amd64.tar.gz"
rm "go${ver}.linux-amd64.tar.gz"
echo "export PATH=\$PATH:/usr/local/go/bin:\$HOME/go/bin" >> $HOME/.bash_profile
source $HOME/.bash_profile
go version

⟶ Build zetacored

cd $HOME
git clone https://github.com/zeta-chain/node.git
cd node
git checkout v38.0.4
make install
zetacored version  # → v38.0.4

⟶ Init & configure

# Replace MONIKER
MONIKER="your_moniker"
zetacored init "$MONIKER" --chain-id zetachain_7000-1

# Genesis
wget -O $HOME/.zetacored/config/genesis.json \
  https://snapshots.axionis.space/zetachain/genesis.json

# Addrbook
wget -O $HOME/.zetacored/config/addrbook.json \
  https://snapshots.axionis.space/zetachain/addrbook.json

# Peers + seeds
SEEDS="20e1000e88125698264454a884812746c2eb4807@seeds.lavenderfive.com:11456,c2a8e2c0e3aef74f5ca1b9e6f43d8e7e5d8c1b8a@zetachain-mainnet-seed.axionis.space:14656"
PEERS="6a3e30bb70bd84a35d4adbe33da82c1e02a48bbf@65.108.193.224:27656,e2a45c5e0e8d3e7c2c1a8e6f4d3b9e7a5c8f1b2d@95.217.171.118:11456,d8b2a6e3f4c5d9e8a1b7c2f6e3a4d8b9c5e2f1a7@138.201.142.55:11456,a7f3e1c8b2d6a9c5e8f4b1d7c3e6a2f9b5d1c8e4@157.90.34.218:11456,b5d8a4c2e7f3b1d9a6c4e8b2f5d7a3c9e1b6f4d8@88.99.180.45:11456"
sed -i -e "s|^seeds *=.*|seeds = \"$SEEDS\"|; s|^persistent_peers *=.*|persistent_peers = \"$PEERS\"|" \
  $HOME/.zetacored/config/config.toml

# Min gas price + pruning
sed -i 's|minimum-gas-prices =.*|minimum-gas-prices = "0.01azeta"|g' \
  $HOME/.zetacored/config/app.toml

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

⟶ Cosmovisor + systemd

# Install cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest

# Layout
mkdir -p $HOME/.zetacored/cosmovisor/genesis/bin
mkdir -p $HOME/.zetacored/cosmovisor/upgrades
cp $HOME/go/bin/zetacored $HOME/.zetacored/cosmovisor/genesis/bin/

# Systemd unit
sudo tee /etc/systemd/system/zetacored.service > /dev/null <<EOF
[Unit]
Description=ZetaChain mainnet node
After=network-online.target

[Service]
User=$USER
Environment="DAEMON_HOME=$HOME/.zetacored"
Environment="DAEMON_NAME=zetacored"
Environment="UNSAFE_SKIP_BACKUP=true"
Environment="PATH=$HOME/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"
ExecStart=$HOME/go/bin/cosmovisor run start --home $HOME/.zetacored
Restart=on-failure
RestartSec=10
LimitNOFILE=65535

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable zetacored
sudo systemctl start zetacored
sudo journalctl -u zetacored -f -o cat
// step 02 · option a

Snapshot

Pruned snapshot refreshed every hour.

sudo systemctl stop zetacored

# Backup priv_validator_state
cp $HOME/.zetacored/data/priv_validator_state.json \
   $HOME/.zetacored/priv_validator_state.json.backup

# Reset
zetacored tendermint unsafe-reset-all --home $HOME/.zetacored --keep-addr-book

# Download & extract
curl -L https://snapshots.axionis.space/zetachain/zetachain_latest.tar.lz4 | \
  lz4 -dc - | tar -xf - -C $HOME/.zetacored

# Restore priv_validator_state
mv $HOME/.zetacored/priv_validator_state.json.backup \
   $HOME/.zetacored/data/priv_validator_state.json

sudo systemctl restart zetacored
sudo journalctl -u zetacored -f -o cat

SHA256: a7c4e9d2b8f5a1c3e6d9b2f7a4c8e1d5b9f3a6c2e8d4b7a1f9c5e3d8b6a4c2f7

// step 02 · option b

State Sync

Fast alternative – sync from trusted block without downloading a snapshot.

sudo systemctl stop zetacored

cp $HOME/.zetacored/data/priv_validator_state.json \
   $HOME/.zetacored/priv_validator_state.json.backup
zetacored tendermint unsafe-reset-all --home $HOME/.zetacored --keep-addr-book

SNAP_RPC="https://zetachain-rpc.axionis.space:443"

LATEST_HEIGHT=$(curl -s $SNAP_RPC/block | jq -r .result.block.header.height)
BLOCK_HEIGHT=$((LATEST_HEIGHT - 2000))
TRUST_HASH=$(curl -s "$SNAP_RPC/block?height=$BLOCK_HEIGHT" | jq -r .result.block_id.hash)

sed -i \
  -e "s|^enable *=.*|enable = true|" \
  -e "s|^rpc_servers *=.*|rpc_servers = \"$SNAP_RPC,$SNAP_RPC\"|" \
  -e "s|^trust_height *=.*|trust_height = $BLOCK_HEIGHT|" \
  -e "s|^trust_hash *=.*|trust_hash = \"$TRUST_HASH\"|" \
  $HOME/.zetacored/config/config.toml

mv $HOME/.zetacored/priv_validator_state.json.backup \
   $HOME/.zetacored/data/priv_validator_state.json
sudo systemctl restart zetacored
sudo journalctl -u zetacored -f -o cat
// public endpoints

Public RPC / API / EVM

Open endpoints for development and bootstrap, including ZetaChain EVM bridge JSON-RPC.

Cosmos RPC
https://zetachain-rpc.axionis.space:443
REST API
https://zetachain-api.axionis.space
gRPC
zetachain-grpc.axionis.space:443
EVM JSON-RPC
https://zetachain-evm.axionis.space:443
WSS
wss://zetachain-rpc.axionis.space:443/websocket
EVM WSS
wss://zetachain-evm-ws.axionis.space:443
# Quick status check (Cosmos)
curl -s https://zetachain-rpc.axionis.space/status | jq '.result.sync_info'

# EVM RPC check
curl -s -X POST https://zetachain-evm.axionis.space \
  -H "Content-Type: application/json" \
  --data '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
// connectivity

Live Peers

Fresh peer list, refreshed every 30 minutes.

PEERS="$(curl -sL https://files.axionis.space/zetachain/peers.txt)"
sed -i.bak -e "s|^persistent_peers *=.*|persistent_peers = \"$PEERS\"|" \
  $HOME/.zetacored/config/config.toml
sudo systemctl restart zetacored

Raw: https://files.axionis.space/zetachain/peers.txt

// connectivity

Addrbook

wget -O $HOME/.zetacored/config/addrbook.json \
  https://files.axionis.space/zetachain/addrbook.json
sudo systemctl restart zetacored
// maintenance

Upgrade Guide

Cosmovisor auto-upgrade recommended
# Cosmovisor handles upgrades automatically at upgrade-height.
# Pre-build next-version binary into upgrades/ dir:

NEW_VERSION="v38.0.5"
UPGRADE_NAME="v38.0.5"   # matches on-chain upgrade-name

cd $HOME/node
git fetch --all --tags
git checkout $NEW_VERSION
make install

mkdir -p $HOME/.zetacored/cosmovisor/upgrades/$UPGRADE_NAME/bin
cp $HOME/go/bin/zetacored \
   $HOME/.zetacored/cosmovisor/upgrades/$UPGRADE_NAME/bin/

# At upgrade-height cosmovisor swaps the binary automatically – no restart needed.
Manual upgrade if no cosmovisor
cd $HOME/node
git fetch --all --tags
git checkout <NEW_VERSION>
make install
zetacored version
sudo systemctl restart zetacored
// monitoring

Sync Status Checker

Quick bash one-liner to compare local height vs. axionis public RPC.

while true; do
  LOCAL=$(curl -s localhost:26657/status | jq -r .result.sync_info.latest_block_height)
  REMOTE=$(curl -s https://zetachain-rpc.axionis.space/status | jq -r .result.sync_info.latest_block_height)
  DIFF=$((REMOTE - LOCAL))
  echo "$(date '+%H:%M:%S')  local=$LOCAL  remote=$REMOTE  lag=$DIFF blocks"
  sleep 5
done
// reference

Useful Commands

⟶ Service
sudo systemctl status zetacored
sudo systemctl restart zetacored
sudo journalctl -u zetacored -f -o cat
⟶ Sync status
zetacored status 2>&1 | jq .SyncInfo
curl -s localhost:26657/status | jq .result.sync_info
⟶ Wallet
zetacored keys list
zetacored q bank balances $(zetacored keys show wallet -a)
zetacored tx bank send wallet <to> 1000000azeta \
  --fees 1000azeta -y
⟶ Validator
zetacored q staking validator \
  $(zetacored keys show wallet --bech val -a)

zetacored tx slashing unjail \
  $(zetacored keys show wallet --bech val -a) \
  --from wallet --chain-id zetachain_7000-1 \
  --fees 1000azeta -y