什么是以太坊 RPC?JSON-RPC 的工作原理与连接方法

阅读时长 6 分钟

什么是以太坊 RPC?JSON-RPC 的工作原理与连接方法

首页>FAQs>什么是以太坊 RPC?JSON-RPC 的工作原理与连接方法
分享

什么是以太坊 RPC?

2026 年第一季度,以太坊网络处理了 2.004 亿笔交易,环比增长 43%。每一个余额查询、每一次智能合约调用、每个钱包和 DeFi 协议提交的每一笔交易,都经由某个 RPC 端点完成。这就是大规模场景下的以太坊 RPC 的真实面貌:应用程序与区块链之间的接口。

RPC 代表远程过程调用(Remote Procedure Call)。在以太坊的语境中,它是一种机制,让应用程序——钱包、交易所、DeFi 协议——能够与以太坊节点通信并获取结果,而无需自己运行节点。为这种通信定义结构的协议是 JSON-RPC,这是一种轻量级标准,将请求和响应格式化为通过 HTTP 或 WebSocket 传输的 JSON 对象。

对于在以太坊上构建的开发者来说,RPC 不是可以跳过的细节。它是你的应用程序触及区块链的最低层级——你用来与以太坊交互的每一个库、每一个框架、每一个工具,底层都在进行 JSON-RPC 调用。

以太坊 RPC 的工作原理

以太坊 RPC 基于 JSON-RPC 2.0 规范——这是一种无状态、与传输方式无关的协议,由 ethereum.org 维护和撰写文档。你的应用程序发送一个描述其意图的 JSON 对象,节点处理后返回 JSON 响应。

每个请求都遵循相同的结构:方法名(你要调用的操作)、params(输入参数)、jsonrpc 版本字段,以及一个由你分配的 id,用于将响应与请求一一对应。

下面是一个最小示例——查询最新区块号:

{
"jsonrpc": "2.0",
"method": "eth_blockNumber",
"params": [],
"id": 1
}

节点返回:

{
"jsonrpc": "2.0",
"id": 1,
"result": "0x13f8a4c"
}

结果以十六进制编码。0x13f8a4c 换算成十进制是区块 20,939,852。所有方法的模式都是一致的:你描述调用,节点针对当前区块链状态执行,然后你得到结果。

JSON-RPC 之所以非常适合以太坊,在于其简单性。该协议是无状态的——没有持久会话,客户端与服务器之间也没有持续的协商。每个请求都是自包含的。这使它易于实现、易于缓存,也便于调试。开发者仅用 curl 就能复现任何 RPC 调用。

Ethereum Execution API 规范定义了所有兼容执行客户端的标准方法全集。无论你连接的节点运行的是 Geth、Nethermind、Besu 还是 Erigon,方法都是一样的——而且与你使用哪家 RPC 提供商也无关。

常用以太坊 RPC 方法

这些是你最常用的方法,涵盖了任何以太坊应用所需的核心操作:读取状态、提交交易、查询事件和检查区块。

  • eth_blockNumber ——返回最新的区块号。用于链同步状态检查和区块轮询。
  • eth_getBalance ——返回指定区块时某个地址的 ETH 余额。用于钱包余额显示。
  • eth_call ——执行只读合约调用而不创建交易。用于读取合约状态,不消耗 Gas。
  • eth_sendRawTransaction ——广播已签名的序列化交易。用于发送 ETH、ERC-20 转账和合约写入。
  • eth_getTransactionByHash ——按哈希返回交易详情。用于跟踪已提交的交易。
  • eth_getTransactionReceipt ——返回已确认交易的回执。用于确认成功并读取产生的事件日志。
  • eth_getLogs ——返回按地址、主题和区块范围匹配筛选条件的日志。用于监听合约事件。
  • eth_getBlockByNumber ——按区块号或标签返回区块详情。用于索引和链上分析。
  • eth_estimateGas ——估算一笔交易所需的 Gas。用于提交前的预检。
  • net_version ——返回当前网络 ID。用于区分主网与测试网。

