Loading
Loading
Neuron registration trends
BitAds is a decentralized, proof-of-sale marketing network on Bittensor Subnet 16 where validators score miners based on verified sales, revenue, and refund metrics. Validators collect miner performance data, compute scores using a normalization algorithm with P95 percentiles, apply burn mechanisms, and submit weights to reward miners fairly based on their contribution to campaign performance.
The validator architecture follows a modular, dependency-injection design. The Validator class orchestrates the workflow: (1) syncs metagraph with Bittensor network, (2) checks tempo to determine if weights need updating, (3) fetches campaigns and their mech_ids from external source, (4) for each campaign, creates a ScoreCalculator with scope-specific config (use_soft_cap, use_flooring, weights), fetches miner statistics and P95 percentiles via ValidatorP95Provider, computes scores, and applies burn percentage via ValidatorBurnDataSource, (5) aggregates scores across campaigns weighted by emission_split, (6) submits aggregated weights via ValidatorScoreSink which handles on-chain weight setting and burn distribution. Core components include: DynamicConfigSource (loads config per mech_scope), CampaignSource (loads active campaigns), MinerStatsSource (fetches sales/revenue data), P95Provider (computes percentiles), BurnDataSource (calculates burn percentage dynamically), and ScoreSink (publishes weights to chain).
Metrics are exposed via Prometheus on configurable port (default 9100) for monitoring loop iterations, processing duration, active campaigns, weight submission success, and version tracking.
The scoring algorithm computes: (1) refund_rate = min(1, refund_orders / max(1, sales)), (2) sales_norm = min(1, sqrt(sales) / sqrt(P95_sales)), (3) rev_norm = min(1, ln(1+revenue) / ln(1+P95_revenue)), (4) base_score = 0.15 * sales_norm + 0.85 * rev_norm, (5) final_score = base_score * (1 - refund_rate). Optional soft cap applies 0.3 multiplier if sales < 3. Burn percentage is calculated as: burn = max(0, (emissions_usd - sales_usd * target_ratio) / emissions_usd * 100), where target_ratio is fetched dynamically.
Aggregated scores across multiple campaigns are weighted by emission_split percentages.
The sections above were auto-generated from the GitHub repository and may not reflect the latest changes.
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.
Holder & total-staked metrics as of 1h ago (hourly snapshot)
Miners are off-chain marketing participants; hardware requirements not specified in validator documentation as miners do not run this code.
Minimum 1 core @ 2.6 GHz, 2 cores recommended; no GPU required
Register your hotkey on Bittensor Subnet 16 (mainnet) to enable validation. Use --netuid 368 for testnet.
btcli subnet register --netuid 16
Create directory and download Docker Compose configuration file (recommended method)
mkdir bitads && cd bitads && curl -L -o docker-compose.yml https://raw.githubusercontent.com/FirstTensorLabs/BitAds/refs/heads/main/docker-compose.yml
Copy example environment file and configure WALLET_NAME, WALLET_HOTKEY, NETUID (16 for mainnet, 368 for testnet), SUBTENSOR_NETWORK (finney or test)
cp env.example .env && nano .env
Start validator in background using Docker Compose
docker compose up -d
Monitor validator logs to verify it is syncing and processing campaigns(optional)
docker compose logs -f validator
Alternative manual setup: clone repository, create virtual environment, and install dependencies(optional)
git clone https://github.com/FirstTensorLabs/BitAds && cd BitAds && python3 -m venv venv && source venv/bin/activate && pip install -r requirements.txt
Run validator manually (without Docker); replace wallet name and hotkey with your credentials(optional)
python neurons/validator.py --netuid 16 --subtensor.network finney --wallet.name <YOUR_WALLET> --wallet.hotkey <YOUR_HOTKEY>