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?

欢迎点赞、收藏、评论

相关推荐
Web3李李14 小时前
链游想要获得市场认可,核心从来不是极致去中心化
web3·去中心化·区块链·软件开发·链游开发
圣殿骑士-Khtangc15 小时前
Go错误处理最佳实践进阶从error到panic的完整指南
golang
运维开发笔记16 小时前
3.6 Go defer 语句学习笔记
golang
mykj155117 小时前
稳定的DOO算力质押系统DAPP合约底层逻辑
web3·区块链·dapp·rwa·质押挖矿
FfHUCisI17 小时前
Golang HTTP 路由设计与请求处理
开发语言·http·golang
存在morning17 小时前
【Python 开发实践 一】Python vs Go vs Java 三门语言对比
java·python·golang
大鱼>1 天前
以太坊Layer2扩容:Optimistic vs ZK-Rollup完整对比
区块链
圣殿骑士-Khtangc1 天前
Go字符串高效拼接性能对比与底层原理分析
服务器·前端·golang
汇策研习社1 天前
斐波那契均线交易体系:21/55/89三重均线趋势战法详解
大数据·经验分享·金融·区块链·fastbull
同花顺期货通1 天前
期货新手入门品种筛选:2026年低保证金高流动性品种深度解析
区块链