JSON-RPC 概念
JSON-RPC 协议作为一种基于 JSON 编码的远程过程调用标准,主要用于实现客户端与区块链节点之间的信息交互,是用户、开发者和钱包(如 MetaMask)与以太坊网络交互的标准方式。
为了区分功能,JSON-RPC 划分为多个命名空间,例如处理基础数据的 eth 模块、提供对原始数据的直接访问的 debug模块、用于系统调优的 admin 模块,以及支撑共识层与执行层通信的 Engine API,开发者可以用 ethers.js、web3.js 等库来封装这些 JSON-RPC 调用,实现更友好的交互。
**JSON-RPC 具有传输层无关性,本身只规定了数据的格式和交互逻辑(即如何打包请求和响应),而并不强制要求通过哪种具体的网络协议来搬运这些数据。**这意味着它可以根据不同的使用场景通过多种协议运行,比如通过HTTP、WebSocket、IPC。
为了确保跨客户端的兼容性,JSON-RPC 遵循严格的编码规则:
-
数据结构:每个请求必须包含唯一标识符 id、协议版本 jsonrpc、调用的 method 以及 params(参数)。
-
十六进制编码:**所有的数量(如区块号、金额)和非格式化数据(如哈希、地址)都必须使用带 “0x” 前缀的十六进制格式。**例如数字 65 表示为 0x41,地址和字节数组也需遵循此规则。
JSON-RPC 如何作为以太坊各层间的通信桥梁
节点被拆分为执行层和共识层。这两层之间通过 Engine API 进行通信,而该 API 正是构建在 JSON-RPC 接口之上的。
与面向用户的普通接口不同,Engine API 运行在独立的、经过身份验证的端口上,访问接口需要 **JSON Web Token (JWT)**进行身份验证,确保只有授权的共识客户端可以向执行客户端发送指令!
注意JWT 提供的是身份验证,不提供流量加密功能!
共识客户端和执行客户端通过 JSON-RPC 交换关于共识状态、分叉选择(Fork Choice)以及区块验证的关键信息。
JSON-RPC 不同 API 命名空间的作用
命名空间可以理解成工具箱里的不同隔层,每个隔层放置了特定用途的工具。
engine:核心驱动
这就是常提到的 Engine API,专门用于共识层和执行层之间的内部通信,需要 JWT 身份验证,普通用户通常无法直接接触。
eth 命名空间:工具箱
以太坊中最常用、最重要的命名空间,几乎所有的加密货币钱包、DApp都在用。
核心作用:它提供了与以太坊网络进行基础交互的功能,主要用于读取区块链数据和发送交易。
常见用途:
-
查询余额:使用 eth_getBalance 查看某个地址有多少 ETH。
-
查看区块:使用 eth_blockNumber 获取最新的区块高度,或使用 eth_getBlockByNumber 查看特定区块的详情。
-
估算手续费:使用 eth_gasPrice 或 eth_estimateGas 来计算发送交易需要多少油费。
-
合约交互:使用 eth_call 在不消耗 Gas 的情况下模拟执行合约代码。
debug 命名空间:X光机
debug 命名空间主要用于检查以太坊的内部状态,就像 X 光机,能让你看到区块链底层更原始、更细节的数据。
核心作用:提供对原始数据的直接访问。这对于区块链浏览器的开发者或进行底层协议研究的研究员非常有用。
许多 debug 方法需要节点进行大量的计算,普通节点可能扛不住,性能开销大,大多数公共 RPC 服务商(如 Infura)会限制甚至关闭这个命名空间。
admin:节点配置工具
用于管理节点本身(如添加节点对等体、修改配置)。因为涉及节点控制权,它被标记为高度敏感。
net:网络状态工具
用于查看节点的网络连接情况,比如当前连接了多少个“小伙伴”(Peers)。
txpool:交易池监控
让你能看到那些还没被打包进区块、正在排队等待的交易。
trace
提供多项用于检查以太坊状态的方法,通常包含类似 Parity 客户端风格的追踪功能。
rpc
提供关于 RPC 服务器本身及其所包含模块的信息。