摘要
在 Bittensor 上挖矿 TAO 不是工作量证明哈希。你在子网上注册一个热键,运行一个矿工来产生该子网奖励的任务,并保持链连接足够健康以设置权重、领取排放,并在被注销时重新注册。这个循环的链上部分是大多数矿工亏损的地方:在设置权重或注册期间 RPC 连接断开可能会让你损失整个 tempo 的排放。
本文关注挖矿 TAO 的运营方面:矿工实际与什么通信,注册和注销如何工作,哪些 RPC 调用重要,以及如何在运行自己的 Subtensor 节点和使用托管的 Bittensor RPC 端点(如 OnFinality)之间做出决定。它补充了更广泛的 Bittensor 挖矿和节点文章,而不是重复它们。
在 Bittensor 上挖矿 TAO 通常被描述为“挖矿”,但没有任何哈希运算。没有工作量证明谜题,也没有 GPU 竞赛来寻找区块。Bittensor 矿工是一个在子网上注册热键、产生该子网奖励的任何输出,然后依赖链对其进行评分、加权并以 TAO 排放支付的过程。如果你来自比特币或以太坊挖矿,这种思维模型是错误的,而且这种错误很重要:你的瓶颈很少是原始计算能力,而是保持注册并按时设置权重。
这就是为什么本文首先将挖矿 TAO 视为运营问题,其次才是建模问题。模型是你的业务,链连接是你的正常运行时间。
当你“挖矿”TAO 时实际发生了什么
Bittensor 子网是一个竞争市场。矿工提交工作,验证者对该工作进行评分,链将这些分数转换为排放。当以下三个条件同时满足时,你的矿工赚取 TAO:
- 你的热键已在子网上注册(你持有 UID)。
- 你的矿工在子网的 tempo 窗口内响应验证者查询。
- 验证者正在设置反映你分数的权重,并且这些权重上链。
打破其中任何一个,你的排放在该 tempo 内将归零。注册是人们低估的部分。每个子网有固定数量的 UID,因此注册意味着出价高于当前持有你想要的位置的人。如果你的矿工表现不佳,你将被注销,你的位置将被回收给新的注册者。重新注册需要再次花费 TAO。
所以真正的挖矿循环是这样的:注册、运行、获得评分、设置权重、收集排放、监控注销、必要时重新注册。除了模型本身,一切都在 RPC 上运行。
决策指南:自建 Subtensor 节点还是托管 Bittensor RPC?
在调整模型之前,决定你的矿工如何连接到链。这是最影响你的矿工是否保持在线的一个选择。
| 情况 | 自托管 Subtensor 节点 | 托管 Bittensor RPC |
|---|---|---|
| 你运行一个矿工并希望今天开始 | 同步时间和磁盘成本是前置的;你可能需要等待才能首次注册 | 你可以立即将矿工指向端点并在同一天注册 |
| 你运行许多矿工或许多子网 | 一个节点可以服务许多热键,但你要承担所有故障模式 | 每个热键可以共享一个托管端点;故障转移是提供商的问题 |
| 你需要归档或历史质押数据 | 你必须运行归档节点并管理其存储 | 在承诺之前检查提供商是否暴露归档式查询 |
| 你需要在 tempo 边界低延迟设置权重 | 本地节点避免网络跳数,但前提是它健康 | 附近的管理端点加上重试逻辑通常胜过不健康的本地节点 |
| 你在实验且对成本敏感 | 硬件和同步时间是成本 | 按需付费 RPC 保持固定成本低 |
一个实用的中间路径:运行本地 Subtensor 节点用于开发和读取链状态,并使用托管端点作为你的生产矿工和验证者脚本实际依赖的连接。OnFinality 通过 HTTP 和 WebSocket 暴露 Bittensor Finney 端点,这涵盖了矿工最常用的两种访问模式:一次性 extrinsic 和基于订阅的区块监视。查看 Bittensor Finney 网络页面 获取当前端点详情,以及 RPC 定价 如果你想根据热键数量估算成本。
注册、注销以及重要的调用
大多数 Bittensor 工具包装了这些调用,但了解它们有助于调试。链是 Subtensor,它暴露了 Substrate 风格的 JSON-RPC 接口。
| 任务 | 你调用什么 | 为什么对矿工重要 |
|---|---|---|
| 检查你在子网上的 UID | 通过 Bittensor SDK 的 neuronInfo / uid 查询,由 state_getStorage 支持 | 在花时间调整之前确认你仍然注册 |
| 读取当前注册成本 | 子网上的 burn / recycle 值 | 告诉你现在重新注册的成本 |
| 注册热键 | burnedRegister extrinsic | 你的位置生效的时刻;如果这在 tempo 中途失败,你会失去时间 |
| 作为验证者设置权重 | set_weights extrinsic | 如果这没有上链,你评分的矿工什么也得不到,你也是 |
| 监视新区块 | 通过 WebSocket 的 chain_subscribeNewHeads | 让你的矿工在 tempo 边界做出反应,而不是盲目轮询 |
| 检查你的余额 | system_accountNextIndex 和余额查询 | 防止连续发送多个 extrinsic 时 nonce 冲突 |
两种故障模式经常出现。第一,nonce 冲突:如果你连续发送注册和设置权重 extrinsic,它们可能共享一个 nonce,其中一个被丢弃。第二,过时读取:如果你的端点落后于链头,你可能认为你已注册但实际上没有,或者针对旧 tempo 设置权重。
以下是一个最小健康探测,你可以在将矿工指向任何 Bittensor 端点之前运行:
curl -s -X POST https://bittensor-finney.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "chain_getHeader",
"params": []
}'
如果返回最近的区块头,则端点可达并跟随链。在信任它进行权重设置之前,将区块号与第二个来源进行比较。
将矿工连接到 WebSocket 端点
需要在 tempo 边界行动的矿工和验证者应该订阅而不是轮询。WebSocket 连接让你在新头到达时做出反应,这正是当权重设置窗口打开时你想要的。
import { ApiPromise, WsProvider } from "@polkadot/api";
const provider = new WsProvider(
"wss://bittensor-finney.api.onfinality.io/public-ws"
);
const api = await ApiPromise.create({ provider });
// React to each new block head instead of polling on a timer.
const unsubscribe = await api.rpc.chain.subscribeNewHeads((header) => {
const blockNumber = header.number.toNumber();
console.log("new head", blockNumber);
// Your tempo logic goes here: check UID, check stake,
// decide whether this is the block to set weights.
});
// Always keep a handle so you can unsubscribe cleanly on shutdown.
process.on("SIGINT", async () => {
await unsubscribe();
await api.disconnect();
process.exit(0);
});
两个操作注意事项。第一,将订阅视为可恢复的:如果套接字断开,使用退避重连而不是让矿工崩溃。第二,不要假设一个连接足以支持一组热键。单个 WebSocket 可以承载许多订阅,但单点故障仍然是单点故障。
矿工实际在哪里损失排放
大多数“挖矿 TAO”问题不是模型问题。它们是以下问题,大致按发生频率排序:
- 静默注销。 你的 UID 被回收,你的矿工继续针对它不再拥有的位置运行。定期轮询你的 UID 并在变化时发出警报。
- 权重设置从未上链。 extrinsic 已提交但未包含,通常是由于 nonce 冲突或费用不足。确认包含,而不仅仅是提交。
- 端点漂移。 你的节点或端点落后于链头。针对过时视图设置权重比完全不设置权重更糟。
- 注册成本意外。 回收成本随需求变化。将重新注册作为经常性成本预算,而不是一次性费用。
- 密钥管理错误。 热键之所以是热的,是有原因的。保持冷键离线,绝不让矿工进程持有超出需要的权限。
一个有用的习惯是为每个 tempo 记录三个数字:你的 UID、你行动的链头,以及你的 extrinsic 是否被包含。当排放下降时,这三个数字通常会告诉你遇到了上述哪种故障模式。
为生产矿工选择端点
如果你正在为 Bittensor 矿工评估 RPC 选项,标准比一般的 dApp 清单更窄。你关心:
| 检查什么 | 为什么矿工关心 |
|---|---|
| HTTP 和 WebSocket 支持 | Extrinsic 需要 HTTP;tempo 边界逻辑需要 WebSocket |
| 链头新鲜度 | 过时读取导致错误的权重设置和虚假的注册检查 |
| 归档可用性 | 如果你回测评分或重建历史质押,则需要 |
| 故障转移行为 | 无法重连的矿工损失一个 tempo,而不是一个请求 |
| 速率和并发限制 | 一组热键会倍增你的请求量 |
| 如何付费 | 按请求定价比固定层级更适合突发矿工流量 |
OnFinality 提供 Bittensor Finney 访问作为托管 RPC API,对于运行许多热键或子网的团队,专用节点基础设施 消除了嘈杂邻居效应并为你提供私有端点。如果你更广泛地比较提供商,RPC 提供商选择指南 涵盖了通用评估框架,支持的 RPC 网络 列出了当前可用的内容。
一个适用于每个提供商(包括我们)的警告:不要假设公共端点是验证者权重设置路径的正确归宿。公共端点是共享的。如果你的排放依赖于特定 extrinsic 在特定窗口内上链,请相应地规划你的计划和故障转移。
一个现实的第一周计划
如果你从零开始,一个避免常见陷阱的顺序:
- 选择一个子网,在编写任何代码之前阅读其激励机制。
- 运行本地 Subtensor 节点或将开发矿工指向托管端点以学习注册流程。
- 注册一个热键并观察一个完整的 tempo 周期,不做任何更改。记录你的 UID、分数和排放。
- 在添加第二个热键之前,添加对 UID 变化和链头新鲜度的监控。
- 只有在那之后才扩展到多个热键,并在那时决定共享还是 专用基础设施 符合你的风险承受能力。
第三步是人们跳过的,也是教你子网实际奖励什么的一步。
关键要点
- Bittensor 挖矿是注册加评分加设置权重,而不是工作量证明哈希。
- 你的排放取决于保持注册和按时设置权重;链连接是运营风险。
- HTTP 处理 extrinsic,WebSocket 处理 tempo 边界反应;生产矿工通常两者都需要。
- Nonce 冲突和过时链读取是错过排放的两个最常见原因。
- 托管的 Bittensor RPC 端点是生产矿工的合理默认;本地节点对于开发和深度调试仍然有用。
- 将重新注册作为经常性成本预算,并将你的 UID 作为一等指标监控。
常见问题
挖矿 TAO 和比特币挖矿一样吗?
不。没有工作量证明。你在子网上注册一个热键,产生该子网奖励的输出,验证者对其进行评分。排放来自分数和权重,而不是哈希率。
我需要运行自己的 Subtensor 节点来挖矿 TAO 吗?
不一定。许多矿工使用托管 RPC 端点进行链连接,只运行矿工进程本身。本地节点对于开发、回测和调试(当你怀疑端点落后于链头时)仍然有用。
如果我的矿工离线会发生什么?
你在这段时间内停止被评分,如果你表现不佳足够长,你可能会被注销。重新注册需要花费 TAO,因此链连接的正常运行时间有直接成本。
我可以为多个热键使用一个 RPC 端点吗?
技术上可以,但要注意并发和速率限制。如果你的排放依赖于及时的权重设置,考虑共享访问还是 专用基础设施 更符合你的风险承受能力。
我在哪里可以找到 Bittensor 端点详情?
Bittensor Finney 的当前 HTTP 和 WebSocket 端点列在 Bittensor Finney 网络页面 上。对于多个热键的成本规划,请参阅 RPC 定价。