Skip to main content

๐Ÿš€ Miner Initialization and Metadata Registration

Goal Unit Ini

Setelah unit ini kamu akan:

  • Konfigurasi .env file dengan semua secret (API keys, wallet paths)
  • Register metadata (sports & leagues yang kamu cover) ke subnet
  • Launch miner process untuk pertama kali dan lihat log validator query masuk
  • Setup PM2 atau systemd supaya miner running 24/7 dan auto-restart
  • Tahu cara monitor health & log rotation
Prasyarat
  • โœ… Unit 4 โ€” Almanac Registration selesai โ€” binding sukses
  • โœ… Sportstensor repo sudah cloned di ~/bittensor/sportstensor
  • โœ… config.yaml valid
  • โœ… Port 8091 (atau sesuai config) accessible dari internet
  • โœ… (Opsional tapi recommended) API key dari sports data provider โ€” The Odds API free tier gratis, Sportradar trial berbayar

๐Ÿ—‚๏ธ Step 1 โ€” Setup File .envโ€‹

Secret dan config runtime sebaiknya tidak di config.yaml. Pakai .env supaya tidak ter-commit.

cd ~/bittensor/sportstensor
cp .env.example .env # kalau ada; kalau tidak buat manual
nano .env

Contoh isi:

# === Wallet (optional, override config.yaml) ===
BT_WALLET_NAME=sn41_miner
BT_WALLET_HOTKEY=miner_01
BT_WALLET_PATH=/home/ubuntu/.bittensor/wallets

# === Subnet ===
BT_NETUID=41
BT_NETWORK=finney # finney = mainnet; 'test' = testnet

# === Endpoint (miner listens here) ===
MINER_HOST=0.0.0.0
MINER_PORT=8091
MINER_EXTERNAL_IP=203.0.113.42
MINER_EXTERNAL_PORT=8091

# === Sports Data APIs ===
ODDS_API_KEY=your_odds_api_key_here
SPORTRADAR_API_KEY=your_sportradar_key_here # optional

# === Logging ===
LOG_LEVEL=debug
LOG_DIR=./logs
.env = rahasia

Pastikan .env ada di .gitignore. API key bocor = billing kamu jebol.

echo ".env" >> .gitignore

Checkpointโ€‹

set -a; source .env; set +a
echo "Netuid: $BT_NETUID โ€” Hotkey: $BT_WALLET_HOTKEY"

๐Ÿท๏ธ Step 2 โ€” Register Metadata (Sports Coverage)โ€‹

Subnet butuh tahu sport apa yang kamu predict supaya validator route query yang relevan saja.

Jalankan metadata registrationโ€‹

Command exact bervariasi per repo โ€” umum:

python scripts/register_metadata.py \
--wallet.name sn41_miner \
--wallet.hotkey miner_01 \
--sports "mlb,nba,nfl,soccer" \
--netuid 41

Atau via CLI package:

sportstensor-miner metadata \
--sports mlb,nba,nfl,soccer

Apa yang terjadiโ€‹

  1. Script build payload: {hotkey, sports: [...], model_version: "x.y.z"}
  2. Sign dengan hotkey
  3. Submit ke metadata endpoint (bisa on-chain commitment atau almanac)
  4. Dapat konfirmasi

Output suksesโ€‹

[metadata] Registering sports: ['mlb', 'nba', 'nfl', 'soccer']
[metadata] Model version: sportstensor-miner 2.1.0
[metadata] โœ… Metadata commit successful
tx_hash / commit_ref: 0x9f3e...abcd
Start narrow, ekspansi nanti

Kalau baru belajar, pick satu sport dulu (misal mlb saja). Fokus optimasi satu domain > jadi jack-of-all-trades-prediksi-jelek. Tambah sport setelah CLV positif.


๐Ÿ Step 3 โ€” Launch Miner Process (Foreground Dulu)โ€‹

Jalankan di foreground dulu untuk verify semua berjalan:

cd ~/bittensor/sportstensor
source ~/bittensor/venv/bin/activate

python neurons/miner.py \
--netuid 41 \
--wallet.name sn41_miner \
--wallet.hotkey miner_01 \
--axon.port 8091 \
--axon.external_ip 203.0.113.42 \
--logging.debug

Log yang sehat (contoh awal)โ€‹

