Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
网络与协议指南阅读约 14 分钟

Bittensor EVM JSON-RPC:使用 TAO 网络的 EVM 层

一份技术指南,介绍 Bittensor 兼容 EVM 的 JSON-RPC 接口、它与 subtensor RPC 的区别,以及如何使用 ethers.js 进行验证。

TL;DR

Bittensor 是一个基于 Substrate 的网络,其主要 JSON-RPC 接口是 subtensor RPC,用于质押、子网管理和元图查询。除此之外,Bittensor 还提供兼容 EVM 的 JSON-RPC 层,遵循以太坊方法词汇,允许 ethers.js、viem 和 web3.js 等工具与 TAO 上的 EVM 风格余额和合约交互。这两个接口是独立的:EVM 层不暴露子网或质押数据,方法可用性、预编译合约和链 ID 参数因 RPC 提供商而异。本指南解释了架构划分,展示了一个可运行的 ethers.js 示例,调用 eth_chainId、eth_blockNumber 和 eth_getBalance,并提供了一个可复现的结果表,以便您验证自己的端点。请始终根据最新的 Bittensor 文档确认链 ID 和端点参数,而不是假设以太坊默认值。

Subtensor RPC 与 EVM 层之间的架构划分

Bittensor 构建在 Substrate 之上,其原生 JSON-RPC 接口是 subtensor RPC。该接口使用 Substrate 风格的方法命名空间,用于质押、子网注册、元图数据和其他链原生操作。如果您来自 Polkadot 或 Kusama 工具生态,subtensor RPC 会感觉很熟悉:它是读写 Bittensor 特定状态的规范方式。

除此之外,Bittensor 还提供兼容 EVM 的 JSON-RPC 接口。该层镜像了 以太坊 JSON-RPC 规范 中定义的方法词汇,因此 eth_chainId、eth_blockNumber 和 eth_getBalance 等调用会按照以太坊工具预期的方式运行。EVM 层不是 subtensor RPC 的替代品;它是一个并行接口,让以太坊原生工具能够与网络的 EVM 部分通信。

实际结果是,单个 Bittensor 节点或提供商端点可能提供其中一个或两个接口。一些公共端点仅暴露 subtensor RPC,一些仅暴露 EVM JSON-RPC,还有一些两者都暴露。在编写集成代码之前,请确认您的端点提供哪个接口。Bittensor RPC 节点指南 深入介绍了 subtensor 侧,而本文重点介绍 EVM 层。

  • Subtensor RPC:用于质押、子网和元图数据的 Substrate 风格方法。
  • EVM JSON-RPC:用于链 ID、区块、余额和 EVM 合约的以太坊风格方法。
  • 端点范围各异:一些提供商提供一个接口,一些提供两个。

为什么 EVM 层对 Bittensor 工具很重要

EVM 层降低了已经使用以太坊工具的团队的集成成本。开发者无需学习 Substrate 特定的方法名和类型编码,只需将 ethers.js、viem 或 web3.js 指向 Bittensor EVM JSON-RPC 端点,即可使用他们在以太坊上使用的相同模式。钱包的“添加网络”流程也变得简单:钱包需要 RPC URL、链 ID 和货币符号,而 EVM 层可以提供所有这些。

这对于 TAO 上的合约部署和 EVM 风格余额读取很重要。如果您的应用程序逻辑是针对 EVM 编写的,您可以在 Bittensor 上重用它,而无需重写传输层。ethers.js 文档 描述了任何兼容 EVM 的 JSON-RPC 端点的标准连接模式,该模式同样适用于此。

然而,EVM 层只是网络的一部分。子网、alpha 代币和质押等 Substrate 原生概念存在于 EVM 命名空间之外。如果您的应用程序需要元图数据或质押操作,您将需要 subtensor RPC。Bittensor subtensor 质押读取路径 一文详细介绍了该读取路径。

  • 无需学习 Substrate 细节即可重用以太坊工具。
  • 在 TAO 上启用 EVM 风格合约和余额读取。
  • 将子网和质押逻辑保留在 subtensor RPC 上。

与以太坊共享的内容和差异

EVM 层与以太坊共享方法词汇和 JSON-RPC 2.0 信封。请求使用相同的 {jsonrpc, method, params, id} 结构,响应遵循相同的 result/error 形状。这由 JSON-RPC 2.0 规范 定义,并反映在以太坊 JSON-RPC 方法中。如果您编写过以太坊客户端,请求格式将完全相同。

