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?

欢迎点赞、收藏、评论

相关推荐
henujolly1 天前
如何与 Uniswap、Sushiswap 等去中心化交易所交互,理解 AMM(自动做市商)的原理
去中心化·区块链
NBhhbYyOljP1 天前
LabVIEW与西门子PLC S7200SMART 12001500 300 400
golang
我的golang之路果然有问题1 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
岁岁种桃花儿1 天前
深度解析DolphinScheduler核心架构:去中心化调度的设计与实践
架构·去中心化·区块链
Z.风止1 天前
Go-learning(1)
开发语言·笔记·后端·golang
小二·1 天前
Go 语言系统编程与云原生开发实战(第7篇)分布式系统核心能力:配置中心 × 链路追踪 × 熔断降级(生产级落地)
开发语言·云原生·golang
lead520lyq1 天前
Golang Grpc接口调用实现账号密码认证
开发语言·后端·golang
小二·1 天前
Go 语言系统编程与云原生开发实战(第6篇)云原生部署实战:Docker 镜像瘦身 × K8s 部署 × Helm 一键发布
docker·云原生·golang
花酒锄作田2 天前
MCP官方Go SDK尝鲜
golang·mcp
老姚---老姚2 天前
在windows下编译go语言编写的dll库
开发语言·windows·golang