Bittensor is a decentralized machine learning network where many independent "subnets" compete to produce useful work. Each subnet is identified by a number called a netuid. When people ask about "Subnet 123," they are asking about the subnet registered under that netuid on the Bittensor chain.
The short answer: Subnet 123 is a specific subnet on Bittensor, defined by its netuid, its incentive mechanism, and the miners and validators registered to it. It is not a single fixed product with a permanent description, because subnets evolve and their purpose is set by the people who build and operate them. What stays stable is the on-chain identity: the netuid, the stake, the registration cost, and the emission flow.
If you are a developer, the useful question is not only "what is it" but "how do I read its state and connect to it." This page answers both, then shows how to query Bittensor through an RPC endpoint.
How to read Subnet 123 from the chain
Before you integrate with any subnet, confirm what it actually is on-chain rather than relying on a description you read somewhere. Bittensor stores subnet metadata and hyperparameters in chain state, and you can read them through the Subtensor RPC interface.
The most reliable path is to query the chain directly. On Bittensor Finney, the mainnet, you can use a public RPC endpoint:
curl -s https://bittensor-finney.api.onfinality.io/public \
-H 'Content-Type: application/json' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "chain_getHeader",
"params": []
}'
That confirms you are talking to the right chain. To inspect subnet-specific data, you query the Subtensor runtime storage for the netuid you care about. The exact storage keys and method names depend on the runtime version, so check the current Subtensor metadata rather than hardcoding assumptions.
A practical checklist for identifying a subnet:
| What to confirm | Where to look | Why it matters |
|---|---|---|
| Netuid and subnet identity | Subtensor subnet storage | Confirms you are reading the right subnet |
| Incentive mechanism | Subnet hyperparameters and docs | Tells you what miners and validators actually do |
| Registration cost | Subnet registration storage | Affects whether you can join as a miner |
| Emission and stake | Chain state and staking data | Shows how rewards flow |
| Owner and operators | On-chain account data | Helps you assess who runs it |
If a subnet's purpose is unclear from on-chain data alone, treat the subnet's own documentation and community channels as the source of truth for its task definition. On-chain data tells you the mechanics; the operators define the mission.
When you need an RPC endpoint versus your own node
This is the decision most builders face early. You have three broad options for reading Bittensor state and interacting with subnets.
- Public RPC endpoint. Fastest way to start. Good for dashboards, scripts, testing, and light production reads. You share capacity with other users, so treat it as a starting point rather than a guarantee for heavy or latency-sensitive workloads.
- Dedicated node. You get isolated capacity for your own application. This fits indexers, high-frequency polling, validator tooling, and anything where shared public capacity becomes a bottleneck.
- Self-hosted node. Maximum control, but you own the hardware, sync, upgrades, and monitoring. This is a real operational commitment for a Substrate-based chain like Bittensor.
A simple way to decide:
| Your situation | Reasonable starting point |
|---|---|
| Exploring Subnet 123 for the first time | Public RPC endpoint |
| Building a dashboard or bot with steady traffic | Managed RPC API, then scale |
| Running validator or miner infrastructure | Dedicated node |
| Need full control and have ops capacity | Self-hosted node |
OnFinality provides a Bittensor Finney RPC endpoint plus dedicated node options if you outgrow shared access. You can compare plans on the RPC pricing page and see other chains on the supported RPC networks list.
Connecting to Bittensor Finney
Bittensor mainnet is called Finney. The native token is TAO, with 9 decimals. If you are wiring up a client, these are the settings you need.
| Setting | Value |
|---|---|
| Network | Bittensor Finney Mainnet |
| Native token | TAO (9 decimals) |
| HTTP RPC | https://bittensor-finney.api.onfinality.io/public |
| WebSocket RPC | wss://bittensor-finney.api.onfinality.io/public-ws |
| Transports | HTTP and WebSocket |
Because Bittensor is a Substrate-based network, you interact with it using Substrate JSON-RPC methods rather than EVM methods like eth_call. That distinction trips up developers who are used to Ethereum-style tooling.
A minimal WebSocket connection in JavaScript looks like this:
const WebSocket = require('ws');
const ws = new WebSocket('wss://bittensor-finney.api.onfinality.io/public-ws');
ws.on('open', () => {
ws.send(JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'chain_getBlockHash',
params: []
}));
});
ws.on('message', (data) => {
console.log('Block hash:', data.toString());
ws.close();
});
If you use a Substrate client library, point it at the same endpoint and let the library handle metadata and storage queries. That is usually cleaner than hand-rolling JSON-RPC calls for subnet storage.
Common mistakes when working with subnets
A few issues come up repeatedly when developers first touch Bittensor subnets.
-
Assuming EVM methods work. Bittensor is Substrate-based. Methods like
eth_getBalanceare not the right tool. Use Substrate RPC and storage queries. - Hardcoding netuid assumptions. Subnet hyperparameters and storage layouts can change between runtime upgrades. Read metadata instead of assuming a fixed schema.
- Confusing subnet identity with subnet purpose. The netuid is stable; the subnet's task and community can change. Verify both on-chain data and the subnet's own docs.
- Ignoring registration cost. If you plan to register as a miner, the cost is dynamic and set by the subnet. Check it before committing.
- Treating a public endpoint as unlimited. Shared endpoints are fine for exploration, but production workloads should plan for dedicated capacity.
Debugging connection problems
When a Bittensor RPC call fails, work through it in order rather than guessing.
| Symptom | Likely cause | Next step |
|---|---|---|
| Connection refused | Wrong URL or transport | Confirm HTTP vs WebSocket and the exact path |
| Method not found | Using EVM-style methods | Switch to Substrate JSON-RPC methods |
| Empty or null result | Wrong storage key or netuid | Re-read runtime metadata |
| Timeouts under load | Shared endpoint saturation | Move to a dedicated node |
| Stale block height | Client caching or wrong chain | Re-query chain_getHeader
|
A quick health probe is to request the latest header and compare the block number to a block explorer. If the height is moving, your connection is live. If it is frozen, you are likely pointed at a stale or misconfigured endpoint.
Operating Subnet 123 tooling in production
Once you move past exploration, reliability becomes the main concern. A few practices help:
- Separate read and write paths. Read-heavy dashboards and write-heavy registration or staking flows have different needs. Do not assume one endpoint configuration fits both.
- Add failover. Configure a secondary endpoint so a single connection issue does not take down your service.
- Monitor block height and response time. These two signals catch most connectivity problems early.
- Plan for runtime upgrades. Substrate chains upgrade regularly. Test against the current runtime before deploying.
- Track subnet-specific metrics. Registration cost, emission, and stake are the numbers your users will ask about.
If you are running validator or miner infrastructure tied to a subnet, a dedicated node gives you predictable capacity and isolates you from noisy neighbors on shared endpoints.
Key Takeaways
- Bittensor Subnet 123 is a specific subnet identified by its netuid on the Bittensor chain, not a fixed product name.
- On-chain data tells you the mechanics: netuid, registration cost, stake, and emissions. The subnet's own docs define its task.
- Bittensor is Substrate-based, so you use Substrate JSON-RPC methods, not EVM methods.
- Bittensor mainnet is Finney, with TAO as the native token at 9 decimals.
- Start with a public RPC endpoint for exploration, then move to a dedicated node for production workloads.
- OnFinality offers Bittensor Finney RPC access; see RPC pricing and supported RPC networks for options.
Frequently Asked Questions
What is Bittensor Subnet 123?
It is the subnet registered under netuid 123 on the Bittensor network. Its purpose is defined by the people who operate it, while its on-chain identity, stake, and emissions are readable from chain state.
Is Subnet 123 a token or a chain?
Neither. A subnet is a numbered incentive mechanism running on the Bittensor chain. It uses TAO for staking and registration, but it is not a separate chain or a standalone token.
How do I connect to Bittensor to read Subnet 123 data?
Use a Bittensor Finney RPC endpoint. OnFinality provides HTTP and WebSocket access at the Bittensor Finney network page. Query Subtensor storage for the netuid you want.
Can I use Ethereum tools like ethers.js on Bittensor?
Not directly. Bittensor is Substrate-based, so you need Substrate-compatible tooling and JSON-RPC methods rather than EVM methods.
Do I need my own node to work with a subnet?
For exploration and light production, a managed RPC endpoint is usually enough. For heavy polling, indexing, or validator and miner infrastructure, a dedicated node is the more practical choice.
How do I know if a subnet is worth building on?
Check its registration cost, emission flow, stake distribution, and operator activity on-chain, then read its documentation to understand the task. On-chain mechanics plus operator intent together tell the real story.
Related resources
- Bittensor Finney RPC
- RPC pricing
- Supported RPC networks
- Dedicated nodes
- How to choose an RPC provider
Originally published at OnFinality.
Top comments (0)