go语言从零实现以太坊请求端 - 查询区块链账户余额 - 手写JSONRPC
- [1. 环境](#1. 环境)
- [2. 代码](#2. 代码)
-
- [2.1 对比代码](#2.1 对比代码)
- [3. 测试](#3. 测试)
-
- [3.2 sepolia节点](#3.2 sepolia节点)
1. 环境
基础环境和代码参考系列文章
2. go语言从零实现以太坊客户端 - 查询区块链账户余额
2. 代码
主体代码和2. go语言从零实现以太坊客户端 - 查询区块链账户余额文章中的相同。
参考文章中底层JSONRPC通信用到了开源库实现的,内部封装了JSONRPC结构和Http通信,用起来比较简单。
但既然是从零实现系列,那就要更深入一些,手写JSONRPC通信过程,会对以太坊通信交互有更深入的了解。
2.1 对比代码
2. go语言从零实现以太坊客户端 - 查询区块链账户余额中的代码
用到开源库"github.com/ybbus/jsonrpc/v3"
go
var JsonRPCClient jsonrpc.RPCClient
func InitJsonRPCClient(url string) {
JsonRPCClient = jsonrpc.NewClient(url)
}
func SendJsonRPC(funcName string, params ...interface{}) interface{} {
var rsp interface{}
err := JsonRPCClient.CallFor(context.Background(), &rsp, funcName, params)
if err != nil {
panic(err)
}
return rsp
}
从零手写
go
type RPCRequest struct {
Method string `json:"method"`
Params interface{} `json:"params,omitempty"`
ID int `json:"id"`
JSONRPC string `json:"jsonrpc"`
}
type RPCResponse struct {
Method string `json:"method"`
ID int `json:"id"`
Result string `json:"result"`
}
func SendJsonRPCHttp(url string, funcName string, params ...interface{}) string {
rpcRequest := RPCRequest{funcName, params, 0, "2.0"}
data := utils.SendRequest(url, rpcRequest)
var rpcResponse RPCResponse
_ = json.Unmarshal(data, &rpcResponse)
return rpcResponse.Result
}
http通信
go
package utils
import (
"bytes"
"encoding/json"
"io"
"net/http"
)
func SendRequest(url string, param interface{}) []byte {
jsonData, _ := json.Marshal(param)
// 发送 POST 请求
rsp, _ := http.Post(
url,
"application/json",
bytes.NewBuffer(jsonData),
)
defer rsp.Body.Close()
data, _ := io.ReadAll(rsp.Body)
return data
}
其实就是对JSONRPC请求序列化,Http post发送。收到的响应反序列化,获得结果。
其他地方不用改,对比文章中调用SendJsonRPC的地方,替换为SendJsonRPCHttp即可运行。
3. 测试
3.1 hardhat node节点

3.2 sepolia节点

提供一个好用的网页版Http服务端工具,可以便捷的测试http请求,查看请求数据是否正确。

是不是很nice?
欢迎点赞、收藏、评论