Hyperledger Fabric 2.2.X 解析区块到json( parsing block )只需要两行代码
package intermediately import ( "encoding/json" "github.com/hyperledger/fabric-protos-go/common" "github.com/hyperledger/fabric/common/tools/protolator" "github.com/pkg/errors" ) func EncodeProto( input *common.Block) ([]byte,error) { tree ,err := protolator.RecursivelyCreateTreeFromMessage(input) jsonByte,err :=json.Marshal(tree) if err != nil { return nil,errors.Wrapf(err, "error encoding output") } return jsonByte,nil }
*common.Block 是2.2.x版本统一的 proto.Message,因此可以作为Message类型,解析为tree,之后使用json进行序列化就OK了
https://gitee.com/mai12/glucia2a2a1 项目源码地址,golang sdk 大部分功能都写了例子,使用gin框架做的服务。
什么找到不到RecursivelyCreateTreeFromMessage这个函数?忘记说关键点了,
github.com/hyperledger/fabric@v2.1.1+incompatible/common/tools/protolator/json.go 的
这个recursivelyCreateTreeFromMessage函数首字母大写就好了,编译报错就把剩下的文件也改了,或者自己封装一个首字母大写的函数暴露出去。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
烟消云散大佬告诉我这样写不是最好的选择, golang中的io.Reader/Writer 可以在多种不同的io类型之间进行过渡和转化,不是我认为的文件操作,因此可以在不改动源码的情况下这样写
func EncodeProto2( input *common.Block) ([]byte,error) { var w = new(bytes.Buffer) if err := protolator.DeepMarshalJSON(w,input) ; err != nil { return nil,errors.Wrapf(err, "error encoding output") } return w.Bytes(),nil }
看一下这个例子,更能加深对io的理解
a := "Hello World!" buf := new(bytes.Buffer) buf.ReadFrom(strings.NewReader(a)) fmt.Println(buf.Bytes())