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())

浙公网安备 33010602011771号