以太坊JSON通常指的是以太坊节点提供的JSON-RPC接口。简单来说,这是开发者和以太坊区块链打交道的一扇门。不管是查询余额、发送交易、读取区块数据,还是调用智能合约,背后基本都是通过JSON-RPC完成的。它采用无状态的通信方式,请求和响应都用JSON格式,任何支持HTTP或WebSocket的编程语言都能直接调用,所以成为对接以太坊最通用的方案。
调用以太坊JSON接口时,一般向节点地址发送一个POST请求,内容包含四个字段:jsonrpc表示协议版本,通常固定为2.0;method是你要调用的方法名;params是参数数组;id用来标识这次请求,方便对应返回结果。比如查询某个地址的以太坊余额,method写成eth_getBalance,params里放地址和latest,表示查最新区块的状态。节点收到后会返回一个JSON,其中result字段就是结果。需要注意,以太坊里涉及数量的返回值基本都是十六进制,比如余额、区块号、gas数量,拿到手还要做一次进制转换才能用在业务里。
查询类方法使用频率最高。eth_blockNumber获取当前最新区块高度,eth_getBalance查余额,eth_getTransactionByHash根据交易哈希查交易详情,eth_getBlockByNumber按区块号取整块数据。交易类方法里,eth_sendRawTransaction用来提交一笔已经签名的交易,签名动作必须在客户端本地完成,私钥绝不能直接发给节点。eth_estimateGas用来预估一笔交易大概要消耗多少gas,能帮用户提前判断手续费。eth_getTransactionCount查的是账户的nonce,也就是这个地址发过多少笔交易,发新交易前必须先取它来保证顺序正确。
和合约打交道主要靠两个方法。eth_call用于只读操作,比如查询代币余额、读取链上配置,这类调用不消耗gas也不上链,结果直接返回。eth_sendRawTransaction则用于写操作,比如转账代币、铸造NFT,这类操作会改变链上状态,必须付gas并等待打包。调用合约时,params里需要带上合约地址和根据函数签名编码出来的data字段,这一步通常由web3.js或ethers.js这类库自动完成,直接手写容易出错。实际开发中,大多数项目会用这些库封装JSON-RPC,省去手动拼参数的麻烦。
想用JSON接口,得先有一个能访问的节点。自建节点可以跑Geth或Erigon客户端,数据完全在自己手里,但运维成本高。更省事的做法是用第三方节点服务商,比如Infura、Alchemy、QuickNode,注册后拿到一个接口地址就能直接用,按请求量计费,也有免费额度。连接协议方面,HTTP适合一次性请求,WebSocket适合订阅事件,比如监听新区块产生或合约事件触发,实时性要求高的场景建议用WebSocket。
第一,私钥安全是底线,JSON-RPC本身不做签名托管,任何需要私钥的环节都应在本地完成后只提交签名数据。第二,注意区分latest和pending两种状态参数,前者取已确认的最新状态,后者包含内存池里待处理的交易,做监控或套利时区别很大。第三,第三方服务有速率限制,高频请求要做缓存和重试机制。第四,返回的hex数据要统一处理,位数补零、单位换算这些细节处理不好容易造成金额错误。掌握这些要点,对接以太坊JSON接口基本就不会踩大坑了。