go解析tendermint RPC接口返回的区块数据(解析失败可参考)

前言

关键代码

package blockchain

import (
	"errors"
	//必须使用tmjson做解析因为tmjson解析int64方式不一样
	tmjson "github.com/tendermint/tendermint/libs/json" 
	tmtypes "github.com/tendermint/tendermint/rpc/jsonrpc/types"
	tmtypes2 "github.com/tendermint/tendermint/rpc/coretypes"
	"originCodeServer/nodeservice/net"
	"strconv"
)

//区块链浏览器服务
//一些端口和服务URL
const (
	MNODEHOST           = "http://localhost:26657"
	ABCIINFOURL         = "/abci_info"          //ABCI应用信息
	ABCIQUERYURL        = "/abci_query"         //ABCI应用存储数据查询  ?path=""&data="abcd"&prove=false'
	BLOCKURL            = "/block"              //根据高度查询指定区块信息 height=1
	BLOCKCHAININFOURL   = "/blockchain"         //根据minHeight和maxHeight查询区块头信息
	TXURL               = "/tx"                 //根据hash进行交易查询 ?hash="0x9999"
	NETINFOURL          = "/net_info"           //查询网络信息节点数 ip
	BROADCASTTXASYNCURL = "/broadcast_tx_async" //异步广播交易 ?tx="name=123"
)

type BlockChainService struct {
}
//统一使用tmjson做解析 因为tendermint解析与encoding/json有所不同
//详细请看github.com/tendermint/tendermint/libs/json/doc.go文件
func (b *BlockChainService) FindBlockByHeight(height int) (*tmtypes2.ResultBlock, error) {
	rpcResult:=&tmtypes.RPCResponse{}
	blockResult :=&tmtypes2.ResultBlock{}
	if height <= 0 {
		return nil, errors.New("height不合法")
	}
	//这里使用POST方式获取
	data, err := net.Post(MNODEHOST+BLOCKURL, map[string]string{"height": strconv.Itoa(height)})
	if err != nil {
		return nil, err
	}
	err = tmjson.Unmarshal(data,rpcResult) //获取到rpcRespone
	if err != nil {
		return nil, err
	}
	err = tmjson.Unmarshal(rpcResult.Result,blockResult) //获取到block
	if err != nil {
		return nil, err
	}
	return blockResult, nil

}

结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值