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?

欢迎点赞、收藏、评论

相关推荐
程序员李程峰7 小时前
基础知识——区块链钱包
web3·去中心化·区块链·同态加密·零知识证明·共识算法·分布式账本
geovindu13 小时前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
区块block14 小时前
Infinity Alpha(无限阿尔法)即将发布纯链上AI收益引擎通证IA
人工智能·区块链
开发小程序的之朴14 小时前
基于Go语言的企业级CMS系统架构设计与性能分析——以AnQiCMS为例
开发语言·golang·系统架构
初心未改HD16 小时前
Go语言net/http与Web开发:构建高性能HTTP服务
开发语言·golang
Datakeji16 小时前
维恩波特Vairnport商业逻辑
大数据·人工智能·区块链
memories19817 小时前
Go 语言 Channel(管道/通道)
开发语言·后端·golang
初心未改HD17 小时前
Go语言结构体Struct:内存布局、标签、接收者与内存对齐
开发语言·golang
jieyucx17 小时前
Go 数据结构入门:线性表、顺序表、链表
数据结构·链表·golang
eLIN TECE18 小时前
Golang 构建学习
开发语言·学习·golang