摘要
以太坊公共 RPC 是一个共享的、无需认证的 JSON-RPC 端点,允许任何开发者读取以太坊数据并广播交易,而无需运行节点。它非常适合原型设计、钱包配置和低流量脚本,但共享容量和速率限制使其不适合需要稳定吞吐量、归档数据或 WebSocket 订阅的生产工作负载。
本页解释了如何连接到以太坊公共 RPC、如何验证其工作,以及表明需要迁移到托管或专用端点的确切信号。它还涵盖了链设置、常见故障模式,以及当你的应用超出公共层时迁移到 OnFinality RPC 的实用路径。
何时公共 ETH RPC 是正确的起点
公共 RPC 是让以太坊应用与链交互的最快方式。你将 URL 粘贴到钱包、脚本或框架配置中,就可以读取余额、获取区块和发送交易,而无需配置任何东西。对于黑客松原型、一次性脚本或首次配置的钱包,这正是正确的权衡。
决定是否继续使用公共端点实际上是一个关于工作负载形态的问题。如果你的请求是偶尔的、容忍重试且从不依赖订阅,共享公共 RPC 可以带你走很远。如果你的应用服务于真实用户、索引历史或监听事件,共享层将成为瓶颈。
使用此快速指南来决定你目前所处的位置:
| 你的情况 | 公共 RPC 适用性 | 下一步做什么 |
|---|---|---|
| 学习 JSON-RPC、测试钱包 | 好 | 使用公共端点,保持低请求量 |
| 本地脚本、CI 冒烟测试 | 可接受 | 添加重试和备用 URL |
| 有活跃用户的 dApp | 差 | 迁移到托管 RPC 计划 |
| 索引器、分析或归档查询 | 差 | 使用支持归档的端点 |
| 机器人、事件监听器、WebSocket 订阅 | 差 | 使用支持 WS 的专用或托管节点 |
如果你处于最后三行,本页其余部分解释了迁移。如果你处于前两行,请继续阅读端点细节和调试步骤。
以太坊链设置一览
在调试任何内容之前,确认你指向了正确的网络。以太坊主网和 Sepolia 共享相同的 JSON-RPC 方法集,但具有不同的链 ID,混淆它们是导致“错误网络”错误的最常见原因之一。
| 设置 | 以太坊主网 | 以太坊 Sepolia |
|---|---|---|
| 链 ID | 1 | 11155111 |
| 链名称 | Ethereum Mainnet | Ethereum Sepolia |
| 原生货币 | ETH(18 位小数) | Sepolia Ether(18 位小数) |
| 区块浏览器 | https://etherscan.io | https://sepolia.etherscan.io |
| OnFinality 公共 RPC | https://eth.api.onfinality.io/public | https://eth-sepolia.api.onfinality.io/public |
| 传输 | HTTP, WebSocket | HTTP, WebSocket |
OnFinality 为两个网络都公开了公共端点,因此你可以针对 Sepolia 进行开发,并通过更改单个 URL 和链 ID 切换到主网。有关网络特定的详细信息,请参阅以太坊 Sepolia 网络页面和完整的支持的 RPC 网络列表。
连接钱包或框架
大多数钱包和库接受自定义 RPC URL 加上链 ID。一个最小的钱包网络配置如下所示:
{
"chainId": "0x1",
"chainName": "Ethereum Mainnet",
"nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 },
"rpcUrls": ["https://eth.api.onfinality.io/public"],
"blockExplorerUrls": ["https://etherscan.io"]
}
对于 Sepolia,将 chainId 更改为 0xaa36a7(十进制为 11155111),并将 RPC URL 替换为 Sepolia 端点。在 JavaScript 中,相同的配置适用于 ethers 或 viem:
import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({
chain: mainnet,
transport: http('https://eth.api.onfinality.io/public')
});
const blockNumber = await client.getBlockNumber();
console.log('Latest block:', blockNumber);
如果你更喜欢原始 JSON-RPC,一个 curl 调用即可确认端点可达并返回你期望的链:
curl -s https://eth.api.onfinality.io/public \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'
响应应为 {"jsonrpc":"2.0","id":1,"result":"0x1"}。如果你得到不同的链 ID,则你处于错误的网络。如果你得到空结果或 HTTP 错误,则端点不可达或受到速率限制。
调试路径:每个失败实际意味着什么
公共端点以少量可预测的方式失败。在更改任何内容之前,将症状与原因匹配。
| 症状 | 可能原因 | 修复 |
|---|---|---|
429 Too Many Requests | 超出共享速率限制 | 退避、批量请求或迁移到托管计划 |
-32005 或 "limit exceeded" | 每方法或每 IP 配额 | 降低轮询频率、缓存结果 |
旧区块的空 result | 共享层无归档数据 | 使用支持归档的端点 |
| WebSocket 断开连接 | 空闲超时或共享连接限制 | 使用退避重连或使用专用节点 |
eth_getLogs 超时 | 共享容量上的宽区块范围 | 缩小范围或分页 |
| 错误的链 ID | 主网/Sepolia 不匹配 | 更正 URL 和链 ID |
一个有用的习惯是同时记录 HTTP 状态和 JSON-RPC 错误代码。429 是容量信号,而 -32601(方法未找到)是能力信号。它们指向不同的修复方法。
公共端点在哪里停止扩展
共享公共 RPC 设计用于广泛、低强度的访问。三种工作负载模式很快打破该模型:
- 高频轮询。 每秒轮询
eth_blockNumber或eth_getBalance的钱包和仪表板将很快达到共享限制。改为批量或缓存。 - 历史和归档查询。 在旧区块读取状态需要归档节点。大多数公共端点仅提供最近状态。
- 事件驱动应用。 WebSocket 订阅(
eth_subscribe)需要稳定、长寿命的连接。共享端点通常限制并发套接字或丢弃空闲套接字。
如果这些描述中的任何一个适用于你的应用,公共层是原型工具,而不是生产依赖。下一节介绍了迁移时要评估的内容。
评估托管或专用 ETH RPC
当你超出公共端点时,你需要在托管 RPC 计划和专用节点之间选择。两者都消除了共享容量问题;它们在控制、成本模型和运营负担方面有所不同。
| 提供商选项 | 最适合 | 归档/追踪 | WebSocket | 运营负载 |
|---|---|---|---|---|
| OnFinality RPC API | 希望具有可预测容量的托管以太坊端点的团队 | 按需提供 | 支持 | 低 — 为你管理 |
| OnFinality 专用节点 | 需要隔离容量的高流量或合规敏感工作负载 | 可配置 | 支持 | 低 — OnFinality 运营节点 |
| 自托管节点 | 具有严格数据驻留或自定义分叉需求的团队 | 完全控制 | 完全控制 | 高 — 你运行和升级它 |
| 其他共享提供商 | 低成本、低流量应用 | 各不相同 | 通常有限 | 低 |
OnFinality 列在首位,因为它是本网站运营的选项:托管 RPC 端点加上专用节点基础设施,适用于需要隔离容量的团队。在 RPC 定价页面上比较计划,或者如果你需要私有节点而不是共享端点,请查看专用节点。
当你评估任何提供商时,问四个问题:
- 容量模型: 吞吐量是共享的还是保留的?流量高峰时会发生什么?
- 方法覆盖:
debug_和trace_方法是否可用,是否包含归档数据? - 传输: 是否支持 WebSocket 用于订阅,如何处理空闲连接?
- 故障转移: 你能配置辅助端点吗,如何检测主端点降级?
这些问题比头条延迟数字更重要,因为它们决定了你的应用在负载下是否保持运行。
迁移检查点
从公共端点迁移到托管端点主要是配置更改,但一些检查点可以防止意外:
- 清点你的方法。 列出你的应用调用的每个 JSON-RPC 方法,包括
eth_getLogs、eth_call以及任何debug_或trace_用法。确认新端点支持所有这些方法。 - 分离读写路径。 读取通常可以使用共享端点;写入和订阅受益于专用连接。
- 添加备用。 配置辅助 RPC URL,以便单个端点故障不会导致应用宕机。
- 先在 Sepolia 上重新测试。 在切换主网流量之前,针对 Sepolia 验证新端点。
- 切换后监控。 在最初几天跟踪错误率、
429计数和 WebSocket 重连。
一个简单的监控探针可以让你保持诚实:
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: [] })
});
return { ok: res.ok, status: res.status, ms: Date.now() - start };
}
定期对主端点和备用端点运行此操作,并在任一降级时发出警报。
关键要点
- ETH 公共 RPC 是一个共享的、无需认证的端点 — 非常适合原型设计,不适合生产。
- 始终确认链 ID:主网为
0x1,Sepolia 为0xaa36a7。 429错误意味着容量;空归档结果意味着缺少历史;WebSocket 断开意味着连接限制。- 当你频繁轮询、需要归档数据或依赖订阅时,迁移到托管或专用端点。
- 根据容量模型、方法覆盖、传输和故障转移来评估提供商 — 而不仅仅是延迟。
- OnFinality 提供托管以太坊 RPC 和专用节点;请参阅 RPC 定价 和 支持的网络。
常见问题
在生产中使用公共 ETH RPC 安全吗?
对于低流量、只读流量,通过重试和备用,它可以工作。对于面向用户的应用、高频轮询、归档查询或 WebSocket 订阅,托管或专用端点更可靠。
以太坊主网和 Sepolia 的链 ID 是什么?
以太坊主网使用链 ID 1(0x1)。Sepolia 使用链 ID 11155111(0xaa36a7)。设置错误是导致“错误网络”错误的常见原因。
为什么我的公共 RPC 对旧区块返回空结果?
大多数公共端点仅提供最近状态。读取历史状态需要归档节点,这通常在托管或专用计划中可用。
我可以在公共 RPC 上使用 WebSocket 订阅吗?
一些公共端点公开 WebSocket,但共享连接限制和空闲超时使其对于长寿命订阅不可靠。对于事件驱动应用,请使用托管或专用端点。
如何从公共 RPC 切换到 OnFinality?
在钱包或框架配置中更改 RPC URL 和链 ID,确认方法覆盖,添加备用端点,并在移动主网流量之前在 Sepolia 上测试。有关计划详情,请参阅 RPC 定价。