eth_call 是你读取合约数据的方式。它基于节点当前状态模拟调用并返回结果,不向网络广播任何内容。无需签名,也不消耗 Gas。每当你查询视图函数——代币余额、池储备、价格数据——底层用的都是 eth_call

eth_sendRawTransaction 用于写入操作。你在客户端构建并签名交易,将其序列化,然后提交签名字节。节点验证签名并把交易广播到 mempool。客户端签名与广播相分离是有意为之:你的私钥永远不会离开你的应用程序。

eth_getLogs 功能强大但需要一些纪律。对繁忙合约的大区块范围查询在公共端点上可能开销巨大,还可能触发限流。请按合约地址和特定事件主题过滤,并在有界范围内查询。

如何连接以太坊 RPC 端点

连接以太坊 RPC 归结起来就是一个 URL。每家提供商在你注册时都会给你一个:

https://rpc.yourprovider.com/YOUR_API_KEY

你可以直接向该 URL 发送原始 HTTP POST 请求,也可以把它传给某个库。下面是使用 ethers.js 的简单版本:

const { ethers } = require("ethers");

const provider = new ethers.JsonRpcProvider("https://rpc.yourprovider.com/YOUR_API_KEY");

async function getBalance(address) {
const balance = await provider.getBalance(address);
console.log(ethers.formatEther(balance), "ETH");
}

getBalance("0xYourAddressHere");

如果你想要最少的依赖和最大的透明度,直接用 fetch 也同样可行:

const response = await fetch("https://rpc.yourprovider.com/YOUR_API_KEY", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
jsonrpc: "2.0",
method: "eth_blockNumber",
params: [],
id: 1
})
});

const data = await response.json();
console.log(parseInt(data.result, 16)); // current block number as decimal

无需安装节点,无需等待同步。把应用程序指向端点 URL,你就能完整访问以太坊主网——或提供商支持的任何测试网。

公共与私有以太坊 RPC 端点

获取以太坊 RPC 端点有两种方式:使用第三方服务提供的端点,或自己运营节点。

公共端点由提供商托管,他们代你运行和维护节点基础设施。你注册、获得 API 密钥、完成连接。运维负担留在提供商一侧。对于大多数开发工作和大量生产部署而言,这是务实的选择:几分钟内即可上线,无需管理本地节点,提供商还会在以太坊客户端软件演进时负责升级。

代价是速率限制。公共端点是共享基础设施,因此高量查询——大范围的 eth_getLogs 调用、热门应用带来的突发流量——可能被限流。大多数提供商提供分层方案,随规模扩大提升速率上限。

私有端点意味着运行自己的以太坊节点。回报是完全的控制权:没有速率限制,不依赖第三方的正常运行时间,可完整访问归档数据,并能根据自身需求精确配置节点。代价在运维方面。一个完整的以太坊节点需要大量存储(归档节点需要数 TB,因为它保留全部历史状态)、持续的内存与算力,以及随客户端软件演进而不断进行的维护。

架构选择并非一成不变。许多团队从公共端点起步,验证产品,待规模和具体需求足够时再迁移到私有基础设施。

以太坊 RPC vs. WebSocket:该用哪个?

HTTP 和 WebSocket 都是 JSON-RPC 的传输方式,各自适合不同的场景。在做出选择之前,值得理解两者的区别。

HTTP RPC 是请求-响应模式。你的应用程序发送请求、收到结果,连接随即关闭。设计上就是无状态的。它适用于大多数以太坊交互:余额查询、交易提交、合约读取、区块查询。如果你的应用主动发起调用并处理响应,HTTP 是正确的默认选择——更易使用,也更容易缓存和调试。

