Talero Miner / Pool Guide
Mining-oriented node guide with mainnet safety guards
Mining Operations

Run a Talero miner or pool node

The Talero miner role enables mining RPC methods and mining-oriented runtime behavior. This guide covers two safe deployment patterns: a private miner node and a pool-facing work server. It avoids publishing real allowlists, admin RPC ranges, or other sensitive infrastructure details.

Miner Pool-facing RPC Mainnet guard rails No public admin ACLs

Mainnet miner mode is intentionally guarded. The node refuses to start as a miner unless the operator explicitly sets TALERO_MINER_ACK_MAINNET=1 and provides a coinbase address.

Choose a mode

Mode Use it when Key setting
Private miner node You control the miner and do not expose work RPC publicly. Keep mining RPC private and use tight network exposure.
Pool-facing work server You need getWork / submitWork for upstream pool infrastructure. Expose only the intended mining edge, keep admin and trusted tiers private, and document public-safe quotas only.

The mining role enables mining RPC methods independently from the internal automatic block producer. That is why a pool-facing node can still use TALERO_DISABLE_MINING=1 while serving work RPC.

Requirements

  • A Linux host with persistent storage for /data.
  • Docker Engine and Docker Compose plugin.
  • The Talero node repository or release bundle.
  • Canonical mainnet identity material: TALERO_EXPECTED_CHAIN_ID, TALERO_EXPECTED_GENESIS_HASH, TALERO_GENESIS_TIMESTAMP_SECS, and the approved bootnode list.
  • A reward destination for TALERO_COINBASE.
  • A clear decision about whether the node runs private mining only or serves pool-facing work RPC.

Install Docker on Ubuntu

If the host is fresh, use Docker's official Ubuntu flow. For updates or distro-specific changes, verify against the official Docker Engine install guide for Ubuntu.

sudo apt-get update
sudo apt-get install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Prepare the deployment files

sudo mkdir -p /opt/talero
sudo chown "$USER":"$USER" /opt/talero
cd /opt/talero

# Place the Talero node release or repository here
# Required files include:
#   Dockerfile
#   docker-compose.mainnet.yml
#   docs/
#   tools/
cd /opt/talero/node
docker compose -f docker-compose.mainnet.yml build

Mainnet guards

Mining on mainnet requires more than the generic node startup checks. The code refuses to start in miner mode unless you explicitly acknowledge the role and set a coinbase address.

  • Set TALERO_MINER_ACK_MAINNET=1.
  • Set TALERO_COINBASE=tlro:0xYOUR_REWARD_ADDRESS.
  • Set the expected mainnet chain identity values.
  • Set the canonical bootnode list.

Miners also wait for peers by default when bootnodes are configured. Do not force solo-style behavior with emergency-only flags unless you are deliberately running an isolated rehearsal.

Ports and host mapping

If the miner or pool node shares a host with another Talero node, use distinct host ports. The example below maps host 8548 to container 8547 and host 30305 to container 30303.

cd /opt/talero/node
cat > docker-compose.mainnet.miner-ports.yml <<'EOF'
services:
  talero-node:
    ports:
      - "127.0.0.1:8548:8547"
      - "30305:30303"
      - "30305:30303/udp"
EOF

This keeps RPC local to the host while exposing the P2P address on a dedicated public port. If you build a public mining edge, do it through a deliberate front-end or reverse proxy, not by publishing unrestricted raw node RPC.

Create the miner environment file

cd /opt/talero/node
cat > .env.mainnet.miner <<'EOF'
TALERO_NETWORK=mainnet
TALERO_ROLE=miner
TALERO_ROLE_STRICT=1
TALERO_MINER_ACK_MAINNET=1

# Canonical chain identity from the approved mainnet release process
TALERO_EXPECTED_CHAIN_ID=REPLACE_WITH_CHAIN_ID
TALERO_EXPECTED_GENESIS_HASH=0xREPLACE_WITH_CANONICAL_GENESIS_HASH
TALERO_GENESIS_TIMESTAMP_SECS=REPLACE_WITH_CANONICAL_GENESIS_TIMESTAMP

# Reward destination
TALERO_COINBASE=tlro:0xYOUR_REWARD_ADDRESS

