3. 节点与RPC接口:全节点、轻节点、归档节点区别;JSON-RPC协议详解

聊到链上数据监控,你首先得搞清楚数据从哪来。

说白了,就是怎么跟区块链节点打交道。节点类型选不对,RPC接口用不好,后面监控系统跑起来全是坑。我踩过不少,今天帮你捋清楚。

3.1 三种节点类型:全节点、轻节点、归档节点

区块链节点,本质上是运行了客户端软件的服务器。但不同节点,存的数据量、验证方式、资源消耗天差地别。

节点类型 存储内容 验证能力 磁盘占用 典型用途
全节点 完整区块头 + 当前状态 独立验证所有交易 几百GB ~ 1TB+ 日常交易、轻量查询
轻节点 仅区块头 依赖全节点验证 几MB 钱包、移动端
归档节点 完整区块头 + 所有历史状态 可查询任意历史状态 几TB ~ 十几TB 数据分析、审计、回溯

3.1.1 全节点

全节点是区块链网络的「中坚力量」。它下载并验证每个区块的每笔交易,维护当前最新的世界状态。

我个人习惯,在搭建生产级监控系统时,至少跑一个自己的全节点。为什么?因为第三方RPC服务商可能有速率限制,关键时刻掉链子,你监控系统就瞎了。

优点:数据完整、验证独立、安全可靠。

缺点:磁盘占用大,同步时间长(以太坊主网全节点首次同步可能要几天)。

避坑指南:我曾经图省事,直接用Infura的公共RPC做监控。结果某次大行情波动时,请求量暴增,直接被限流,监控告警全延迟了半小时。从那以后,监控系统我一定配自己的全节点。

3.1.2 轻节点

轻节点只下载区块头,不下载完整交易数据。它通过向全节点请求「默克尔证明」来验证交易。

你想想看,手机钱包不可能存几百GB数据吧?轻节点就是为这种场景设计的。

优点:资源占用极小,启动快。

缺点:依赖全节点,安全性稍弱,不适合高频数据查询。

嗯,这里要注意:轻节点不适合做监控系统的数据源。因为每次查询都要向全节点发起请求,延迟高、不稳定。

3.1.3 归档节点

归档节点是全节点的「超级版」。它不仅保存当前状态,还保存了所有历史状态——每个账户在任意区块高度的余额、每笔交易的完整上下文。

为什么需要它?举个例子:你想查询某个地址在一年前的ETH余额。全节点只能告诉你「当前余额」,归档节点才能告诉你「历史余额」。

我在做链上数据分析项目时,必须跑归档节点。没有它,很多回溯分析根本做不了。

注意:归档节点磁盘消耗极大。以太坊主网归档节点目前需要10TB+的SSD存储。成本不低,按需选择。

3.2 JSON-RPC协议详解

节点跑起来了,怎么跟它交互?

区块链节点普遍暴露JSON-RPC接口。说白了,就是通过HTTP或WebSocket发送JSON格式的请求,节点返回JSON格式的响应。

3.2.1 协议基础

JSON-RPC 2.0规范很简单。一个请求包含三个字段:

  • jsonrpc:固定为"2.0"
  • method:要调用的方法名
  • params:参数数组或对象
  • id:请求标识,用于匹配响应

一个典型的以太坊JSON-RPC请求长这样:

// 请求:查询最新区块号
{
  "jsonrpc": "2.0",
  "method": "eth_blockNumber",
  "params": [],
  "id": 1
}

// 响应
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": "0x10d4f2a"  // 十六进制区块号
}

3.2.2 常用方法分类

以太坊JSON-RPC方法很多,我按用途给你分个类:

类别 方法名 用途
链信息 eth_blockNumber, eth_chainId, net_version 获取链状态
账户查询 eth_getBalance, eth_getTransactionCount 查询账户余额、nonce
交易相关 eth_sendRawTransaction, eth_getTransactionReceipt 发送交易、查询交易回执
区块查询 eth_getBlockByNumber, eth_getBlockByHash 获取区块数据
日志/事件 eth_getLogs, eth_newFilter 监听合约事件
执行调用 eth_call, eth_estimateGas 模拟交易、估算Gas

3.2.3 核心方法详解

eth_getLogs——监控系统的核心方法

做链上监控,90%的时间都在跟eth_getLogs打交道。它用来查询合约触发的事件日志。

// 查询USDT转账事件(Transfer)
{
  "jsonrpc": "2.0",
  "method": "eth_getLogs",
  "params": [{
    "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
    "fromBlock": "0x10d4f00",
    "toBlock": "0x10d4f2a",
    "topics": [
      "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
    ]
  }],
  "id": 1
}

这里topics是事件签名的Keccak哈希。第一个topic通常是事件签名,后面的是索引参数。

重点fromBlocktoBlock的跨度不要太大。以太坊节点对单次查询的区块范围有限制(通常10000个区块)。我建议每次查询1000个区块,分批轮询。

eth_call——模拟链上查询

有时候你不想等事件,想直接查合约的当前状态。比如查某个地址在Uniswap池子里的流动性。

// 调用ERC20的balanceOf方法
{
  "jsonrpc": "2.0",
  "method": "eth_call",
  "params": [{
    "to": "0xdAC17F958D2ee523a2206206994597C13D831ec7",
    "data": "0x70a08231000000000000000000000000xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
  }, "latest"],
  "id": 1
}

data字段是方法选择器(4字节)加上参数ABI编码后的结果。嗯,这里要提醒你:eth_call不消耗Gas,但节点有速率限制。

3.2.4 WebSocket vs HTTP

监控系统需要实时性。HTTP是请求-响应模式,你得轮询。WebSocket是订阅-推送模式,节点主动通知你。

特性 HTTP WebSocket
通信模式 请求-响应 全双工
实时性 需轮询,有延迟 即时推送
资源消耗 高(频繁轮询) 低(长连接)
典型方法 eth_getLogs eth_subscribe

我个人建议:监控系统用WebSocket订阅新区块和待处理交易,用HTTP做历史数据回溯查询。两者结合,效率最高。

经验之谈:WebSocket连接要加心跳检测。我曾经遇到过节点端连接断开,但客户端没感知,导致监控静默了半小时才发现。加个ping/pong机制,每30秒检查一次连接状态。

3.3 节点选择与RPC配置建议

总结一下我的建议:

  • 监控系统数据源:跑自己的全节点,用WebSocket订阅实时数据
  • 历史数据回溯:归档节点 + HTTP的eth_getLogs,分批查询
  • 轻节点:别用在监控上,延迟和可靠性都不够
  • RPC限流:自建节点也要注意,单IP请求量过大可能被节点自身限流

我曾经帮一个项目方排查监控延迟问题,最后发现是他们用的公共RPC节点,每秒请求量超过阈值,被悄悄降级了。换成自建节点后,延迟从分钟级降到秒级。

嗯,节点和RPC这块,说白了就是选对工具、配好参数。后面章节我们会具体讲怎么搭建节点、怎么封装RPC客户端,到时候再细聊。


公众号:蓝海资料掘金营,微信deep3321