Repository navigation
Bittensor Operations
This guide details operating procedures, command references, and telemetry monitoring for URNetwork Connect nodes participating in Bittensor Subnet 25.
URNetwork Connect providers operate on a dual-incentive model:
- Network Provider Traffic: Direct bandwidth earnings based on billable byte delivery and client session routing.
- Bittensor Subnet 25 Incentive Pool: On-chain emissions distributed proportionally to verified miners based on Merkle-proven bandwidth scores across finalized payout epochs.
-
Network Account Token (
jwt): The provider authenticates to the URNetwork control plane using a signed JWT stored at~/.urnetwork/jwt(or container volume/home/urnet/.urnetwork/jwt). -
Claim Coldkey (
ss58): Bittensor coldkey address (prefix42, e.g.5FjfHgd4K3H5Vge2igPtBYyWRbRKdgH84roTCnWwwtNgAhU5) registered with the platform to authorize and receive pool emissions. -
Mirror Account: EVM smart contract accounts mirrored on Subtensor via
evm:<H160_address>hash derivation for non-custodial claims.
Subnet 25 operates a two-channel architecture under a hard 256-UID metagraph ceiling (urfoundation/sn WHITEPAPER ยง8.4, ยง11.4; protocol/policy.go):
256 >= (Top-Level Head Miners ~200) + (NO-Pool UIDs) + (Validator UIDs)
The 41% miner emission is divided into two distinct processes:
| Dimension | Tail Providers (Pool Process) | Top ~200 Fleets (Head Miner Process) |
|---|---|---|
| On-Chain Identity |
No UID. Operates as a client_id inside an operator's pool. |
Holds its own Subnet 25 Miner UID (claimed via burned_register). |
| Scoring Basis | Demand-coupled: deposit ร quality across the operator's pool. |
Pure measured routable-IP breadth (score(u) = ฮฃ 1/claim(h) across verified /29 IPv4 & /48 IPv6 subnets). |
| Emission & Payout |
Custodied in EVM Contract (STSubnet.sol). Requires Merkle inclusion proofs. |
Native Bittensor Protocol Emission via Yuma Consensus credited as ฮฑ stake directly to the coldkey. |
| Payout Timing | Finalized once per epoch (~7 days / 50,400 blocks). | Deposited every block (~12 seconds). |
| Gas & Claiming |
Manual Claim Required: Operators submit an on-chain claimMiner transaction and pay gas. |
Zero Gas, Zero Claims: Automated native emission. No EVM contract claims, no Merkle trees. |
| Intermediary | Operator commits the Merkle payout root (auditable on-chain). | Trust-minimized: Direct consensus-to-coldkey. No operator in the payout path. |
| Setup Required | Linked via POST /sn/wallet (or provider wallet set). |
Requires Dual-Signed Fleet Binding (provider bind-head) linking provider server keys to the Bittensor Substrate hotkey. |
| Lifecycle Tournament | The Baseline On-Ramp: Guaranteed floor without UID registration burn. | The Merit Apex: Earns directly while in the top 200. If IP breadth falls below the cutoff, it is evicted by Yuma churn and falls back into the pool. |
Before claiming Subnet 25 emissions, link your Bittensor coldkey to your network account using any of the following methods.
Run this single command on the machine running your provider:
curl -s -X POST "https://api.bringyour.com/sn/wallet" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(cat ~/.urnetwork/jwt)" \
-d '{"coldkey_ss58": "5FjfHgd4K3H5Vge2igPtBYyWRbRKdgH84roTCnWwwtNgAhU5"}'Returns {} on success.
Note
This is the same unsigned request that provider wallet set sends. The platform is moving wallet binding to a signed consent, and whether it still accepts the unsigned request is a server-side policy. If it is refused, set the wallet in the URnetwork app or web account.
# Register coldkey for the local provider
provider wallet set 5FjfHgd4K3H5Vge2igPtBYyWRbRKdgH84roTCnWwwtNgAhU5provider wallet set and provide --wallet=<coldkey> send the unsigned network wallet request, which the platform may refuse under its signed wallet rules. Without --legacy-network-wallet they do not send it: wallet set exits 1, and provide logs the refusal and keeps providing. Set the wallet in the URnetwork app or web account, or add --legacy-network-wallet to send the unsigned request anyway.
Pass your coldkey directly via docker-compose.yml or container flags:
services:
provider:
image: ghcr.io/full-bars/meso-miner:latest
command: ["provide", "--wallet=5FjfHgd4K3H5Vge2igPtBYyWRbRKdgH84roTCnWwwtNgAhU5", "--legacy-network-wallet"]
volumes:
- ur_config_1:/home/urnet/.urnetworkIf you are used to Web3 dApps prompting your browser extension (like Talisman, SubWallet, Polkadot{.js}, or MetaMask) to approve transactions, you might wonder why linking your wallet here didn't trigger a popup:
-
Linking your wallet (Step 1 โ Direct Deposit Setup):
- Think of this like giving an employer your account number for direct deposit.
- You are only telling URNetwork where to send your rewards. Because sharing a public wallet address cannot move or spend funds from your wallet, no signature, password, or browser wallet popup is required.
- The system verifies your node using your local authentication file (
~/.urnetwork/jwt).
-
Claiming your rewards (Step 2 โ Withdrawing Tokens):
- This is where your browser wallet extension is used.
- At the end of every reward cycle (epoch), emissions are calculated and locked on the blockchain. When you go to claim those tokens to your wallet on the web dashboard or portal, your browser wallet extension will pop up and ask you to click Approve / Sign to finalize the on-chain transfer.
Use sn-status to inspect your global ranking, bandwidth delivery, coldkey linkage, and Top 200 cutoff eligibility in real time without exposing credentials in the process table.
# Host CLI (systemd / bare-metal)
urnet-tools sn-status
# Docker CLI (delegates directly into running container)
urnet-docker sn-status
# Provider binary directly
provider sn-status
# JSON format for monitoring agents and Prometheus scrapers
urnet-tools sn-status --jsonโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
URNetwork Subnet 25 โ Node & Miner Status
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Provider: urnetwork.service (State: /var/lib/urnetwork)
Network: miner-node-01 (f078e470-36d0-48e0-bb15-b5d1e2e9c1aa)
Global Rank: #7 [Public] โ Tier 1 Elite (Rank #7 Globally)
Net Bandwidth: 1,234,567.89 MiB (1205.63 GiB) provided
Coldkey (SS58): 5FjfHgd4K3H5Vge2igPtBYyWRbRKdgH84roTCnWwwtNgAhU5
Coldkey (Hex): 0xa21b...
Subnet Epoch: #1054 (Start: #1054000, Finalize: #1054720)
Contract: 0x5FbDB2315678afecb367f032d93F642f64180aa3 (Chain ID: 964)
Payout Share: 4.85% (485 bps in Epoch #1053)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- Tier 1 Elite (Rank 1โ10): Top global emission allocation; highest validator query preference.
- Tier 2 High-Volume (Rank 11โ50): High yield; fast validator probe acceptance.
- Tier 3 Active (Rank 51โ200): Subnet 25 emission cutoff eligibility boundary.
- Unranked / Sub-200: Displays exact distance to Top 200 emission threshold.
Subnet 25 uses cryptographic Merkle tree payout roots committed on-chain at the conclusion of each epoch.
-
Active Epoch (
$e$ ): Nodes stream billable bandwidth; validators collect signed trails. - Commit Window: Validator consensus commits the payout root hash.
-
Dispute / Finalization: Payout root is locked on-chain (
finalize_block). - Claim Window: Verified claims become redeemable.
provider claim authenticates with the login of a client that served traffic, because only such a client has a payout. Pass exactly one of:
| Flag | Credential |
|---|---|
--store-client=<key> |
The client token of one identity in ~/.urnetwork/.client_jwts.json. The key is a proxy address or direct. Pick an identity that served traffic. |
--provider-jwt=<path> |
A client token in a file. |
--legacy-coldkey=<coldkey_ss58> |
The network token plus this coldkey. Only for an epoch without a provider artifact. |
The network token alone is refused, and so is an expired client token (start the provider so it renews, or pass a fresher file). A command with no credential flag exits 1 and names these options. The examples below show --store-client=direct; substitute your own credential flag.
Generates ABI-encoded calldata and cryptographic inclusion proofs without exposing private keys on the provider host:
provider claim --store-client=direct --epoch=1053Output yields ready-to-submit calldata compatible with snclaim or web3 wallets.
Submit the claim transaction directly with a local private key file and RPC endpoint:
provider claim \
--store-client=direct \
--epoch=1053 \
--rpc=https://rpc.subtensor.network \
--key_file=/path/to/coldkey_evm.keySimulate verification and root matching without broadcasting transactions:
provider claim --store-client=direct --epoch=1053 --rpc=https://rpc.subtensor.network --dry-runHead nodes aggregate proofs from client nodes for on-chain batch verification.
provider bind-head \
--manifest=<fleet_manifest_file> \
--hotkey_seed_file=<sr25519_seed_file> \
--valid_from_epoch=<n> --valid_to_epoch=<n> \
[--client_id=<hex16>] [--client_seed_file=<file>] \
[--rpc=<rpc_url>]... [--key_file=<key_file>] [--dry-run]Important
The retired --hotkey / --registrant / --contract flags are gone. The binding now reads the fleet manifest (coordinator, chain id, netuid, members) and binds the sr25519 hotkey whose seed file you pass โ the seed must match the manifest hotkey, and the command rejects a mismatch. Seed files must be regular files readable only by their owner. Without --key_file the command prints the calldata for offline broadcast; with --key_file it submits through --rpc.
provider unbind-head \
--manifest=<fleet_manifest_file> \
--effective_epoch=<n> \
[--client_id=<hex16>] [--client_seed_file=<file>] \
[--offline] [--rpc=<rpc_url>]... [--key_file=<key_file>] [--dry-run]Tip
The command is air-gapped-friendly, but signing without an on-chain cross-check is explicit: without --rpc pass --offline, and the output warns that the generation and effective epoch were not verified against any coordinator (labelled offline (local domain)). Re-run with --rpc to cross-check the coordinator's canonical digest before broadcasting, and pass --key_file to submit.
-
Never pass tokens via CLI flags: Avoid passing tokens in process flags (
-jwt=...or-pass=...) where they are visible inps auxor/proc/<pid>/cmdline. -
File Permissions: Ensure
~/.urnetwork/jwtand private keys are set to0600permissions. -
Container Isolation: Ensure each container mount uses a dedicated Docker volume (e.g.
ur_config_1,ur_config_2) to prevent state corruption.