The Big Picture
Axons are how neurons expose their services to the network. When validators want to query miners for inference (or any subnet-specific task), they look up the miner's Axon to get the IP/port. This is the discovery layer that makes Bittensor's machine learning marketplace actually work.
Why This Matters
You want to query a miner? You need their endpoint. Axons tell you where each neuron lives on the internet - IP address, port, and protocol version. Essential for any validator or client.
Example Scenario
Query Axons(netuid=1, uid=47) returns { ip: '1.2.3.4', port: 8091, ip_type: 4, version: 670, protocol: 4, placeholder1: 0, placeholder2: 0 }. Connect to 1.2.3.4:8091 to reach this miner.
Common Questions
- What if Axon shows 0.0.0.0?
- The neuron hasn't set their serving info, or is intentionally not serving. They won't receive queries and may have lower performance scores.
- How do I update my Axon?
- Use the serve_axon extrinsic to update your endpoint info. Subject to ServingRateLimit.
- What's the version field?
- Protocol version for compatibility. Validators may reject connections from outdated versions.
- Is there a rate limit on updates?
- Yes, check ServingRateLimit for how often you can update your Axon info.
Use Cases
- Connect to a miner's inference endpoint
- Build service discovery for subnet clients
- Monitor which neurons are actively serving
- Debug connectivity issues between neurons
- Create subnet health dashboards showing online neurons
From Chain Metadata
MAP ( netuid, hotkey ) --> axon_info
Purpose & Usage
Purpose
Store endpoint information (IP, port, protocol) for neuron communication.
Common Query Patterns
- Query by netuid-uid for a specific neuron's endpoint
- Iterate all to discover available services
- Verify neuron is serving before queries
Query Keys
Stored Value
axon_info (AxonInfo)
Relationships
Modified By
Related Events
Code Examples
import { createClient, Binary } from "polkadot-api";
import { getWsProvider } from "polkadot-api/ws";
import { sub } from "@polkadot-api/descriptors"; // generated by: npx papi add sub -w wss://entrypoint-finney.opentensor.ai:443
const client = createClient(getWsProvider("wss://entrypoint-finney.opentensor.ai:443"));
const api = client.getTypedApi(sub);
// Query Axons storage
const netuid = 1;
const hotkey = "5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY";
const result = await api.query.SubtensorModule.Axons.getValue(netuid, hotkey);
console.log("Axons:", result);On-Chain Activity
1M–10M estimated writes
#22 most written storage item
Modified via user-submitted extrinsics
As of block 7,429,232
Version History
Runtime Info
View Source- Pallet
- SubtensorModule
- Storage Kind
- Map
- First Version
- v101
- Current Version
- v411