摘要
本快速入门介绍如何通过 JSON-RPC 将应用程序连接到 BNB Smart Chain。内容涵盖主网链 ID(56)、原生 BNB 代币、BscScan 浏览器、钱包网络配置,以及大多数开发者最先进行的读取调用:链 ID、区块号、余额和日志。你可以将钱包或脚本指向公共端点以快速开始,然后随着流量和索引需求的增长,迁移到托管或专用端点。OnFinality 通过其 API 服务和专用节点选项提供 BNB Smart Chain RPC,使用与你现有相同的 JSON-RPC 方法。目标是在几分钟内建立可用的连接,并提供出现故障时所需的设置和调试步骤。
BNB Smart Chain 使用标准的以太坊 JSON-RPC。如果你之前连接过任何 EVM 链,那么相同的客户端库、相同的方法名和相同的请求格式都适用。不同之处在于链 ID、原生代币、浏览器,以及围绕出块时间和日志查询的一些操作细节。本快速入门将带你从零开始建立可用的连接,然后解释如何随着工作负载的增长保持连接健康。
首次请求前需要了解的链设置
正确设置这些值,大多数连接问题就会消失。它们与你粘贴到钱包、Hardhat 配置或 viem 客户端中的值相同。
| 设置 | 主网 | 测试网 |
|---|---|---|
| 链 ID | 56 | 97 |
| 链名称 | BNB Smart Chain Mainnet | BNB Smart Chain Testnet |
| 原生代币 | BNB(18 位小数) | tBNB(18 位小数) |
| 浏览器 | bscscan.com | testnet.bscscan.com |
| 传输 | HTTP、WebSocket | HTTP |
在部署到生产环境时使用主网,在迭代合约或测试钱包流程时使用测试网。测试网 BNB 没有货币价值,通过水龙头分发,因此仅将其视为沙盒。
为你的阶段选择合适的端点
在编写代码之前,确定哪种端点适合你的任务。错误的选择是快速入门变成调试会话的最常见原因。
- 本地节点。 完全控制且无第三方,但你需要负责同步时间、磁盘和升级。适合协议工作,对应用团队来说负担较重。
- 公共端点。 测试单个请求的最快方式。适合脚本或演示,但不适合有真实流量的生产应用。
- 托管 RPC API。 具有稳定 URL、受监控节点和仪表板的托管端点。这是大多数应用团队的选择。OnFinality 的 RPC API 服务 覆盖 BNB Smart Chain 以及许多其他网络。
- 专用节点。 为你的工作负载预留的节点,当你需要可预测的吞吐量、归档访问或大量日志和跟踪查询时使用。请参阅 专用节点。
如果不确定哪个层级适合,请从托管端点开始,观察一周的请求模式后再决定是否使用专用容量。
一步配置钱包或客户端
大多数钱包接受自定义网络。粘贴上表中的值。对于 JavaScript 客户端,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 chainId = await client.getChainId()
const blockNumber = await client.getBlockNumber()
console.log({ chainId, blockNumber })
如果 chainId 返回 56,则你的传输指向主网。如果返回其他值,则说明你使用了错误的端点或错误的网络对象。
使用 curl 进行首次 JSON-RPC 调用
每个 EVM 方法的工作方式相同。以下三个调用涵盖了你最常运行的检查:确认链、读取最新区块和读取余额。
# 确认链 ID
curl -s https://bnb.api.onfinality.io/public \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
# 最新区块号
curl -s https://bnb.api.onfinality.io/public \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"eth_blockNumber","params":[]}'
# 地址余额(十六进制 wei)
curl -s https://bnb.api.onfinality.io/public \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":3,"method":"eth_getBalance","params":["0x0000000000000000000000000000000000000000","latest"]}'
eth_chainId 返回 0x38,即十进制的 56。eth_blockNumber 返回十六进制的区块高度。eth_getBalance 返回十六进制字符串形式的 wei,因此除以 10^18 即可得到 BNB。
读取日志和事件而不超时
eth_getLogs 是大多数团队在 BNB Smart Chain 上遇到问题的调用。该链出块速度快,因此宽泛的区块范围可能返回大量结果集,要么超时,要么被提供商的区块范围限制拒绝。
实用规则:
- 保持区块范围狭窄,按区块高度分页,而不是一次性请求所有内容。
- 尽可能按合约地址和主题过滤。主题过滤器会大幅减少结果集。
- 对于回填和索引器,使用支持归档的端点,以便历史状态可用。
- 按区块范围缓存结果,这样重试时不会重新查询相同的数据。
const logs = await client.getLogs({
address: '0xYourContract',
fromBlock: 40_000_000n,
toBlock: 40_000_500n,
})
如果你需要连续的事件流而不是轮询,请在端点支持的情况下使用 WebSocket 订阅,并在套接字断开时使用退避策略重新连接。
测试网设置和水龙头说明
测试网使用链 ID 97 和 tBNB 代币。将客户端指向测试网端点,并更新链对象,使浏览器链接和链 ID 匹配。
import { bscTestnet } from 'viem/chains'
const testClient = createPublicClient({
chain: bscTestnet,
transport: http('https://bnb-testnet.api.onfinality.io/public'),
})
水龙头分发少量 tBNB,用于合约部署和交易测试。由于水龙头的可用性会随时间变化,请查看当前的 BNB Chain 测试网文档以获取可用的水龙头,而不是硬编码一个。测试网状态可能会被重置或修剪,因此切勿将其视为持久存储。有关端点详细信息,请参阅 BNB Chain 测试网 RPC 页面。
故障模式及如何解读
大多数快速入门失败可归为少数几种症状。在更改代码之前,将症状与可能的原因对应起来。
| 症状 | 可能原因 | 首要修复 |
|---|---|---|
chainId 不是 56 | 错误的端点或错误的链对象 | 重新检查 URL 和链配置 |
429 或速率限制错误 | 公共或共享端点负载过高 | 迁移到托管端点或添加带退避的重试 |
eth_getLogs 超时 | 区块范围太宽 | 缩小范围并按地址/主题过滤 |
nonce too low | 先前发送导致的 nonce 过时 | 重新发送前重新读取待处理 nonce |
insufficient funds | 余额低于 gas 费用 | 充值 BNB 或降低 gas 设置 |
| WebSocket 断开连接 | 空闲超时或网络中断 | 添加带指数退避的重连逻辑 |
当调用失败时,记录完整的 JSON-RPC 错误对象。code 和 message 字段通常会告诉你问题是出在你的请求、端点还是链上。
生产就绪检查清单
快速入门证明了连接有效。生产环境还需要做好以下几件事。
- 冗余端点。 配置主 URL 和备用 URL,这样单个端点问题不会导致应用宕机。
- 带退避的重试。 将瞬时错误视为预期情况,并对幂等读取进行重试。
- 监控。 按方法跟踪请求成功率、延迟和错误代码,以便及早发现回归。
- 归档访问。 如果你查询历史状态或回填日志,请确认端点支持。
- 速率规划。 估算每秒峰值请求数,并匹配相应的层级。有关层级如何映射到使用量,请参阅 RPC 定价。
- 密钥管理。 将 API 密钥排除在客户端代码之外,并在泄露时轮换它们。
一个简单的健康探测可以让你对端点质量保持清醒:
curl -s -o /dev/null -w '%{http_code} %{time_total}s\n' \
https://bnb.api.onfinality.io/public \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
定期运行此命令,并在状态代码或延迟偏离正常范围时发出警报。
OnFinality 的定位
OnFinality 将 BNB Smart Chain RPC 作为更广泛网络组合的一部分来运行。你可以从托管端点开始,当工作负载需要可预测的吞吐量或归档和跟踪访问时,迁移到专用节点。JSON-RPC 接口在不同层级之间不会改变,因此迁移主要是 URL 和密钥的更换,而不是重写。浏览 支持的 RPC 网络 查看还有哪些可用,并使用 BNB Smart Chain RPC 页面 获取当前端点和网络详细信息。
关键要点
- BNB Smart Chain 主网使用链 ID 56 和 BNB 代币;测试网使用链 ID 97 和 tBNB。
- 相同的以太坊 JSON-RPC 方法适用,因此现有的 EVM 工具只需新的端点和链配置即可使用。
eth_getLogs需要狭窄的区块范围和过滤器;宽泛的范围是超时最常见的原因。- 将端点层级与你的阶段匹配:公共用于测试,托管用于应用,专用用于繁重或归档工作负载。
- 生产环境需要冗余端点、带退避的重试、监控以及归档访问计划。
常见问题
BNB Smart Chain 的链 ID 是什么?
主网是 56,测试网是 97。使用 eth_chainId 确认,主网上返回 0x38。
我可以在 BNB Smart Chain 上使用以太坊工具吗? 可以。它与 EVM 兼容,因此 ethers、viem、Hardhat 和 Foundry 在正确的链配置和端点下均可使用。
为什么我的 eth_getLogs 调用失败?
通常是因为区块范围太宽或结果集太大。缩小范围并按合约地址和主题过滤。
我需要专用节点吗? 开始时不需要。当你需要可预测的吞吐量、归档访问或大量跟踪和日志查询时,再迁移到专用节点。
如何在不花费真实 BNB 的情况下进行测试? 使用测试网(链 ID 97)和水龙头获取 tBNB。将测试网状态视为临时的。
在哪里可以找到当前端点? 请参阅 BNB Smart Chain RPC 页面 获取端点和网络详细信息,以及 RPC 定价 了解层级选项。