首页 > 解决方案 > Hyperledger Fabric Go SDK:如何解析块

问题描述

我正在使用 Hyperledger Golang SDK 来实现客户端以使用分类帐。我的应用程序依赖于发送的事件,但是,我想使用 BlockEvents 以便我可以确保给定的数据已经写入分类帐而不是链码事件。不幸的是,关于这类事件的文档非常有限。我注册了 BlockEvents,并使用它们每个引用的结构func (c *Client) RegisterBlockEvent()...获取BlockEvent响应。Block块结构如下所示:

type Block struct {
    Header               *BlockHeader   `protobuf:"bytes,1,opt,name=header,proto3" json:"header,omitempty"`
    Data                 *BlockData     `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
    Metadata             *BlockMetadata `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"`
    XXX_NoUnkeyedLiteral struct{}       `json:"-"`
    XXX_unrecognized     []byte         `json:"-"`
    XXX_sizecache        int32          `json:"-"`
}

我可以导航到BlockData

type BlockData struct {
    Data                 [][]byte `protobuf:"bytes,1,rep,name=data,proto3" json:"data,omitempty"`
    XXX_NoUnkeyedLiteral struct{} `json:"-"`
    XXX_unrecognized     []byte   `json:"-"`
    XXX_sizecache        int32    `json:"-"`
}

但是,此时我迷路了,只有一个原始字节数组作为数据。我想针对特定的资产创建事件,并且需要解析块数据以搜索数据。该数据使用什么结构或结构?我假设每个数组条目都代表一个事务,但是如果没有映射到它的结构,解析非常困难。

标签: hyperledger-fabrichyperledgerchaincode

解决方案


用 protolator 写一个函数 ParseBlock

// import "github.com/hyperledger/fabric-sdk-go/pkg/util/protolator"


func ParseBlock(block *common.Block)  {
    if err := protolator.DeepMarshalJSON(os.Stdout, block); err != nil {
        log.Fatalln("DeepMarshalJSON err:", err)
    }
}

推荐阅读