摘要
了解如何使用正确的RPC端点、链设置和JSON-RPC方法连接到BNB智能链(BSC)。本参考涵盖公共端点与托管端点、常见故障模式,以及如何为生产工作负载选择基础设施。
快速决策指南:应该使用哪个BNB智能链RPC端点?
在将端点复制到钱包或dApp之前,请决定哪种类型的RPC访问符合您的工作负载。选择会影响可靠性、成本以及您之后需要进行的调试工作量。
- 原型开发或轻度使用: 公共端点(如
https://bnb.api.onfinality.io/public)足以用于钱包设置、小型脚本和测试交易。公共端点是共享的,可能会限制突发流量,因此不适合作为生产应用的稳定基础。 - 生产dApp或索引器: 具有专用吞吐量和支持的托管RPC服务更安全。您可以获得一致的性能、访问归档数据,以及负责节点维护的团队。请参阅 RPC定价 了解选项。
- 高吞吐量或数据密集型工作负载: 如果您轮询
eth_getLogs、运行索引器或服务大量用户,请评估专用节点。它们将您的流量与其他租户隔离,并降低速率限制的风险。
如果您仍在评估提供商,请阅读 如何选择RPC提供商 以获取更广泛的框架。有关BNB Chain的具体信息,本文其余部分将为您提供链设置、请求示例和您将遇到的故障模式。
BNB智能链概览
BNB智能链(BSC)是一个与以太坊虚拟机(EVM)兼容的区块链,与BNB Chain的质押链并行运行。由于它与EVM兼容,您可以使用标准的以太坊JSON-RPC方法、ethers.js和viem等工具,以及您已经熟悉的钱包配置模式。
RPC集成关键事实:
- 链ID: 56(主网),97(测试网)
- 原生代币: BNB(18位小数)
- 浏览器: BscScan
- 共识: 权益权威证明(PoSA),产生快速区块(约3秒)
快速的区块时间意味着您的应用程序每分钟发送的交易将比以太坊多,因此您的RPC端点需要处理更高的请求速率才能应对相同的用户活动。
钱包和dApp的链设置
当您将BNB智能链添加到MetaMask或配置dApp时,您需要正确的网络参数。下表显示了主网和测试网的值。
| 参数 | 主网 | 测试网 |
|---|---|---|
| 网络名称 | BNB智能链 | BNB Chain测试网 |
| RPC URL | https://bnb.api.onfinality.io/public | https://bnb-testnet.api.onfinality.io/public |
| 链ID | 56 | 97 |
| 货币符号 | BNB | tBNB |
| 区块浏览器 | https://bscscan.com | https://testnet.bscscan.com |
使用测试网进行开发和预发布。测试网使用相同的RPC接口,因此在那里工作的代码应该只需更改端点和链ID即可在主网上工作。
钱包配置示例
如果您手动将BNB智能链添加到钱包,下面的JSON显示了钱包提供商使用的典型结构。
{
"chainId": "0x38",
"chainName": "BNB Smart Chain",
"nativeCurrency": {
"name": "BNB",
"symbol": "BNB",
"decimals": 18
},
"rpcUrls": ["https://bnb.api.onfinality.io/public"],
"blockExplorerUrls": ["https://bscscan.com"]
}
请注意,chainId 是十六进制:0x38 等于56。许多钱包错误源于在期望十六进制的字段中使用了十进制链ID。
发送您的第一个JSON-RPC请求
验证端点最快的方法是使用 curl 发送 eth_chainId 请求。这确认端点可达并返回预期的链。
curl -X POST https://bnb.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
成功的响应如下所示:
{"jsonrpc":"2.0","id":1,"result":"0x38"}
结果 0x38 是56的十六进制表示,确认您位于BNB智能链主网。
要获取最新区块号,请使用 eth_blockNumber:
curl -X POST https://bnb.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
使用ethers.js和viem
大多数开发者通过库与BNB智能链交互。以下是使用ethers.js v6读取最新区块的最小示例。
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider('https://bnb.api.onfinality.io/public');
const blockNumber = await provider.getBlockNumber();
console.log('Latest block:', blockNumber);
使用viem的相同示例:
import { createPublicClient, http } from 'viem';
const client = createPublicClient({
chain: {
id: 56,
name: 'BNB Smart Chain',
nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 },
rpcUrls: { default: { http: ['https://bnb.api.onfinality.io/public'] } }
},
transport: http()
});
const blockNumber = await client.getBlockNumber();
console.log('Latest block:', blockNumber);
两个库都为您处理JSON-RPC格式和错误解析,但您仍然需要配置正确的链ID和端点。
用于实时数据的WebSocket支持
如果您的应用程序需要实时更新,例如待处理交易或新区块,请使用WebSocket端点。BNB智能链支持WebSocket连接,OnFinality为该网络提供WebSocket URL。
使用ethers.js的WebSocket订阅示例:
import { WebSocketProvider } from 'ethers';
const provider = new WebSocketProvider('wss://bnb.api.onfinality.io/public');
provider.on('block', (blockNumber) => {
console.log('New block:', blockNumber);
});
WebSocket连接是有状态的,并且消耗更多服务器资源。对于生产环境,请确保您的提供商支持具有足够连接限制的WebSocket。有关传输支持的详细信息,请参阅 BNB Chain网络页面。
常见故障模式及如何调试
即使使用正确的端点,您也会遇到问题。以下是使用BNB智能链RPC时最常见的故障模式以及如何诊断它们。
| 症状 | 可能原因 | 调试步骤 |
|---|---|---|
eth_chainId 返回不同的值 | 错误的网络或端点 | 验证链ID是否为56(主网)或97(测试网) |
nonce too low 错误 | 交易nonce落后于账户的下一个预期nonce | 使用 eth_getTransactionCount 并设置 "pending" 获取正确的nonce |
insufficient funds | 账户余额不足以支付gas | 使用 eth_getBalance 检查余额,并使用 eth_estimateGas 估算gas |
| 请求超时 | 网络拥塞或端点过载 | 使用退避重试;对于生产环境考虑专用端点 |
| 速率限制错误(HTTP 429) | 对共享公共端点的请求过多 | 降低请求速率或升级到托管/专用服务 |
execution reverted | 智能合约调用失败 | 使用 eth_call 模拟交易并检查回滚原因 |
调试失败的交易
当交易失败时,第一步是获取交易收据并查看状态字段。状态为 0x0 表示交易已回滚。
curl -X POST https://bnb.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0xYOUR_TX_HASH"],"id":1}'
如果收据显示回滚,请使用 eth_call 模拟交易并捕获回滚原因。许多库提供 call 方法,返回原因字符串。
公共端点与托管端点:生产环境的变化
公共端点便于开发,但会带来影响生产应用的权衡。
- 共享资源: 公共端点被许多开发者使用。其他人的大量使用可能会减慢您的请求或导致速率限制。
- 无SLA: 公共端点通常不提供正常运行时间保证或支持。如果端点宕机,您没有追索权。
- 数据有限: 某些公共端点不支持归档请求或WebSocket订阅。
托管RPC服务,例如OnFinality的 API服务,提供具有定义限制、监控和支持的专用或共享基础设施。对于生产工作负载,您应该评估托管服务是否满足您的需求。
比较提供商时,请考虑:
- 吞吐量和速率限制: 每秒最大请求数是多少?是否有突发限制?
- 数据可用性: 您是否需要归档数据或trace方法?
- WebSocket支持: 是否允许WebSocket连接,限制是什么?
- 故障转移: 提供商是否自动绕过节点故障?
- 支持: 当出现问题时,您能否联系到人工?
OnFinality为BNB Chain提供共享和 专用节点。专用节点为您提供隔离资源,这对于高吞吐量或延迟敏感的应用非常重要。
监控您的RPC健康状况
一旦您的应用程序上线,请监控RPC连接的健康状况。一个简单的健康检查是定期发送轻量级请求并测量响应时间。
while true; do
start=$(date +%s%N)
response=$(curl -s -X POST https://bnb.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}')
end=$(date +%s%N)
echo "Response: $response"
echo "Latency: $(( (end - start) / 1000000 )) ms"
sleep 10
done
为延迟峰值、错误率和nonce错误设置警报。如果您看到重复的 nonce too low 错误,您的交易管理逻辑可能需要更仔细地处理待处理交易。
关键要点
- BNB智能链与EVM兼容,因此标准的以太坊JSON-RPC方法和工具可以工作。
- 使用正确的链ID(主网56,测试网97)和端点以避免配置错误。
- 公共端点适合开发,但生产应用应考虑托管或专用基础设施以获得可靠性和支持。
- 通过检查链ID、nonce、余额以及使用
eth_call模拟交易来调试常见问题。 - 使用简单脚本监控RPC健康状况,并为异常设置警报。
常见问题解答
BNB智能链的RPC URL是什么?
BNB智能链主网的公共RPC URL是 https://bnb.api.onfinality.io/public。对于测试网,请使用 https://bnb-testnet.api.onfinality.io/public。
BNB智能链的链ID是什么?
主网链ID为56,测试网为97。十六进制中,56是 0x38。
我可以将以太坊工具与BNB智能链一起使用吗?
可以,因为BNB智能链与EVM兼容。ethers.js和viem等库只需进行最少的配置更改即可工作。
如何获取测试网的测试BNB?
您可以从测试网水龙头请求测试BNB。请参阅 BNB Chain测试网页面 获取指导。
如果在公共端点上遇到速率限制,我该怎么办?
降低请求速率、实施缓存,或升级到具有更高限制的托管RPC服务。请参阅 RPC定价 了解选项。
OnFinality是否支持BNB智能链的WebSocket?
是的,OnFinality支持BNB智能链的WebSocket传输。使用WebSocket URL wss://bnb.api.onfinality.io/public 进行实时订阅。
有关支持的网络的完整列表,请访问 支持的RPC网络。