7. go语言从零实现以太坊请求端 - 查询区块链账户余额 - 手写JSONRPC

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?

欢迎点赞、收藏、评论

相关推荐
kida_yuan2 天前
【以太来袭】4. Geth 原理与解析
区块链
花酒锄作田4 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
blockcoach4 天前
刘教链|金融市场中的物理学规律:平方根定律
区块链
碳链价值4 天前
吴忌寒清仓比特币背后
区块链
blockcoach4 天前
刘教链|BTC的时光机
区块链
qwfys2004 天前
How to install golang 1.26.0 to Ubuntu 24.04
ubuntu·golang·install
lsrsyx4 天前
TEBBIT:以安全、创新与服务,重塑您的数字资产交易体验
安全·区块链
lsrsyx4 天前
Icoin:当市场归于理性,强者浮出水面
区块链
codeejun4 天前
每日一Go-25、Go语言进阶:深入并发模式1
开发语言·后端·golang