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?

欢迎点赞、收藏、评论

相关推荐
迷藏49418 小时前
**发散创新:基于Solid协议的Web3.0去中心化身份认证系统实战解析**在Web3.
java·python·web3·去中心化·区块链
wechat_Neal19 小时前
Golang的车载应用场景
开发语言·后端·golang
Wenweno0o21 小时前
Eino-Graph 实战详解
golang·智能体·eino
咬_咬1 天前
go语言学习(数组与切片)
开发语言·学习·golang·数组·切片
CIO_Alliance1 天前
区块链技术在iPaaS系统集成中的应用
区块链·ipaas·系统集成·制造业·企业数智化转型·零售电商
xwz小王子1 天前
智元发布 GO-2:动作空间推理 + 全生命周期闭环,让机器人稳定可靠落地
开发语言·golang·机器人
GDAL1 天前
Go Channel `make()` 深入全面讲解
golang·make·通道
XMYX-01 天前
06 - Go 的切片、字典与遍历:从原理到实战
后端·golang
qq_396153451 天前
docker ddns-go 忘记密码
docker·容器·golang
XMYX-01 天前
04 - Go 的变量和常量:零值、类型推导与枚举
开发语言·golang