摘要
Arbitrum RPC API 是一个 JSON-RPC 接口,允许你的应用程序读取 Arbitrum One 状态并提交交易。你通过 HTTP 或 WebSocket 连接到与 Arbitrum rollup 同步的节点,然后调用标准的以太坊方法,如 eth_call、eth_getLogs 和 eth_sendRawTransaction。本文介绍了你需要的链设置、在 Arbitrum 上行为不同的方法,以及集成过程中团队常遇到的故障模式。
如果你正在选择发送这些请求的位置,OnFinality 提供 Arbitrum RPC API 访问和专用节点基础设施,以便随着工作负载增长,你可以从公共端点迁移到托管或私有节点。请先使用本页正确配置你的客户端,然后决定共享端点还是专用节点更适合你的流量模式。
Arbitrum One 是一个乐观 rollup,结算到以太坊,但它暴露了与以太坊兼容的 JSON-RPC 接口。这种兼容性很方便,也是一个陷阱:大多数以太坊工具都能工作,但少数方法、gas 规则和时序假设的行为有所不同。本页提供了连接所需的设置、发布前值得检查的方法,以及生产环境中出现的故障模式。
链设置一览
首先确认你的客户端、钱包或框架所需的值。Arbitrum One 是主网 rollup;Arbitrum Sepolia 是用于暂存的测试网。
| 设置 | Arbitrum One(主网) | Arbitrum Sepolia(测试网) |
|---|---|---|
| 链 ID | 42161 | 421614 |
| 原生货币 | ETH(18 位小数) | ETH(18 位小数) |
| 区块浏览器 | https://arbiscan.io | https://sepolia.arbiscan.io |
| HTTP 端点 | https://arbitrum.api.onfinality.io/public | https://arbitrum-sepolia.api.onfinality.io/public |
| WebSocket | 在 Arbitrum One 上支持 | 检查测试网端点的可用性 |
| Rollup 类型 | 乐观 rollup | 乐观 rollup |
Arbitrum One 的钱包网络配置如下所示:
{
"chainId": "0x66eee",
"chainName": "Arbitrum One",
"nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 },
"rpcUrls": ["https://arbitrum.api.onfinality.io/public"],
"blockExplorerUrls": ["https://arbiscan.io"]
}
注意 0x66eee 是 42161 的十六进制形式。钱包会拒绝你在文档中引用的十进制链 ID 与在 wallet_addEthereumChain 中发送的十六进制值不匹配的情况。
在编写代码之前决定如何连接
连接决策通常归结为三个问题:你的应用是否需要推送更新,是否需要历史状态,以及你的流量突发性如何?
- 只读仪表盘和钱包通常可以在共享 HTTP 端点上运行。请求短小、无状态且可缓存。
- 对新块或待处理活动做出反应的应用受益于 WebSocket 订阅,这样你就不必在循环中轮询
eth_getBlockByNumber。 - 索引器、分析和回填需要归档访问,并且通常需要更重的
eth_getLogs查询,这正是共享公共端点开始吃紧的地方。 - 高流量或延迟敏感的工作负载更适合专用节点,你的流量不会与其他租户共享容量。
如果你不确定自己属于哪一类,RPC 提供商选择指南 会介绍评估标准。具体到 Arbitrum,你可以在 Arbitrum 网络页面 上比较共享和专用选项。
调用 Arbitrum RPC API
基本的读取请求与以太坊相同。这个 curl 调用获取最新的区块号:
curl -s https://arbitrum.api.onfinality.io/public \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
在 JavaScript 中使用 viem,配置好链后,同样的调用只需一行:
import { createPublicClient, http } from 'viem';
import { arbitrum } from 'viem/chains';
const client = createPublicClient({
chain: arbitrum,
transport: http('https://arbitrum.api.onfinality.io/public'),
});
const blockNumber = await client.getBlockNumber();
console.log(blockNumber);
要订阅新块头的 WebSocket:
import WebSocket from 'ws';
const ws = new WebSocket('wss://arbitrum.api.onfinality.io/public/ws');
ws.on('open', () => {
ws.send(JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'eth_subscribe',
params: ['newHeads'],
}));
});
ws.on('message', (data) => console.log(data.toString()));
在硬编码之前,请根据 Arbitrum 网络页面 确认确切的 WebSocket 路径,因为主网和测试网之间的传输支持可能不同。
在 Arbitrum 上行为不同的方法
由于 Arbitrum 是 rollup,一些方法返回的值与以太坊 L1 的思维模型不匹配。
| 方法 | 在 Arbitrum 上的变化 | 需要注意什么 |
|---|---|---|
eth_gasPrice | 反映 L2 gas 定价加上 L1 数据组件 | 不要硬编码 gas 价格;按交易估算 |
eth_estimateGas | 考虑 L1 calldata 成本 | 估算值可能高于仅基于 L2 的简单计算 |
eth_getLogs | 大区块范围开销大 | 分页并限制 fromBlock/toBlock |
eth_getBlockByNumber | 出块时间快 | 轮询循环浪费配额;优先使用订阅 |
eth_call | 对视图函数正常工作 | 调用和交易之间状态可能变化 |
eth_sendRawTransaction | 标准签名交易 | 注意 nonce 和 gas 错误,而不是格式错误 |
gas 差异是最让团队惊讶的地方。Arbitrum 上的交易支付 L2 执行 gas 和单独的 L1 数据可用性成本,因此在以太坊上看起来合适的 gas 价格可能低估了 Arbitrum 交易。始终估算而不是假设。
故障模式及如何调试
大多数 Arbitrum RPC API 问题都属于少数几类。在更换提供商之前,将症状与可能的原因匹配。
| 症状 | 可能原因 | 首先检查 |
|---|---|---|
nonce too low | 之前的交易已经打包 | 使用 pending 查询 eth_getTransactionCount |
replacement transaction underpriced | 使用相同 nonce 和低 gas 重新提交 | 提高替换交易的 gas 价格 |
eth_getLogs 超时 | 区块范围太宽 | 将范围拆分为更小的窗口 |
| 请求间歇性失败 | 共享端点在突发负载下 | 添加带退避的重试,或迁移到专用节点 |
| WebSocket 断开连接 | 空闲超时或网络中断 | 实现重连和重新订阅逻辑 |
execution reverted 无原因 | 合约回滚且无消息 | 在失败的区块用 eth_call 重放调用 |
一个实用的调试顺序:用 curl 重现失败的调用,从而将你的框架排除在外,确认你查询的区块号,然后检查同样的调用在第二个端点上是否成功。如果只在一个端点上失败,则存在基础设施问题。如果在所有地方都失败,则问题出在请求本身。
生产就绪检查清单
在将真实流量指向 Arbitrum 端点之前,请确认以下每一项:
- 故障转移:你的客户端可以在不重新部署的情况下切换到第二个端点。
- 重试:瞬态 5xx 和超时响应使用指数退避重试,而不是立即重试。
- 超时:设置请求超时,以免慢调用阻塞整个请求路径。
- 日志查询:
eth_getLogs范围有界并分页。 - 订阅:WebSocket 客户端自动重连并重新订阅。
- 可观测性:你按方法跟踪错误率和延迟,而不仅仅是整体正常运行时间。
- 容量:你知道峰值每秒请求数以及共享端点是否能吸收。
如果你的峰值负载稳定且高,或者你需要归档和 trace 访问,专用节点 消除了噪声邻居变量。如果你的负载适中且突发,托管共享端点通常是更简单的选择。两种模式的定价在 RPC 定价页面 上。
测试网工作流程
使用 Arbitrum Sepolia 进行暂存,这样你就不会在集成测试中消耗主网 ETH。链 ID 是 421614,浏览器是 https://sepolia.arbiscan.io。Arbitrum Sepolia 的水龙头由生态系统提供商运营;为一个一次性密钥提供资金,并将其排除在生产配置之外。由于测试网状态不是永久的,不要构建依赖于特定历史区块永久存在的断言。
值得跟踪的监控信号
一旦上线,有用的信号是方法级别的。将 eth_sendRawTransaction 的错误率与读取方法分开跟踪,因为写入失败通常表示 nonce 或 gas 问题,而不是基础设施问题。单独跟踪 eth_getLogs 延迟,因为它对查询形状最敏感。并跟踪 WebSocket 重连频率,因为重连次数上升是订阅处理需要关注的早期预警。
关键要点
- Arbitrum One 使用链 ID 42161,Arbitrum Sepolia 使用 421614;两者都使用 ETH 作为原生货币。
- JSON-RPC 接口与以太坊兼容,但由于 Arbitrum 是 rollup,gas 估算和日志查询行为不同。
- 始终估算 gas 而不是硬编码,并始终限制
eth_getLogs区块范围。 - 将连接类型与工作负载匹配:HTTP 用于无状态读取,WebSocket 用于推送更新,专用节点用于持续或归档密集型流量。
- 在扩展流量之前构建故障转移、重试和重连逻辑,而不是在事件之后。
常见问题
Arbitrum RPC API 与以太坊的相同吗? 很接近。方法名称和请求格式相同,但 gas 定价、日志查询成本和出块时间不同,因为 Arbitrum 是乐观 rollup。
Arbitrum 使用什么链 ID? Arbitrum One 使用 42161,Arbitrum Sepolia 使用 421614。在钱包配置中,发送十六进制形式。
我需要 WebSocket 端点吗? 只有当你的应用需要推送更新(如新块头或事件订阅)时才需要。只读应用可以仅使用 HTTP。
为什么我的 eth_getLogs 调用超时?
区块范围通常太宽。将其拆分为更小的窗口并分页。
什么时候应该从共享端点迁移到专用节点? 当你的持续请求量、归档需求或延迟要求超过共享端点舒适服务的范围时。在 Arbitrum 网络页面 上比较选项,并查看 RPC 定价 了解两种模式。
在哪里可以看到 OnFinality 支持哪些网络? 完整列表在 支持的 RPC 网络 页面上。