Installation
1. System Preparation
# System update
sudo apt update && sudo apt upgrade -y
# Install required packages
sudo apt install -y build-essential jq sed curl wget git make gcc g++ unzip snapd lz4
2. Go Installation
cd $HOME
wget https://go.dev/dl/go1.23.3.linux-amd64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz
rm go1.23.3.linux-amd64.tar.gz
# PATH configuration
cat << 'EOF' >> ~/.bashrc
export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin
export GOPATH=$HOME/go
EOF
source ~/.bashrc
go version
3. Binary Download and Installation
# Create binary directory
mkdir -p ~/layer/binaries/v5.1.1 && cd ~/layer/binaries/v5.1.1
# Download binary
wget https://github.com/tellor-io/layer/releases/download/v5.1.1/layer_Linux_x86_64.tar.gz
tar -xvzf layer_Linux_x86_64.tar.gz
# Copy to system-wide location
sudo cp layerd /usr/local/bin/
sudo chmod +x /usr/local/bin/layerd
# Version check
layerd version
4. Node Initialization
# Initialize node (replace YOUR_NODE_NAME with your own name)
layerd init "YOUR_NODE_NAME" --chain-id tellor-1
# Download genesis file
curl -Ls https://ss.tellor.nodestake.org/genesis.json > $HOME/.layer/config/genesis.json
5. Port Configuration
# Change CUSTOM_PORT value for custom port (default: 45)
CUSTOM_PORT=45
# Port settings
sed -i -e "s|tcp://127.0.0.1:26657|tcp://0.0.0.0:${CUSTOM_PORT}657|g" $HOME/.layer/config/config.toml
sed -i -e "s|:26656|:${CUSTOM_PORT}656|g" $HOME/.layer/config/config.toml
sed -i -e "s|:26658|:${CUSTOM_PORT}658|g" $HOME/.layer/config/config.toml
sed -i -e "s|proxy_app = \"tcp://127.0.0.1:26658\"|proxy_app = \"tcp://127.0.0.1:${CUSTOM_PORT}658\"|g" $HOME/.layer/config/config.toml
sed -i -e "s|tcp://localhost:26657|tcp://localhost:${CUSTOM_PORT}657|g" $HOME/.layer/config/client.toml
6. Configuration Filesapp.toml Settings
# Gas prices
sed -i -e "s/^minimum-gas-prices *=.*/minimum-gas-prices = \"0loya\"/" $HOME/.layer/config/app.toml
# Enable API
sed -i -e "s/^enable *=.*/enable = true/" $HOME/.layer/config/app.toml
sed -i -e "s/^swagger *=.*/swagger = true/" $HOME/.layer/config/app.toml
# Pruning settings
sed -i -e "s/^pruning *=.*/pruning = \"custom\"/" $HOME/.layer/config/app.toml
sed -i -e "s/^pruning-keep-recent *=.*/pruning-keep-recent = \"100\"/" $HOME/.layer/config/app.toml
sed -i -e "s/^pruning-interval *=.*/pruning-interval = \"10\"/" $HOME/.layer/config/app.toml
config.toml Settings
# Add peer list
PEERS="[email protected]:26656,[email protected]:41767,[email protected]:41656,[email protected]:51656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656,[email protected]:26656"
sed -i -e "s/^persistent_peers *=.*/persistent_peers = \"$PEERS\"/" $HOME/.layer/config/config.toml
# Other settings
sed -i -e "s/^cors_allowed_origins *=.*/cors_allowed_origins = [\"*\"]/" $HOME/.layer/config/config.toml
sed -i -e "s/^timeout_commit *=.*/timeout_commit = \"1s\"/" $HOME/.layer/config/config.toml
sed -i -e "s/^indexer *=.*/indexer = \"kv\"/" $HOME/.layer/config/config.toml
client.toml Settings
sed -i -e "s/^chain-id *=.*/chain-id = \"tellor-1\"/" $HOME/.layer/config/client.toml
sed -i -e "s/^keyring-backend *=.*/keyring-backend = \"test\"/" $HOME/.layer/config/client.toml
7. Wallet Creation
# Create new wallet (save your seed phrase!)
layerd keys add wallet --keyring-backend test
# Display wallet address
layerd keys show wallet -a --keyring-backend test
8. Ethereum RPC Settings
# Get API key from Alchemy or Infura and replace
ETH_RPC_URL="wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY"
# Add environment variables
cat << EOF >> ~/.bashrc
export ETH_RPC_URL="$ETH_RPC_URL"
export ETH_RPC_URL_PRIMARY="$ETH_RPC_URL"
export ETH_RPC_URL_FALLBACK="${ETH_RPC_URL/wss/https}"
export TOKEN_BRIDGE_CONTRACT="0x5589e306b1920F009979a50B88caE32aecD471E4"
EOF
source ~/.bashrc
9. Cosmovisor Installation
# Install Cosmovisor
go install cosmossdk.io/tools/cosmovisor/cmd/cosmovisor@latest
# Environment variables
cat << 'EOF' >> ~/.bashrc
export DAEMON_NAME=layerd
export DAEMON_HOME=$HOME/.layer
export DAEMON_RESTART_AFTER_UPGRADE=true
export DAEMON_ALLOW_DOWNLOAD_BINARIES=false
export DAEMON_POLL_INTERVAL=300ms
export UNSAFE_SKIP_BACKUP=true
export DAEMON_PREUPGRADE_MAX_RETRIES=0
EOF
source ~/.bashrc
# Create directory structure
mkdir -p $HOME/.layer/cosmovisor/genesis/bin
cp /usr/local/bin/layerd $HOME/.layer/cosmovisor/genesis/bin/
chmod +x $HOME/.layer/cosmovisor/genesis/bin/layerd
# Test
cosmovisor version
10. Snapshot Download (Fast Sync)
# Clean data directory
rm -rf $HOME/.layer/data
layerd tendermint unsafe-reset-all --home $HOME/.layer/ --keep-addr-book
# Download snapshot (30+ GB, be patient)
echo "Downloading snapshot..."
SNAP_NAME=$(curl -s https://ss.tellor.nodestake.org/ | egrep -o ">20.*\.tar.lz4" | tr -d ">")
curl -o - -L https://ss.tellor.nodestake.org/${SNAP_NAME} | lz4 -c -d - | tar -x -C $HOME/.layer
echo "Snapshot successfully loaded!"
11. Create Systemd Service
sudo tee /etc/systemd/system/tellor.service > /dev/null <<EOF
[Unit]
Description=Tellor Layer Node
After=network-online.target
[Service]
User=$USER
WorkingDirectory=$HOME
ExecStart=$HOME/go/bin/cosmovisor run start --home $HOME/.layer --keyring-backend test --key-name wallet --api.enable --api.swagger
Restart=always
RestartSec=3
LimitNOFILE=65535
Environment="DAEMON_NAME=layerd"
Environment="DAEMON_HOME=$HOME/.layer"
Environment="DAEMON_RESTART_AFTER_UPGRADE=true"
Environment="DAEMON_ALLOW_DOWNLOAD_BINARIES=false"
Environment="ETH_RPC_URL=$ETH_RPC_URL"
Environment="ETH_RPC_URL_PRIMARY=$ETH_RPC_URL"
Environment="ETH_RPC_URL_FALLBACK=${ETH_RPC_URL/wss/https}"
Environment="TOKEN_BRIDGE_CONTRACT=0x5589e306b1920F009979a50B88caE32aecD471E4"
[Install]
WantedBy=multi-user.target
EOF
# Start service
sudo systemctl daemon-reload
sudo systemctl enable tellor
sudo systemctl start tellor
12. Check Node Status
# Watch logs
sudo journalctl -u tellor -f
# Wait 30 seconds, then check status
sleep 30
curl -s localhost:45657/status | jq '.result.sync_info | {height: .latest_block_height, catching_up: .catching_up}'
# Check peer count
curl -s localhost:45657/net_info | jq -r '.result.n_peers'
# Check current block height
curl -s https://mainnet.tellorlayer.com/rpc/status | jq -r '.result.sync_info.latest_block_height'
13. Validator CreationPrerequisites
Node must be fully synced (catching_up: false)
Minimum 1 TRB token required
Bridge your TRB tokens from https://bridge.tellor.io
Validator Creation Steps1. Balance Check
# Show wallet address
layerd keys show wallet -a --keyring-backend test
# Check balance (minimum 1 TRB = 1000000 loya required)
layerd query bank balances $(layerd keys show wallet -a --keyring-backend test)
2. Create Validator JSON File
# Get your validator public key
VALIDATOR_PUBKEY=$(layerd tendermint show-validator)
# Create validator JSON file (edit information)
cat > tellor-validator.json << EOF
{
"pubkey": $VALIDATOR_PUBKEY,
"amount": "1000000loya",
"moniker": "YOUR_VALIDATOR_NAME",
"identity": "YOUR_KEYBASE_ID",
"website": "YOUR_WEBSITE",
"security": "YOUR_EMAIL",
"details": "YOUR_VALIDATOR_DESCRIPTION",
"commission-rate": "0.1",
"commission-max-rate": "0.2",
"commission-max-change-rate": "0.01",
"min-self-delegation": "1"
}
EOF
3. Create Validator
# Create validator with JSON file (fee is mandatory!)
layerd tx staking create-validator tellor-validator.json \
--from=wallet \
--chain-id=tellor-1 \
--keyring-backend=test \
--fees="10000loya" \
-y
4. Check Validator Status
# Get your validator address
VALOPER=$(layerd keys show wallet --bech val -a --keyring-backend test)
# Check validator info
layerd query staking validator $VALOPER
# Check on explorer
echo "Explorer: https://tellorexplorer.com/validators/$VALOPER"
Useful CommandsService Management
sudo systemctl stop tellor # Stop
sudo systemctl start tellor # Start
sudo systemctl restart tellor # Restart
sudo systemctl status tellor # Check status
sudo journalctl -u tellor -f # Watch logs
Wallet Operations
# Wallet list
layerd keys list --keyring-backend test
# Wallet address
layerd keys show wallet -a --keyring-backend test
# Balance check
layerd query bank balances $(layerd keys show wallet -a --keyring-backend test)
Node Information
# Sync status
layerd status 2>&1 | jq '.SyncInfo.catching_up'
# Node ID
layerd status 2>&1 | jq '.NodeInfo.id'
# Validator info
layerd query staking validator $(layerd keys show wallet --bech val -a --keyring-backend test)
Validator Operations
# Unjail
layerd tx slashing unjail \
--from wallet \
--chain-id tellor-1 \
--keyring-backend test \
--fees="10000loya" \
-y
# Delegate (stake tokens)
layerd tx staking delegate $(layerd keys show wallet --bech val -a --keyring-backend test) 1000000loya \
--from wallet \
--chain-id tellor-1 \
--keyring-backend test \
--fees="10000loya" \
-y
TroubleshootingNode not starting
# Check logs
sudo journalctl -u tellor -n 100
# Check port conflicts
sudo lsof -i :45657
Slow synchronization
# Check peer count (should be 10+)
curl -s localhost:45657/net_info | jq -r '.result.n_peers'
# Download new snapshot
sudo systemctl stop tellor
rm -rf $HOME/.layer/data
# Repeat snapshot download step
Validator not visible
# Check jail status
layerd query staking validator $(layerd keys show wallet --bech val -a --keyring-backend test) | jq '.jailed'
# Check if TX was successful
layerd query tx TX_HASH
Important Notes
🔴 Always save your seed phrase in a secure location!
🟡 Ethereum RPC requires Alchemy or Infura API key
🟢 Edit CUSTOM_PORT value to change ports
🔵 Minimum 1 TRB (1000000 loya) required for validator
⚪ Gas fee is mandatory (--fees="10000loya")
🟣 Snapshot download is 30+ GB, be patient
Last updated