2026-04-14 10:30:12 | INFO     | Loading wallet sn41_miner/miner_01
2026-04-14 10:30:13 | INFO | Connected to subtensor finney (netuid 41)
2026-04-14 10:30:14 | INFO | Metagraph synced. UID=142. N_miners=256
2026-04-14 10:30:14 | INFO | Axon listening on 0.0.0.0:8091 (external: 203.0.113.42:8091)
2026-04-14 10:30:15 | INFO | Miner ready. Waiting for validator queries...

Query pertama masuk (bisa beberapa menit sampai jam)โ€‹

2026-04-14 10:47:02 | DEBUG    | [validator 5Gh...abc UID=7] Query received
event_id=mlb_2026_04_14_NYY_BOS sport=mlb kickoff=2026-04-14T19:05:00Z
2026-04-14 10:47:03 | DEBUG | Prediction generated: home_win=0.58 confidence=0.72
2026-04-14 10:47:03 | INFO | Response sent to validator 5Gh...abc in 247ms
Tidak ada query dalam 1 jam?

Normal di awal โ€” validator kadang query dalam batch. Tunggu hingga 4 jam. Kalau tetap sepi:

  • Verify almanac binding aktif
  • Cek metagraph โ€” pastikan UID kamu masih terdaftar
  • Cek port reachable dari internet

Stop (Ctrl+C) setelah yakin log sehat.โ€‹


๐Ÿ”„ Step 4 โ€” Jalankan 24/7 dengan PM2โ€‹

PM2 = process manager Node.js yang juga jalan untuk Python. Auto-restart kalau crash, log rotation built-in.

Install PM2โ€‹

# butuh Node.js
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install -g pm2

Start miner via PM2โ€‹

cd ~/bittensor/sportstensor
pm2 start neurons/miner.py \
--name sn41-miner \
--interpreter ~/bittensor/venv/bin/python \
-- \
--netuid 41 \
--wallet.name sn41_miner \
--wallet.hotkey miner_01 \
--axon.port 8091 \
--axon.external_ip 203.0.113.42 \
--logging.debug
Perhatikan -- double dash

Flag sebelum -- untuk PM2. Flag sesudah -- diteruskan ke script Python.

Kontrol PM2โ€‹

pm2 status              # list semua process
pm2 logs sn41-miner # tail log realtime
pm2 logs sn41-miner --lines 100 # last 100 lines
pm2 restart sn41-miner # restart
pm2 stop sn41-miner # stop (tidak delete)
pm2 delete sn41-miner # hapus dari PM2

Persist across rebootโ€‹

pm2 save
pm2 startup
# ikuti instruksi output (copy-paste command `sudo env PATH=... pm2 ...`)

Setelah ini, miner auto-start tiap server reboot.

Checkpointโ€‹

pm2 status

Expected:

โ”Œโ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ id โ”‚ name โ”‚ mode โ”‚ status โ”‚ cpu โ”‚ memory โ”‚ โ†บ โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ 0 โ”‚ sn41-miner โ”‚ fork โ”‚ online โ”‚ 1.2% โ”‚ 215mb โ”‚ 0 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”˜

status: online + restart count 0 = sehat.


๐Ÿ› ๏ธ Step 4b (Alternatif) โ€” systemdโ€‹

Kalau prefer native systemd:

sudo nano /etc/systemd/system/sn41-miner.service

Isi:

[Unit]
Description=Sportstensor SN41 Miner
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/bittensor/sportstensor
Environment="PATH=/home/ubuntu/bittensor/venv/bin:/usr/bin:/bin"
EnvironmentFile=/home/ubuntu/bittensor/sportstensor/.env
ExecStart=/home/ubuntu/bittensor/venv/bin/python neurons/miner.py \
--netuid 41 \
--wallet.name sn41_miner \
--wallet.hotkey miner_01 \
--axon.port 8091 \
--axon.external_ip 203.0.113.42 \
--logging.debug
Restart=always
RestartSec=10
StandardOutput=append:/var/log/sn41-miner.log
StandardError=append:/var/log/sn41-miner.err.log

[Install]
WantedBy=multi-user.target

Aktifkan:

sudo systemctl daemon-reload
sudo systemctl enable sn41-miner
sudo systemctl start sn41-miner
sudo systemctl status sn41-miner
sudo journalctl -u sn41-miner -f # tail log

๐Ÿ‘€ Step 5 โ€” Monitoring & Health Checksโ€‹

A. Tail log realtimeโ€‹

pm2 logs sn41-miner --lines 50
# atau
tail -f ~/bittensor/sportstensor/logs/miner.log

B. Simple watcher scriptโ€‹

Buat scripts/watch.sh:

