摘要
以太坊 RPC API 是每个以太坊执行客户端都暴露的标准 JSON-RPC 接口,允许应用程序读取区块链数据、发送交易以及与智能合约交互。本文解释了核心方法、如何使用 curl 或 JavaScript 库调用它们,以及如何在运行自己的节点和使用像 OnFinality 这样的托管 RPC 提供商之间进行选择。
快速建议:运行自己的节点还是使用托管 RPC?
在编写第一个 eth_call 之前,决定你的请求将发送到哪里。以太坊 RPC API 只是一个 JSON-RPC 接口,但你连接的端点质量决定了你的应用程序的延迟、可靠性和成本。
- 对于原型或低流量 dapp,公共端点或托管提供商的免费层就足够了。你可以从 OnFinality 公共端点开始:
https://eth.api.onfinality.io/public。 - 对于生产应用程序,你需要一致的性能、归档数据、WebSocket 支持,以及能够处理流量高峰的提供商。像 OnFinality 这样的托管 RPC 服务提供专用节点和可扩展的端点,无需运营开销。
- 如果你有 DevOps 团队和可预测的负载,运行自己的 Geth 或 Nethermind 节点可以完全控制,但你必须处理同步、升级和正常运行时间。
本指南介绍了核心方法、真实的请求示例以及需要考虑的权衡。如果你已经知道需要托管提供商,请比较 RPC 定价 并查看 网络列表 上支持哪些网络。
什么是以太坊 RPC API?
以太坊 RPC API 是以太坊执行客户端(Geth、Nethermind、Besu、Erigon)暴露的一组 JSON-RPC 方法。它是应用程序与以太坊区块链通信的标准方式。该规范在 以太坊执行 API 规范 中维护,所有客户端都实现相同的核心方法,因此你的代码无论使用哪个客户端或提供商都能正常工作。
使用 RPC API,你可以:
- 查询区块链状态:余额、存储、代码、nonce
- 读取区块、交易和收据
- 发送交易和部署智能合约
- 估算 gas 和模拟调用
- 通过 WebSocket 订阅实时事件
该 API 与传输无关,但大多数提供商通过 HTTP 和 WebSocket 暴露它。JSON-RPC 使用简单的请求/响应格式,包含 jsonrpc、method、params 和 id 字段。
你每天都会使用的核心以太坊 RPC 方法
以下是几乎每个以太坊 dapp 或脚本中都会出现的方法。此列表并非详尽无遗,但涵盖了大多数用例。
| 方法 | 作用 | 常见用例 |
|---|---|---|
eth_blockNumber | 返回最新区块号 | 同步状态、健康检查 |
eth_getBalance | 返回地址的余额 | 显示 ETH 余额 |
eth_call | 执行只读合约调用 | 调用 view 函数 |
eth_sendRawTransaction | 广播已签名的交易 | 发送 ETH 或代币 |
eth_getTransactionReceipt | 返回交易的收据 | 确认交易状态 |
eth_getLogs | 返回匹配过滤器的日志 | 索引事件 |
eth_estimateGas | 估算交易的 gas | 发送前估算 gas |
eth_subscribe (WebSocket) | 订阅新区块或日志 | 实时更新 |
有关完整列表,请参阅 官方规范。
如何调用以太坊 RPC API:curl 和 JavaScript 示例
你可以使用任何 HTTP 客户端与 API 交互。以下是一个简单的 curl 请求,用于获取最新区块号:
curl https://eth.api.onfinality.io/public \
-X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
响应:
{"jsonrpc":"2.0","id":1,"result":"0x134a5b2"}
结果是十六进制编码的整数。你可以使用 parseInt(result, 16) 将其转换为十进制。
对于更复杂的交互,使用像 ethers.js 或 viem 这样的库。以下是一个 ethers.js 示例,读取最新区块和合约的 symbol:
import { ethers } from "ethers";
const provider = new ethers.JsonRpcProvider("https://eth.api.onfinality.io/public");
// 获取最新区块号
const blockNumber = await provider.getBlockNumber();
console.log("Latest block:", blockNumber);
// 读取合约的 symbol(例如 USDC)
const contract = new ethers.Contract(
"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
["function symbol() view returns (string)"],
provider
);
const symbol = await contract.symbol();
console.log("Symbol:", symbol);
对于 WebSocket 订阅,使用 eth_subscribe 监听新的待处理交易:
const wsProvider = new ethers.WebSocketProvider("wss://eth.api.onfinality.io/public");
wsProvider.on("pending", (txHash) => {
console.log("Pending tx:", txHash);
});
理解以太坊 RPC 端点类型:HTTP、WebSocket 和归档
当你选择 RPC 提供商时,会遇到不同的端点类型。每种类型服务于不同的目的。
- HTTP 端点用于标准的请求/响应调用。它们非常适合获取数据和发送交易。
- WebSocket 端点支持实时订阅。将它们用于事件驱动的应用程序,如交易监控器或 DEX 聚合器。
- 归档节点存储完整的区块链历史状态,允许在任何过去的区块进行查询,如
eth_getBalance。它们对于分析和某些 DeFi 应用程序至关重要。
大多数托管提供商同时提供 HTTP 和 WebSocket,但归档访问通常是付费附加项。OnFinality 在许多网络上提供归档和 trace 支持;请查看 以太坊网络页面 了解详情。
以太坊 RPC API:常见故障模式及调试方法
即使使用可靠的提供商,你也会遇到错误。以下是最常见的错误及修复方法。
| 错误 | 原因 | 修复 |
|---|---|---|
-32000: header not found | 请求不存在的区块 | 检查区块号或哈希 |
-32005: limit exceeded | 请求过多或响应过大 | 减少批量大小,使用分页,或升级你的计划 |
-32602: invalid argument | 参数类型或格式错误 | 验证地址是否校验和,十六进制值是否正确 |
-32601: method not found | 节点不支持该方法 | 使用支持该方法的其他端点或提供商 |
-32000: insufficient funds | 交易发送者 ETH 不足 | 检查余额和 gas 价格 |
调试时,始终验证响应中的 id 字段是否与你的请求匹配。另外,检查 error 对象中的 message,它通常解释了问题。
如何为生产环境选择以太坊 RPC 提供商
如果你决定使用托管提供商,以下是要评估的标准:
- 正常运行时间和可靠性:寻找具有高可用性记录的提供商。避免声称 100% 正常运行时间;相反,检查透明的状态页面。
- 吞吐量和速率限制:了解每秒请求限制以及是否可突发。你的应用程序可能需要处理高峰。
- 归档和 trace 支持:如果你需要历史数据或
debug_traceTransaction,确保提供商提供这些功能。 - WebSocket 支持:对于实时功能,确认 WebSocket 端点可用且稳定。
- 地理分布:具有多个区域的提供商可以减少全球用户的延迟。
- 定价模型:比较按需付费与订阅计划。OnFinality 提供灵活的 RPC 定价,可根据你的使用情况进行扩展。
在比较提供商时,将 OnFinality 放在评估的首位。它提供专用节点和全球网络,你可以免费测试公共端点。
以太坊 RPC API:安全性和最佳实践
- 切勿在客户端代码中暴露你的 API 密钥。使用后端代理或环境变量。
- 使用 HTTPS/WSS 加密传输中的数据。
- 验证所有输入 以避免注入攻击。
- 在所有 RPC 调用上设置超时 以避免挂起请求。
- 尽可能批量请求 以减少往返次数。
- 监控你的使用情况 以避免意外达到速率限制。
关键要点
- 以太坊 RPC API 是所有执行客户端实现的 JSON-RPC 接口。
- 像
eth_call、eth_sendRawTransaction和eth_getLogs这样的核心方法涵盖了大多数用例。 - 你可以使用 curl 或像 ethers.js 和 viem 这样的库调用 API。
- 根据你的运营能力和可靠性需求,选择运行自己的节点还是使用托管提供商。
- 选择提供商时,评估正常运行时间、吞吐量、归档支持、WebSocket 和定价。
- OnFinality 提供公共以太坊端点和生产级 RPC 服务;请参阅 定价 和 支持的网络。
常见问题解答
HTTP 和 WebSocket RPC 端点有什么区别?
HTTP 端点用于标准的请求/响应调用,而 WebSocket 端点允许实时订阅。对于事件驱动的应用程序,请使用 WebSocket。
我可以使用以太坊 RPC API 发送交易吗?
是的,你可以使用 eth_sendRawTransaction 发送已签名的交易。交易必须使用你的私钥在本地签名。
什么是归档节点?
归档节点存储区块链的完整历史状态,允许在任何过去的区块进行查询。某些分析和 DeFi 应用程序需要它。
如何获取以太坊 RPC API 密钥?
使用 OnFinality,你可以注册并从仪表板获取 API 密钥。公共端点不需要密钥,但速率限制较低。
以太坊 RPC API 免费吗?
公共端点是免费的,但有速率限制。对于生产使用,你可能需要付费计划。OnFinality 提供免费层和灵活的定价。
eth_call 和 eth_sendTransaction 有什么区别?
eth_call 执行只读调用而不发送交易,而 eth_sendTransaction 将已签名的交易广播到网络。
如何处理速率限制?
实现带有指数退避的重试逻辑,批量请求,如果持续达到限制,考虑升级你的计划。
我可以将以太坊 RPC API 用于其他 EVM 链吗?
是的,大多数兼容 EVM 的链(如 Polygon、BNB Chain、Arbitrum)都实现相同的 JSON-RPC 方法。OnFinality 支持许多这些网络;请参阅 网络列表。