不同之处在于链身份和周围网络。链 ID 不是以太坊的链 ID;它是 Bittensor 特有的,必须根据最新的 Bittensor 文档确认。原生代币面额是 RAO/TAO 而不是 ETH,因此 eth_getBalance 返回的余额值以 TAO 的最小单位计价。钱包配置必须反映正确的符号和小数位数。

另一个区别是范围。EVM 接口仅覆盖网络的 EVM 兼容部分。Substrate 原生状态(包括子网和质押头寸)无法通过 EVM 方法访问。如果您调用 EVM 方法期望获取子网数据,您将找不到。Bittensor 文档 是哪些接口被暴露以及它们如何关联的权威来源。

  • 共享:JSON-RPC 2.0 信封和以太坊方法词汇。
  • 不同:链 ID、原生代币面额(RAO/TAO)和网络范围。
  • EVM 不暴露:子网、alpha 代币和质押状态。

钱包如何通过 EVM 视角看待 Bittensor

当您将 Bittensor 添加到 MetaMask 等兼容 EVM 的钱包时,钱包需要三项信息:RPC URL、链 ID 和货币符号。RPC URL 必须指向提供 EVM JSON-RPC 接口的端点。链 ID 必须与 Bittensor EVM 链 ID 匹配,您应从最新的 Bittensor 文档中确认,而不是假设一个值。货币符号通常是 TAO,最小单位是 RAO。

然后钱包将使用标准 EVM 方法显示余额和发送交易。它不知道子网或质押;这些仍然在钱包的 EVM 视图之外。如果您还需要与 subtensor RPC 交互,您将使用单独的工具或端点。Bittensor RPC 指南(RPC 助手) 可以帮助您确定每个接口的正确端点。

一个常见的陷阱是将仅支持 subtensor 的端点用作钱包 RPC URL。钱包将无法连接,因为该端点不提供 eth_* 方法。在将端点添加到钱包之前,请始终验证您选择的端点是否响应 eth_chainId。

  • 钱包需要:RPC URL、链 ID、货币符号。
  • 从最新的 Bittensor 文档确认链 ID;不要假设。
  • 仅支持 subtensor 的端点不能用作钱包 RPC URL。

可运行的 Node.js 示例:使用 ethers.js 连接

以下 Node.js 脚本使用 ethers.js 连接到 Bittensor EVM JSON-RPC 端点。它调用 eth_chainId 和 eth_blockNumber,然后读取给定地址的余额。将 RPC_URL 和 ADDRESS 常量替换为您自己的值。脚本打印链 ID、当前区块号和余额,确认端点正在提供 EVM 接口。

此示例遵循 docs.ethers.org 中记录的标准 ethers.js 连接模式。如果端点不提供 EVM 方法,提供程序调用将抛出错误,这本身就是一个有用的诊断。

// bittensor-evm-check.js
// Run with: node bittensor-evm-check.js

const { ethers } = require("ethers");

// Replace with your Bittensor EVM JSON-RPC endpoint
const RPC_URL = "https://your-bittensor-evm-endpoint";

// Replace with an address you want to inspect
const ADDRESS = "0x0000000000000000000000000000000000000000";

async function main() {
  const provider = new ethers.JsonRpcProvider(RPC_URL);

  const chainId = await provider.send("eth_chainId", []);
  console.log("eth_chainId:", chainId);

  const blockNumber = await provider.getBlockNumber();
  console.log("eth_blockNumber:", blockNumber);

  const balance = await provider.getBalance(ADDRESS);
  console.log("eth_getBalance:", balance.toString());
}

main().catch((err) => {
  console.error("EVM JSON-RPC check failed:", err.message);
  process.exit(1);
});

可运行的 curl 示例:原始 JSON-RPC 请求

如果您希望在没有库的情况下检查原始 JSON-RPC 响应,curl 效果很好。以下命令向您的端点发送 eth_chainId 和 eth_blockNumber。将 URL 替换为您的 Bittensor EVM JSON-RPC 端点。响应应该是一个带有 result 字段的 JSON 对象。

这些原始调用对于故障排除很有用,因为它们显示了确切的请求和响应,包括任何错误对象。如果您收到方法未找到错误,端点可能不提供 EVM 接口。

# Replace with your Bittensor EVM JSON-RPC endpoint
RPC_URL="https://your-bittensor-evm-endpoint"

# eth_chainId
curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'

# eth_blockNumber
curl -s -X POST "$RPC_URL" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":2}'

针对您自己端点的可复现结果表