#!/bin/bash
while true; do
echo "=== $(date) ==="
echo "Process:"
pm2 jlist | python3 -c "import sys,json; d=json.load(sys.stdin); m=[x for x in d if x['name']=='sn41-miner']; print('status:', m[0]['pm2_env']['status'] if m else 'NOT FOUND')"
echo "Metagraph (emission & trust):"
btcli subnet metagraph --netuid 41 2>/dev/null | grep "<hotkey_prefix>"
echo
sleep 300
done

C. Query counterโ€‹

Grep log untuk hitung query per jam:

grep "Query received" logs/miner.log | wc -l

D. Dashboard (opsional advanced)โ€‹

  • Grafana + Prometheus โ€” kalau miner expose /metrics endpoint
  • Sportstensor public leaderboard โ€” cek rank miner kamu (URL lihat dokumentasi resmi)

๐Ÿงช Checkpoint Validation Komprehensifโ€‹

Setelah 2โ€“6 jam running, verifikasi:

CheckCommandExpected
Process alivepm2 statusonline + restart 0
Ada query masukgrep "Query received" logs/miner.log | tailMinimal 1 entry
Response berhasilgrep "Response sent" logs/miner.log | wc -l> 0
Tidak ada error cascadegrep -i "error|exception" logs/miner.logRare / none
Trust/Rank mulai non-zero (setelah 24โ€“48 jam)btcli subnet metagraph --netuid 41Trust > 0
Screenshot untuk graduation

Simpan:

  1. Output pm2 status
  2. 20โ€“30 line log yang menunjukkan Query received + Response sent
  3. btcli subnet metagraph --netuid 41 dengan UID kamu terlihat

๐Ÿ—ƒ๏ธ Log Rotation & Disk Hygieneโ€‹

Log debug bisa tumbuh cepat. PM2 built-in rotation:

pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 50M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true

Atau manual via logrotate:

sudo nano /etc/logrotate.d/sn41-miner
/home/ubuntu/bittensor/sportstensor/logs/*.log {
daily
rotate 14
compress
missingok
notifempty
copytruncate
}

๐Ÿ› Error Umum & Solusiโ€‹

Error logArtiFix
Axon port already in usePort 8091 dipakai proses lainlsof -i :8091 โ†’ kill atau ganti port
Wallet not foundPath wallet salahCek BT_WALLET_PATH; default ~/.bittensor/wallets
UID not in metagraphBelum ter-register / deregisteredBalik ke Unit 3
Connection refused to subtensorEndpoint chain downCoba fallback: --subtensor.chain_endpoint wss://entrypoint-finney.opentensor.ai:443
Timeout waiting for queryNormal kalau masih baruTunggu sampai 4 jam; verify almanac
OOM killedRAM kurangUpgrade VPS atau tune model batch size
Validator ping 404 di /healthEndpoint belum implement health checkBukan blocker; tapi implement helps debugging

๐ŸŽฏ Rangkumanโ€‹

  • โœ… Setup .env dengan secret (API keys, paths)
  • โœ… Register metadata sports coverage ke subnet
  • โœ… Launch miner di foreground, verify log sehat
  • โœ… Migrasi ke PM2/systemd untuk 24/7 operation
  • โœ… Monitor log + setup log rotation
  • โœ… Paham health check & common error remediation

โœ… Quick Checkโ€‹

  1. Kenapa .env terpisah dari config.yaml?
  2. Apa gunanya metadata registration selain almanac binding?
  3. PM2 vs systemd โ€” kapan pilih mana?
  4. Kenapa log rotation penting untuk miner production?
  5. Setelah 6 jam run, angka apa di metagraph yang menandakan miner kamu sudah mulai di-score?

๐Ÿ› Troubleshootingโ€‹

GejalaSolusi
PM2 tidak restart setelah rebootJalankan ulang pm2 save && pm2 startup
Log tidak ke-rotateInstall pm2-logrotate plugin
Disk penuh mendadakCheck du -sh logs/ โ€” biasanya log debug yang biang kerok
Query masuk tapi response timeoutHandler kamu terlalu lama โ€” tune di Unit 6
Validator beda-beda kirim versi query berbedaUpdate repo ke versi terbaru (git pull)
Monitor, jangan pasrah

Miner yang di-"set and forget" sering underperform karena validator update protokol dan kamu ketinggalan. Minimal cek log 1ร— per hari minggu pertama.


Next: Unit 6 โ€” Programmatic Trade Execution โ†’