摘要
以太坊 RPC 节点提供商负责运行和维护以太坊节点,使你的应用可以通过 JSON-RPC 读取链上状态并广播交易,而无需自行运行客户端软件。合适的提供商取决于你的工作负载:读密集型 dapp、索引器、交易机器人和跨链桥各自对不同的方法和传输方式有不同压力。OnFinality 提供以太坊 RPC API 访问和专用节点基础设施,因此你可以从共享端点开始,并在流量增长时迁移到隔离容量。
选择以太坊 RPC 节点提供商,本质上是在问你的应用在负载下如何读写链上状态。以太坊主网大约每 12 秒产生一个区块,每次钱包余额检查、日志查询和交易广播都要经过 JSON-RPC 端点。如果该端点速度慢、被限流或缺少你需要的方法,用户会比你的仪表盘更早感受到。
本页面面向正在比较以太坊 RPC 选项的开发者和基础设施采购者。它涵盖节点提供商实际做什么、哪些能力区分共享端点和专用节点,以及如何在投入生产流量之前测试提供商。
从你的工作负载开始,而不是提供商列表
在比较供应商之前,先写下你的应用实际发送什么。大多数以太坊 RPC 流量属于几种模式,每种模式对节点的不同部分造成压力。
| 工作负载模式 | 典型方法 | 压力点 |
|---|---|---|
| 钱包 / dapp 读取 | eth_call, eth_getBalance, eth_getTransactionCount | 低延迟头部状态、高请求量 |
| 索引器 / 分析 | eth_getLogs, eth_getBlockByNumber | 归档状态、大结果集、长查询 |
| 交易 / 机器人 | eth_sendRawTransaction, eth_getTransactionReceipt | 广播速度、内存池可见性、WebSocket |
| 跨链桥 / 中继器 | eth_getProof, trace_* | Trace 和证明支持、深层历史状态 |
| 监控 / 告警 | eth_subscribe, eth_blockNumber | 持久 WebSocket、稳定连接 |
如果你只发送 eth_call 和 eth_getBalance,运行良好的共享端点通常就足够了。如果你在宽区块范围运行 eth_getLogs、重放历史,或需要 trace_* 和 debug_* 方法,你就进入了归档和专用节点领域。这种区别对成本的影响远大于原始请求数量。
以太坊 RPC 节点提供商实际运行什么
提供商运行以太坊执行层和共识层客户端,保持它们与网络同步,并通过负载均衡的 JSON-RPC 层暴露它们。好的提供商还处理客户端升级、重组处理、对等节点管理和监控,这样你就不必操心。
有三种常见的交付模式:
- 公共端点。 免费、共享且限流。适合原型设计和低流量读取,但不适合将生产钱包指向它。
- 托管 RPC API。 付费共享端点,具有更高限制、API 密钥,通常还有归档访问。这是大多数生产 dapp 的默认选择。
- 专用节点。 为一个团队提供的隔离节点容量。你可以获得可预测的吞吐量、自己的归档或 trace 配置,并且没有吵闹邻居问题。
OnFinality 通过托管的 RPC API 服务 和 专用节点 提供以太坊,当你需要隔离容量时可以使用后者。你可以从共享端点开始,然后在不更改应用代码的情况下升级,因为 JSON-RPC 接口保持不变。
以太坊链设置一览
如果你要将以太坊接入钱包、Hardhat 配置或后端服务,你需要规范的网络参数。使用这些值,以便你的工具连接到主网而不是测试网。
| 设置 | 值 |
|---|---|
| 网络名称 | Ethereum Mainnet |
| 链 ID | 1 |
| 原生货币 | ETH(18 位小数) |
| 区块浏览器 | https://etherscan.io |
| 公共 RPC URL | https://eth.api.onfinality.io/public |
| 传输方式 | HTTP 和 WebSocket |
确认端点是否在线且位于正确链上的快速方法是询问链 ID 和最新区块:
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"}
如果返回 0x1,你就在以太坊主网上。如果返回其他任何内容,你指向的是不同的链或测试网。对于测试网工作,请改用 以太坊 Sepolia 网络页面。
提供商评估矩阵
了解你的工作负载后,根据对其重要的能力比较提供商。下表是实用检查清单,而非排名。
| 能力 | 为什么重要 | 要问什么 |
|---|---|---|
| 传输支持 | 钱包和机器人通常需要 WebSocket 进行订阅 | HTTP 和 WS 是否都可用? |
| 归档访问 | 历史 eth_getLogs 和状态读取需要归档节点 | 归档是包含在内还是单独层级? |
| Trace / debug 方法 | 跨链桥和分析依赖 trace_* 和 debug_* | 暴露了哪些 trace 方法? |
| 速率限制 | 突发工作负载会触及共享上限 | 请求和计算单元限制是多少? |
| 故障转移 | 单个端点就是单点故障 | 是否有多个区域或端点? |
| 可观测性 | 你需要在用户之前看到错误 | 是否暴露使用量和错误指标? |
| 支持模式 | 事故需要人工,而不是工单队列 | 故障期间的响应路径是什么? |
OnFinality 在此处首先出现,因为它是本网站运营的提供商:它通过 HTTP 和 WebSocket 提供以太坊,在适当的计划上支持归档和 trace 工作负载,并允许团队从共享 RPC 迁移到专用节点。在决定之前,请用相同的标准比较每个提供商。
在投入之前测试提供商
不要根据提供商的营销页面迁移生产流量。针对你的真实方法运行简短评估。一个测量几个端点延迟和正确性的简单脚本,会比任何基准表告诉你更多。
// probe.mjs — compare Ethereum RPC endpoints on the methods you actually use
const endpoints = [
"https://eth.api.onfinality.io/public",
// add other provider endpoints you are evaluating
];
async function probe(url) {
const body = (method, params = []) =>
JSON.stringify({ jsonrpc: "2.0", id: 1, method, params });
const call = async (method, params) => {
const start = performance.now();
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: body(method, params),
});
const json = await res.json();
return { ms: Math.round(performance.now() - start), ok: !json.error };
};
const block = await call("eth_blockNumber");
const logs = await call("eth_getLogs", [
{ fromBlock: "latest", toBlock: "latest" },
]);
console.log(url, { block, logs });
}
for (const url of endpoints) await probe(url);
在一天中的不同时间运行此脚本。注意那些在 eth_blockNumber 上很快但在 eth_getLogs 上很慢或出错的端点,因为日志查询通常是共享容量显示其限制的地方。
共享端点何时不再足够
托管的共享端点是大多数团队的合适默认选择。当以下情况之一成立时,它就不再足够:
- 你在高峰流量期间经常触及速率限制,并且无法平滑负载。
- 你需要按计划在大的区块范围上运行 eth_getLogs。
- 你依赖共享层级限制的 trace_* 或 debug_* 方法。
- 你需要一个保持打开的 WebSocket 连接用于订阅,而无需重新连接。
- 你需要为发布、铸造或交易窗口提供可预测的吞吐量。
此时,专用以太坊节点为你提供隔离的 CPU、内存和磁盘,以及你自己的归档和 trace 配置。它还消除了吵闹邻居问题,即另一个租户的流量高峰变成你的延迟高峰。有关该模式如何工作,请参阅 专用节点,并查看 RPC 定价 以比较层级。
故障转移和多提供商策略
即使运行良好的提供商也可能有糟糕的一小时。生产应用应假设任何单个端点偶尔会失败,并为此设计。
一种常见模式是主端点带一两个回退,通过健康检查而不是硬编码顺序选择:
// rpc-router.mjs — simple health-checked failover across endpoints
const pool = [
"https://eth.api.onfinality.io/public",
// fallback endpoints
];
async function healthy(url) {
try {
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "eth_blockNumber", params: [] }),
signal: AbortSignal.timeout(2000),
});
const json = await res.json();
return !json.error;
} catch {
return false;
}
}
export async function send(payload) {
for (const url of pool) {
if (!(await healthy(url))) continue;
const res = await fetch(url, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
});
if (res.ok) return res.json();
}
throw new Error("all Ethereum RPC endpoints failed");
}
保持回退列表简短且经过测试。未经测试的回退比没有更糟,因为它恰好在你需要时失败。
常见故障模式及其通常含义
当以太坊 RPC 调用行为异常时,错误通常指向配置而非提供商。
| 症状 | 可能原因 | 下一步 |
|---|---|---|
method not found | 端点未暴露该方法(通常是 trace_*) | 与提供商确认方法支持 |
429 或速率限制错误 | 超出共享层级请求上限 | 减少突发大小或迁移到更高层级 |
missing trie node | 查询触及非归档状态 | 使用归档端点进行历史读取 |
nonce too low | 本地 nonce 跟踪不同步 | 使用 pending 重新读取 eth_getTransactionCount |
| WebSocket 断开 | 空闲超时或连接不稳定 | 添加重连逻辑和心跳 ping |
| eth_getLogs 缓慢 | 共享容量上的宽区块范围 | 缩小范围或使用专用节点 |
如果你正在调试像 nonce 错误这样的交易级问题,nonce 解释 会逐步介绍其机制。
关键要点
- 以太坊 RPC 节点提供商运行节点;你通过 HTTP 或 WebSocket 使用 JSON-RPC。交付模式(公共、托管、专用)比品牌更重要。
- 将提供商与你的工作负载匹配。读取、日志查询、交易广播和 trace 调用对节点的不同部分造成压力。
- 以太坊主网使用链 ID 1,ETH 作为原生货币,并支持 HTTP 和 WebSocket 两种传输方式。
- 在迁移生产流量之前,针对你的真实方法测试提供商,尤其是 eth_getLogs 和任何 trace_* 调用。
- 规划故障转移。主端点加经过测试的回退是生产应用的标准做法。
- 当你触及速率限制、需要归档或 trace 访问,或需要可预测的吞吐量时,迁移到专用节点。有关选项,请参阅 支持的 RPC 网络 和 RPC 定价。
常见问题
以太坊 RPC 提供商和节点提供商有什么区别?
在实践中它们有重叠。节点提供商运行以太坊客户端;RPC 提供商通过 JSON-RPC 暴露它们。大多数托管服务两者都做,因此这些术语经常互换使用。
我需要以太坊归档节点吗?
仅当你查询最近窗口之外的历史状态或日志时才需要。钱包和简单 dapp 通常不需要。索引器、分析工具和跨链桥通常需要。
我可以在生产中使用公共以太坊 RPC 端点吗?
公共端点是共享且限流的,因此最适合测试。生产应用通常使用托管 RPC API 或专用节点以获得可预测的行为。
OnFinality 支持以太坊 WebSocket 订阅吗?
OnFinality 上的以太坊支持 HTTP 和 WebSocket 传输。查看 以太坊网络页面 了解当前端点详情和计划选项。
如何在不重写应用的情况下切换提供商?
由于以太坊 JSON-RPC 是标准化的,你通常只需更改端点 URL 和 API 密钥。将 RPC URL 放在配置中,而不是硬编码,这样迁移就是配置更改而非代码更改。
何时应从共享 RPC 迁移到专用节点?
当你持续触及速率限制、需要归档或 trace 方法,或需要为发布和交易窗口提供稳定吞吐量时。专用节点 将你的容量与其他租户隔离。