由于 EVM 方法可用性和链参数因 RPC 提供商而异,您应该针对自己的端点进行测量,而不是依赖通用值。使用下表记录您观察到的内容。“预期”列描述了成功响应的一般形状,而不是特定值。用您端点的实际输出填写“观察”列。

每个方法至少运行两次以确认一致性。如果方法返回错误,请在备注列中记录错误消息。此表将成为您端点 EVM 接口的可复现记录。

  • 方法:eth_chainId | 预期:十六进制字符串链 ID | 观察:[填写] | 端点:[填写] | 备注:[填写]
  • 方法:eth_blockNumber | 预期:十六进制字符串区块号 | 观察:[填写] | 端点:[填写] | 备注:[填写]
  • 方法:eth_getBalance | 预期:以 RAO 为单位的十六进制字符串余额 | 观察:[填写] | 端点:[填写] | 备注:[填写]
  • 方法:eth_getBlockByNumber | 预期:区块对象或 null | 观察:[填写] | 端点:[填写] | 备注:[填写]
  • 方法:net_version | 预期:网络 ID 字符串 | 观察:[填写] | 端点:[填写] | 备注:[填写]

Bittensor EVM 层的限制和权衡

EVM 层不是完整的以太坊等价物。方法可用性与以太坊不同,预编译合约可能不存在或行为不同。一些在以太坊上有效的方法在 Bittensor 上可能返回错误或不支持的响应。这是因提供商而异的记录行为,因此您应该测试应用程序所需的特定方法。

EVM 层不暴露子网或质押数据。如果您的应用程序需要元图信息、alpha 代币余额或质押操作,您必须使用 subtensor RPC。Bittensor subtensor 质押读取路径 一文解释了如何读取该数据。

链 ID 和端点参数必须根据最新的 Bittensor 文档确认,而不是假设。一些公共端点仅提供两个接口中的一个,因此您可能需要为 EVM 和 subtensor 操作使用单独的端点。在比较协议选择时,JSON-RPC vs gRPC vs REST 一文提供了传输权衡的背景。

  • 方法可用性和预编译合约与以太坊不同,并因提供商而异。
  • 通过 EVM 方法无法获取子网或质押数据。
  • 链 ID 和端点参数必须从最新文档确认。
  • 一些端点仅提供一个接口。

排查常见的 EVM JSON-RPC 连接问题

如果您的 ethers.js 脚本因连接错误而失败,首先验证 RPC URL 是否正确且可访问。仅支持 subtensor 的端点不会响应 eth_chainId。尝试上面的 curl 示例查看原始响应。如果您收到方法未找到错误,端点不提供 EVM 接口。

如果返回的链 ID 与您预期的不匹配,不要假设它是错误的。从 Bittensor 文档 确认当前的 Bittensor EVM 链 ID。链 ID 可能会更改,或者测试网和主网之间可能不同。同样,如果余额值看起来不寻常,请记住它们以 RAO(TAO 的最小单位)计价,而不是 TAO 本身。

如果某个特定方法失败而其他方法成功,该方法可能不受您的提供商支持。将其记录在结果表中,并检查是否需要替代方法或提供商。有关 EVM 方法词汇的更广泛参考,请参阅 Monad JSON-RPC 方法参考,其中涵盖了相同的以太坊风格方法集。

  • 验证 RPC URL 可访问并提供 EVM 方法。
  • 方法未找到表示仅支持 subtensor 的端点。
  • 从最新的 Bittensor 文档确认链 ID。
  • 余额以 RAO 为单位,而不是 TAO。

在 Bittensor EVM 上构建的后续步骤

一旦您验证了端点提供 EVM 接口,就可以将其集成到您的应用程序中。像在以太坊上一样使用 ethers.js、viem 或 web3.js。对于合约部署,确保您的工具链配置了正确的链 ID 和 RPC URL。如果可用,先在测试网上测试,然后再上主网。

对于生产工作负载,考虑使用同时提供两个接口的托管 RPC 提供商。OnFinality Bittensor 网络页面 描述了可用的端点和服务。您还可以查看 RPC 定价 和 API 服务 以了解规模和支持选项。

要加深对 subtensor 侧的理解,请阅读 Bittensor RPC 节点指南 和 Bittensor subtensor 质押读取路径。有关 OnFinality Learn 资源的更广泛概述,请访问 OnFinality Learn 中心。

  • 将验证过的 EVM 端点集成到您的应用中。
  • 使用托管提供商实现生产规模。
  • 阅读 subtensor 指南以了解非 EVM 操作。

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始