Loading
Loading

Neuron registration trends
Marketing teams predict campaign outcomes offline, after-the-fact, or via opaque vendor models. They lack real-time visibility into which changes will work and cannot verify the accuracy of predictions they rely on. Building internal forecasting requires expensive data science teams and produces single-point-of-failure models. A distributed network of independent models can predict campaign outcomes before they're knowable, but only if every prediction is sealed on-chain before outcomes arrive and every score is publicly reproducible. SN21 is a prediction market on Bittensor where miners ship deterministic container models that forecast 7-, 14-, and 28-day campaign deltas as probabilistic distributions. The subnet executes each admitted model daily against real Google Ads account changes in a sandbox, scores predictions transparently once outcomes settle, and publishes every result—prediction, outcome, score component, and formula—so anyone can verify the math. Models that predict best earn emissions. No one, including the operator, can rewrite the score after the fact.
Use cases were auto-generated from the GitHub repository and may not reflect the latest changes.
SN21 is a verifiable prediction market for Google Ads campaign outcomes running on Bittensor. Miners ship digest-pinned container images that predict 7/14/28-day campaign deltas (cost, conversions, efficiency) as P10/P50/P90 distributions. The subnet executes each admitted model daily against real account changes in a sandboxed environment, scores predictions once outcomes settle, and allocates emissions via a published weight curve based on moving-average standing.
All predictions lock before outcomes exist and all scores are reproducibly verifiable from public receipts.
SN21 operates on a daily stream architecture (since 4 Aug 2026): (1) Operator delivers daily baskets of real Google Ads account changes each morning (midnight EST cut-off). (2) Miners pre-commit digest-pinned container images on-chain; images run deterministically in sandbox (--network=none, 1 GB RAM, 15 CPU-min, read-only root). (3) Admitted models execute daily against baskets; predictions lock before outcomes exist. (4) Outcomes settle at 7/14/28 days plus 2-day window; each (episode, horizon) scored once via published formula. (5) Scores feed age-weighted moving-average standings per miner. (6) Standings map through published weight curve to on-chain weights via commit-reveal, driving Bittensor emissions. (7) All receipts (outcomes used, predictions, score components, formula) published and hash-chained; anyone can recompute scores. (8) Validators run three processes: HTTP API (serves episodes + daily feeds), daily loop (settles matured rows, publishes receipt, writes weights), heartbeat (re-asserts weights for ActivityCutoff). (9) Copy detection groups byte-identical and behaviorally-similar models; only earliest commitment earns. (10) Champion seat (who runs live) promoted by stricter rules than who earns weight. Weekly-era (concluded 3 Aug 2026) used sealed TLE prediction bundles and per-epoch scoring; that path remains auditable via verify_epoch.py.
Counterfactual impact prediction for advertising interventions
This information was auto-extracted from the GitHub repository and may be incomplete or out of date. Always refer to the subnet's GitHub repository for the latest instructions.
Daily stream started 4 Aug 2026; weekly epochs concluded 3 Aug 2026. Each day a basket of real Google Ads changes reveals; predictions lock before outcomes exist (midnight EST cut-off). Outcomes settle at 7/14/28 days.
Scoring components: quantile accuracy via pinball loss on P10/P50/P90 (50% weight), interval coverage via convex width penalty (10%), directional agreement on goal metric (15%), goal-metric p50 accuracy (15%), renormalized over 0.90. Absence penalty: every uncovered episode enters standing as full-weight zero. Earning-set tenure: minimum 7 scored days.
Placement floor: 250 prediction-mass evidence. Relative standing method (from 2026-09-05): each entry scored relative to field mean on same (episode, horizon). Copy detection: byte-identical predictions, matching point estimates, and lineage under four-signal behavioral test all grouped under one principal.
Champions protected by five-day-consecutive-win rule. Burn was indicative during cutover; steady-state is 0% (15 Sep 2026 onward).
The sections above were auto-generated from the GitHub repository and may not reflect the latest changes. View repository
FAQs were auto-generated from the GitHub repository and may not reflect the latest changes.
Holder & total-staked metrics as of 1h ago (hourly snapshot)
Sandbox execution: 1 GB RAM, 15 CPU-minutes per daily basket (~250 episodes), read-only filesystem, --network=none. Reference baseline runs on CPU; GPU optional for larger models.
Validator runs three processes: HTTP API (long-lived), daily settle loop (once per day), heartbeat (every 3-4 hours). Requires persistent disk for ledger feeds.
Clone repository and install miner dependencies
git clone https://github.com/ippcteam/SN21-adtao.git && cd SN21-adtao && pip install -e ".[miner]"
Create Bittensor wallet (coldkey and hotkey)
btcli wallet new_coldkey --wallet.name my_miner && btcli wallet new_hotkey --wallet.name my_miner --wallet.hotkey default
Register hotkey on subnet (testnet 466; use netuid 21 for mainnet finney)
btcli subnet register --netuid 466 --wallet.name my_miner --wallet.hotkey default --subtensor.network test
Generate ed25519 signing key for miner identity
python scripts/sn21_keys.py generate --role miner --output ~/sn21-miner.pem
Register ed25519 key binding on chain
python scripts/sn21_keys.py register --role miner --network test --netuid 466 --wallet-name my_miner --wallet-hotkey default --key ~/sn21-miner.pem
Download rich training data v2 (29,129 episodes, all change types, 7/14/28-day outcomes)
curl -L -o SN21_rich_training_v2.jsonl https://github.com/ippcteam/SN21-adtao/releases/download/training-v2-2026-08/SN21_rich_training_v2.jsonl
Train reference XGBoost model on sample data (10 episodes for pipeline check)(optional)
python scripts/train_example_model.py --data-file data/training/training_episodes.json
Build and push container image to registry, record digest
cd reference_model && docker build -t sn21-miner:v1 . && docker push ghcr.io/<you>/sn21-miner:v1
Smoke-test container locally with same flags as subnet sandbox
docker run --rm -i --network=none --memory=1g --read-only sn21-miner:v1 < basket.jsonl > predictions.jsonl
Commit digest on chain: sn21-model:v1:<repo>@sha256:<64hex>
python -c "import bittensor as bt; wallet = bt.wallet(name='my_miner', hotkey='default'); sub = bt.subtensor(network='test'); sub.commit(wallet=wallet, netuid=466, data='sn21-model:v1:ghcr.io/<you>/sn21-miner@sha256:<digest>')"
Clone repository and install full package
git clone https://github.com/ippcteam/SN21-adtao.git && cd SN21-adtao && pip install -e .
Create Bittensor wallet for validator
btcli wallet new_coldkey --wallet.name my_validator && btcli wallet new_hotkey --wallet.name my_validator --wallet.hotkey default
Register validator hotkey on subnet
btcli subnet register --netuid 466 --wallet.name my_validator --wallet.hotkey default --subtensor.network test
Generate ed25519 key for validator
python scripts/sn21_keys.py generate --role validator --output ~/.sn21/keys/validator.pem
Register ed25519 binding on chain
python scripts/sn21_keys.py register --role validator --network test --netuid 466 --wallet-name my_validator --wallet-hotkey default --key ~/.sn21/keys/validator.pem
Process A: Start HTTP API daemon (long-lived) for episodes and daily receipts
export SN21_LEDGER_ROOT=/var/lib/sn21_ledger SN21_ED25519_KEY_FILE=~/.sn21/keys/validator.pem && hope-validator-api --host 0.0.0.0 --port 8080 --network test --netuid 466 --wallet-name my_validator --wallet-hotkey default
Process B: Run daily settle loop (once per day after basket delivery) - OPERATOR ONLY
python3 scripts/run_daily_loop.py --shadow-root /var/lib/sn21_ledger --ledger-root /var/lib/sn21_ledger
Process C: Run activity-floor heartbeat (every 3-4 hours via cron) to prevent ActivityCutoff pruning
hope-validator-heartbeat --network test --netuid 466 --wallet-name my_validator --wallet-hotkey default