WebSocket 在你的应用程序与节点之间保持一条持久的双向连接。这带来了订阅能力:应用程序可以告诉节点“有新区块到达时通知我”或“该合约发出此事件时通知我”,节点会在事件发生时推送更新,应用程序无需轮询。相关方法是 eth_subscribe,它只能通过 WebSocket 使用。

实用建议:从 HTTP 开始。如果你发现自己反复轮询 eth_blockNumber 来检测新区块,或在循环中轮询交易回执,那就是把该交互迁移到 WebSocket 订阅的信号。两者可以并行使用——HTTP 用于按需查询,WebSocket 用于事件监听。

免费以太坊 RPC 端点——如何选择

大多数生产级提供商都提供免费套餐。它们的情况如下:

  • Infura ——由 ConsenSys 支持,与 MetaMask 直接集成,提供免费套餐,注册开发者超过 40 万。
  • Alchemy ——免费套餐额度可观(每月约 3000 万计算单元),提供包含交易模拟在内的增强开发者 API。
  • QuickNode ——在主要提供商中公开基准测试延迟最低(全球平均约 86ms),合规表现稳健。
  • CoinsDo ——免费以太坊 RPC 端点,无前期费用,无需信用卡即可开始。专为想在产品获得验证之前不必为账单担心的开发者而设。

免费套餐是真实可用的。差别在于上限在哪里:每秒请求数、每日请求限额、是否包含归档数据,以及 WebSocket 支持情况。

在为生产环境选择提供商之前,检查三件事:相对于预期请求量的速率限制、应用需要历史查询时归档数据的可用性,以及正常运行时间保障的 SLA 条款。如果你的应用对延迟敏感,延迟也很重要——各家基准表现不一,地理位置也会影响结果。

在早期开发阶段,CoinsDo 的免费 RPC 端点 是一个干净的选择:入门毫无摩擦,在你还在摸索生产架构时,也不会有升级付费套餐的压力。

常见问题

以太坊 RPC 节点和 RPC 端点有什么区别?

节点是以太坊客户端软件——Geth、Nethermind、Besu 或 Erigon——负责运行区块链:同步区块、验证交易、维护状态。RPC 端点是你要用来与该节点通信的网络地址。当你使用 CoinsDo、Infura 或 Alchemy 等公共提供商时,节点由他们运营,你拿到的是端点 URL。

以太坊 RPC 是免费的吗?

通过公共提供商,是的。大多数主要提供商提供的免费套餐足以覆盖开发和中等规模的生产使用。CoinsDo 提供免费端点,无需信用卡。付费方案则随应用规模扩大提供更高的速率限制和更多功能。

以太坊主网默认的 RPC URL 是什么?

并不存在统一的默认值。以太坊不内置公共端点。你要连接由提供商(Infura、Alchemy、QuickNode、CoinsDo)运营的端点,或连接自建的节点。URL 格式因提供商而异,并包含你的 API 密钥。

以太坊 RPC 与 WebSocket 有什么区别?

HTTP RPC 是无状态的请求-响应:应用程序发送请求并收到结果。WebSocket 保持持久连接,并通过 eth_subscribe 支持订阅,因此节点可以向你的应用推送实时更新——新区块、合约事件——无需轮询。按需查询用 HTTP;需要实时事件通知时用 WebSocket。

不运行节点也能用以太坊 RPC 吗?

可以,这正是公共 RPC 端点的核心功能。提供商运行节点基础设施,你的应用程序连接到他们的端点 URL。无需安装客户端、等待链同步或管理本地存储,即可完整访问以太坊主网。

eth_call 是做什么的?

eth_call 对智能合约执行只读调用。它基于节点当前状态运行合约代码并返回结果,不创建交易,也不向网络广播任何内容。无 Gas 消耗,不改变链上状态。每当你需要从合约读取数据——代币余额、池价格、治理状态,以及任何通过 view 或 pure 函数暴露的内容——都可以使用它。

David Ho

作者

David Ho

Writer / Blockchain Enthusiast

business@coinsdo.com