以太坊作为全球领先的智能合约平台,其庞大的生态系统和复杂的链上状态吸引了无数开发者和用户,要与以太坊网络进行交互,无论是查询账户余额、获取交易详情、监控智能合约状态,还是分析链上数据,RPC(Remote Procedure Call,远程过程调用)接口都是最基础、最核心的途径,本文将深入探讨如何利用以太坊RPC查询链状态,帮助读者掌握这一关键技能。

以太坊RPC是一种基于JSON-RPC 2.0标准的通信协议,它允许应用程序(如钱包、浏览器、后端服务等)与以太坊节点进行远程通信,通过发送结构化的JSON请求,节点会执行相应的操作并返回JSON格式的响应,RPC就像一座桥梁,连接了你的应用程序和以太坊区块链的全局状态。
相比于使用第三方中心化API服务,直接连接到以太坊节点(无论是自己搭建的节点还是通过服务商提供的节点)进行RPC查询具有以下优势:
对于大多数开发者而言,搭建和维护自己的全节点成本较高(存储、计算、带宽),通常会使用以下公共RPC节点服务:

注意:公共RPC节点可能有速率限制,且在高度敏感的应用中需谨慎使用,因为流量可能被监控。
以太坊的链状态包括账户余额、nonce、代码、存储,以及区块信息、交易收据等,以下是一些常用的用于查询链状态的RPC方法:

eth_getBalance:查询指定地址的以太币余额(单位:Wei)。
address(字符串,查询地址),blockNumber(字符串,可选,区块号或"latest")。0x123...abc在最新区块的余额。{
"jsonrpc": "2.0",
"method": "eth_getBalance",
"params": ["0x1234567890123456789012345678901234567890", "latest"],
"id": 1
} {"jsonrpc":"2.0","id":1,"result":"0x1a05c0d000"} (表示余额为1 ETH 一些Wei)eth_getTransactionCount:查询指定地址的交易数量(nonce),用于确定发送交易时的nonce值。
address,blockNumber(可选)。0x123...abc的最新nonce。{
"jsonrpc": "2.0",
"method": "eth_getTransactionCount",
"params": ["0x1234567890123456789012345678901234567890", "latest"],
"id": 1
} {"jsonrpc":"2.0","id":1,"result":"0x5"} (表示已发送5笔交易)eth getCode:查询指定地址的合约代码,如果返回"0x",则表示该地址不是智能合约。
address,blockNumber(可选)。0xabc...def的代码。{
"jsonrpc": "2.0",
"method": "eth_getCode",
"params": ["0xabcdefabcdefabcdefabcdefabcdefabcdabcdef", "latest"],
"id": 1
} {"jsonrpc":"2.0","id":1,"result":"0x608060405234801561001057600080fd5b50..."} (合约字节码)blockNumber(字符串,区块号或"latest"/"earliest"/"pending"),transactionDetails(布尔值,是否包含交易详情,可选)。{
"jsonrpc": "2.0",
"method": "eth_getBlockByNumber",
"params": ["latest", false],
"id": 1
} eth_getTransactionByHash:根据交易哈希查询交易的详细信息。
transactionHash(字符串,交易哈希)。0xxyz...123的交易。{
"jsonrpc": "2.0",
"method": "eth_getTransactionByHash",
"params": ["0x0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"],
"id": 1
} eth_getTransactionReceipt:根据交易哈希查询交易收据,包含交易执行结果、gas使用量、日志等。
transactionHash(字符串,交易哈希)。{
"jsonrpc": "2.0",
"method": "eth_getTransactionReceipt",
"params": ["0x0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"],
"id": 1
} 要查询智能合约的状态变量或调用只读(view/pure)函数,通常需要使用eth_call。
transactionObject(包含to合约地址、data调用数据等),blockNumber(可选)。0xabc...def的balanceOf(address)函数,查询地址0x123...abc的代币余额。{
"jsonrpc": "2.0",
"method": "eth_call",
"params": [
{
"to": "0xabcdefabcdefabcdefabcdefabcdefabcdabcdef",
"data": "0x70a082310000000000000000000000001234567890123456789012345678901234567890" // balanceOf(address)的函数选择器 参数编码
},
"latest"
],
"id": 1
} {"jsonrpc":"2.0","id":1,"result":"0x0000000000000000000000000000000000000000000000000000000000de0b6"} (返回余额的十六进制表示)