# RPC inside the container
TALERO_RPC_LISTEN=0.0.0.0:8547
TALERO_RPC_PUBLIC_MODE=1
TALERO_RPC_READONLY=0
TALERO_RPC_MINING_PUBLIC_ENABLED=0
TALERO_RPC_TRUST_X_FORWARDED_FOR=0

# P2P
TALERO_P2P_LISTEN=0.0.0.0:30303
TALERO_P2P_SELF_ADDR=YOUR_PUBLIC_IP:30305
TALERO_BOOTNODES=BOOTNODE_A:30303,BOOTNODE_B:30303

# Mining mode
TALERO_DISABLE_MINING=1

# Runtime hardening
TALERO_EVM_ENABLED=1
TALERO_EVM_REPLAY_ON_STARTUP=1
TALERO_EVM_REPLAY_STRICT_STARTUP=1
TALERO_SAFE_MODE_ENABLED=1
TALERO_SAFE_MODE_MANUAL_OVERRIDE=auto
TALERO_LOG=info
TALERO_LOG_FORMAT=json
EOF

When to change TALERO_DISABLE_MINING

  • TALERO_DISABLE_MINING=1: recommended starting point for a pool-facing work server.
  • TALERO_DISABLE_MINING=0: use this if you intentionally want the internal producer active.

This guide intentionally omits concrete values for TALERO_RPC_ADMIN_CIDRS, TALERO_RPC_TRUSTED_CIDRS, TALERO_RPC_MINING_CIDRS, and trusted proxy CIDRs. Those are sensitive infrastructure controls and belong in private operations docs.

Mining RPC surfaces

The miner role enables mining RPC methods. The public-safe method overview is:

Method Purpose Notes
eth_getWork Ethereum-style work template Returns [powHash, seedHash, boundary].
talero_getWork Talero work template Mining-oriented RPC for Talero work distribution.
talero_submitWork Submit work result Use this, not eth_submitWork.
talero_miningStats Mining and rate-limit telemetry Useful for pool dashboards and worker monitoring.

eth_submitWork is not supported. The node explicitly instructs callers to use talero_submitWork(jobId, nonce, mixHash) instead.

Start the miner or pool node

cd /opt/talero/node
TALERO_ENV_FILE=.env.mainnet.miner \
docker compose \
  -f docker-compose.mainnet.yml \
  -f docker-compose.mainnet.miner-ports.yml \
  up -d
cd /opt/talero/node
TALERO_ENV_FILE=.env.mainnet.miner \
docker compose \
  -f docker-compose.mainnet.yml \
  -f docker-compose.mainnet.miner-ports.yml \
  logs -f talero-node

Verify node health

curl -sS http://127.0.0.1:8548/health | jq '{
  ok,
  network,
  role,
  head,
  sync,
  p2p
}'
curl -sS -X POST http://127.0.0.1:8548/rpc \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"talero_miningStats","params":{}}' | jq '.result'
curl -sS -X POST http://127.0.0.1:8548/rpc \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":2,"method":"eth_getWork","params":[]}'
  • role should be "miner".
  • talero_miningStats.enabled should be true.
  • publicMiningEnabled should match your intended exposure model.
  • If the node is waiting for peers, confirm bootnodes and P2P reachability before forcing anything.

Upgrade flow

cd /opt/talero/node
tar -C ./data -czf miner-backup-$(date -u +%Y%m%d-%H%M%S).tgz .

docker compose -f docker-compose.mainnet.yml build

TALERO_ENV_FILE=.env.mainnet.miner \
docker compose \
  -f docker-compose.mainnet.yml \
  -f docker-compose.mainnet.miner-ports.yml \
  up -d

Troubleshooting

Error shape Likely cause Fix
requires TALERO_MINER_ACK_MAINNET=1 Miner mode was not explicitly acknowledged. Set TALERO_MINER_ACK_MAINNET=1.
mainnet miner mode requires TALERO_COINBASE No coinbase address was configured. Set a valid reward destination.
Method not found for mining RPC The node is not running in miner role. Set TALERO_ROLE=miner and restart.
Mining stays paused waiting for peers Bootnodes are configured but the node has not reached the network yet. Fix P2P connectivity instead of forcing solo behavior.
cd /opt/talero/node
TALERO_ENV_FILE=.env.mainnet.miner \
docker compose \
  -f docker-compose.mainnet.yml \
  -f docker-compose.mainnet.miner-ports.yml \
  logs --tail=200 talero-node