摘要
BNB Smart Chain (BSC) JSON-RPC 端点是您的应用指向以读取链状态和提交交易的 HTTP 或 WebSocket URL。对于主网,您需要链 ID 56、BNB 原生货币和可靠的 RPC URL;对于测试网,您使用链 ID 97 和 tBNB。本页涵盖确切的链设置、钱包和代码配置、您最常调用的 JSON-RPC 方法,以及如何调试首先出现的错误。它还解释了何时共享公共端点足够,以及何时专用 BNB Chain 节点更合适。
如果您正在将钱包、脚本或后端服务连接到 BNB Smart Chain,首先需要一个可用的 JSON-RPC 端点以及正确的链设置。把这两件事做对,大多数“无法连接”的问题就会消失。做错了,您会花一下午追逐那些实际上只是链 ID 不匹配或端点过时的错误。
本页先给出设置,然后是方法,最后是调试路径。它是为已经了解 JSON-RPC 是什么、想要 BSC 特定细节而无需重读通用介绍的开发者编写的。
链设置一览
在将 BNB Smart Chain 添加到钱包、框架配置或后端客户端时,请使用这些值。主网和测试网的值不同,混合使用它们是最常见的设置错误。
| 设置 | BNB Smart Chain 主网 | BNB Smart Chain 测试网 |
|---|---|---|
| 链 ID | 56 | 97 |
| 链名称 | BNB Smart Chain Mainnet | BNB Smart Chain Testnet |
| 原生货币 | BNB(18 位小数) | tBNB(18 位小数) |
| 区块浏览器 | https://bscscan.com | https://testnet.bscscan.com |
| RPC URL | https://bnb.api.onfinality.io/public | https://bnb-testnet.api.onfinality.io/public |
| 传输 | HTTP 和 WebSocket | HTTP |
主网在 OnFinality 端点上同时支持 HTTP 和 WebSocket 传输,如果您依赖 eth_subscribe 等订阅来获取新区块或待处理日志,这一点很重要。测试网仅支持 HTTP,因此轮询是那里的正确模式。
如果您需要不同的网络或想比较选项,支持的 RPC 网络页面列出了可用的网络,BNB Chain RPC 有网络特定的详细信息。
为您的负载选择正确的端点
在复制 URL 之前,先决定您要发送什么样的流量。适用于周末原型的端点并不总是您想要的生产服务背后的端点。
- 只读脚本和仪表板。 共享公共端点通常没问题。您以低频率发送
eth_call、eth_getBalance和eth_blockNumber。 - 有真实用户的钱包和 dApp。 您需要可预测的吞吐量和不会在您脚下改变的 URL。具有稳定主机名的托管 RPC API 是更安全的默认选择。
- 扫描日志的索引器、机器人和后端。 在宽区块范围上调用
eth_getLogs是 BSC 上最重的常见调用。这是共享端点开始吃力的地方,专用节点在这里证明了自己的价值。 - 任何需要订阅的东西。 如果您依赖 WebSocket 推送而不是轮询,在围绕它构建之前,请确认您的端点确实支持
ws。
一个快速的判断方法:如果您的应用在端点对您限流时失败,说明您已经超出了共享层级。OnFinality 提供托管的 RPC API 服务 和 专用节点,当您需要隔离容量时。您可以在 RPC 定价 页面查看这些如何映射到成本。
配置钱包或客户端
大多数钱包接受自定义网络。字段直接映射到上面的表格。在代码中,相同的值放入您的客户端构造函数。
对于指向 BSC 主网的 viem 客户端:
import { createPublicClient, http } from 'viem';
import { bsc } from 'viem/chains';
const client = createPublicClient({
chain: bsc,
transport: http('https://bnb.api.onfinality.io/public'),
});
const block = await client.getBlockNumber();
console.log('Latest BSC block:', block);
如果您更喜欢原始 JSON-RPC,相同的调用看起来像这样:
curl -s https://bnb.api.onfinality.io/public \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
两者都返回最新区块高度作为十六进制字符串。如果这能工作,您的端点和链设置就是正确的,您可以继续处理应用实际需要的方法。
您最常调用的 JSON-RPC 方法
BSC 与 EVM 兼容,因此方法集是标准的以太坊 JSON-RPC 接口。在实践中,少数几个调用完成了大部分工作。
| 方法 | 用途 | 注意事项 |
|---|---|---|
eth_blockNumber | 健康检查和同步位置 | 开销低;适合首次连接测试 |
eth_getBalance | 原生 BNB 余额 | 传入您想要的区块标签,不总是 latest |
eth_call | 无需交易读取合约状态 | 需要正确的 to、data 和区块标签 |
eth_getLogs | 拉取地址或主题的事件 | 宽范围是超时的首要原因 |
eth_getTransactionReceipt | 确认交易并读取其日志 | 在交易被挖出之前返回 null |
eth_sendRawTransaction | 广播已签名交易 | 需要正确签名、正确 nonce 的交易 |
eth_subscribe | 通过 WebSocket 推送新区块或日志 | HTTP 端点无法做到这一点 |
对于 eth_getLogs,保持区块范围适中并进行分页。针对共享端点调用数万个区块的范围通常会失败,即使端点健康,因为节点必须扫描大量状态才能回答。
调试您实际会看到的错误
大多数 BSC JSON-RPC 问题归结为少数几种症状。匹配症状,然后应用修复。
| 症状 | 可能原因 | 修复 |
|---|---|---|
钱包中 chainId 不匹配 | 选择了错误的网络 | 设置链 ID 56(主网)或 97(测试网) |
eth_getLogs 超时 | 区块范围太宽 | 缩小范围、分页或迁移到专用节点 |
null 收据 | 交易尚未被挖出 | 轮询 eth_getTransactionReceipt 直到非空 |
nonce too low | 重复使用或过时的 nonce | 使用 pending 重新读取 eth_getTransactionCount |
eth_subscribe 失败 | 端点仅支持 HTTP | 使用支持 WebSocket 的端点 |
| 429 或限流 | 共享端点负载过高 | 添加重试/退避或迁移到专用容量 |
| 连接被拒绝 | 错误的主机或网络 | 重新检查 URL 和链设置表 |
其中两个值得仔细看看。首先,nonce 错误:当您重新发送交易时,使用 pending 区块标签读取账户 nonce,而不是 latest,否则您会不断与自己进行中的交易冲突。其次,限流:429 不是您代码中的错误,而是容量信号。对于偶发突发,使用指数退避重试,但如果它在正常流量上发生,共享层级就不适合该工作负载。
有关 nonce 行为的更深入讲解,请参阅区块链交易中的 nonce 是什么。
一个最小的监控探针
在责怪您的应用之前,确认端点健康。一个检查区块高度和延迟的简短探针会告诉您问题是端点还是您的代码。
async function probe(url) {
const start = Date.now();
const res = await fetch(url, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0', id: 1, method: 'eth_blockNumber', params: [],
}),
});
const { result } = await res.json();
const height = parseInt(result, 16);
console.log('height', height, 'roundtrip', Date.now() - start, 'ms');
}
probe('https://bnb.api.onfinality.io/public');
定期运行此探针并记录高度。停止增长的高度是一个明确的信号,而往返时间向上漂移则告诉您端点承受压力,在用户注意到之前。
何时离开共享端点
没有一个数字说“现在切换”,但信号是一致的。当以下情况发生时,您就准备好使用专用容量了:
- 在正常、非突发流量上遇到限流。
- 在您需要的范围上
eth_getLogs持续超时。 - 您需要 WebSocket 订阅,并希望它们与其他租户隔离。
- 您想要一个稳定、私有的端点,而不是共享的公共 URL。
- 您的合规或可靠性要求意味着您不能依赖尽力而为的共享层级。
专用的 BNB Chain 节点为您提供隔离的吞吐量和私有端点。代价是成本以及您现在拥有更多运维表面。如果您不想自己运行节点,托管专用选项可以保持隔离而无需维护。在承诺之前,比较 专用节点 上的形态并查看 RPC 定价。
关键要点
- BSC 主网使用链 ID 56 和 BNB;测试网使用链 ID 97 和 tBNB。混合使用它们是最常见的设置错误。
- 主网支持 HTTP 和 WebSocket;测试网仅支持 HTTP,因此订阅需要支持
ws的端点。 - 在宽范围上调用
eth_getLogs是最重的常见调用,也是共享端点失败的首要原因。 - 429 是容量信号,不是代码错误。对于突发使用退避重试,但如果它在正常流量上发生,请迁移到专用容量。
- 一个简单的区块高度探针可以在几秒钟内将端点问题与应用问题分开。
常见问题
BSC 主网链 ID 是什么? 56。测试网链 ID 是 97。在调试任何其他内容之前,始终确认您的钱包或客户端指向的是哪一个。
我可以对主网和测试网使用同一个端点吗? 不可以。它们是具有不同 URL 和链 ID 的独立网络。对链 ID 56 使用主网 URL,对链 ID 97 使用测试网 URL。
为什么 eth_getLogs 在 BSC 上失败?
通常是因为区块范围太宽,节点无法快速扫描。缩小范围、分页查询或使用具有更多余量的专用节点。
BSC 支持 WebSocket 订阅吗?
主网在 OnFinality 端点上支持,该端点同时支持 HTTP 和 WebSocket。测试网仅支持 HTTP,因此在那里轮询而不是使用 eth_subscribe。
如何知道是否需要专用节点?
如果您在正常流量上看到限流、反复出现 eth_getLogs 超时,或需要隔离的 WebSocket 容量,那么专用节点是合适的下一步。否则,托管的共享端点通常就足够了。
在哪里可以找到当前的端点 URL? 使用 BNB Chain RPC 和 BNB Chain 测试网 RPC 页面获取当前 URL 和设置,其他所有内容请查看支持的 RPC 网络页面。