原文在这里

1. 获取通道配置

peer channel fetch config config_block.pb -o $ORDERER_CONTAINER -c $CH_NAME --tls --cafile $TLS_ROOT_CA

上述命令需要在peer容器中执行

这一步得到对应通道的protobuf格式的通道配置。protobuf格式的配置文件并不适合阅读,可以使用官方提供的configtxlator来转换成JSON格式的:

configtxlator proto_decode --input config_block.pb --type common.Block --output config_block.json

排除不必要的元数据:

jq .data.data[0].payload.data.config config_block.json > config.json

config.json中就是我们所需要的通道配置。

2. 通过sdk来获取通道配置

除了上面提到的方式,还可以通过官方提供的sdk来获取通道配置。这里以fabric-sdk-go为例来介绍如何通过sdk来获取通道配置。

主要用到的是下面两个包:

  • github.com/hyperledger/fabric-sdk-go/pkg/client/ledger 提供账本相关操作接口
    • QueryConfigBlock: 获取当前通道使用的配置块
  • github.com/hyperledger/fabric/common/tools/protolator 提供protobuf格式转换服务
    • DeepMarshalJSON: 将protobuf格式的信息转换为JSON格式

代码示例如下:

blk, err := ledgerClient.QueryConfigBlock(ledger.WithTargetEndpoints(targetPeers...))
if err != nil {
	panic(err.Error())
}
buffer := &bytes.Buffer{}
err = protolator.DeepMarshalJSON(buffer, blk)
if err != nil {
	panic(err)
}
blockJson := make(map[string]interface{})
err = sonic.Unmarshal(buffer.Bytes(), &blockJson)
config := blockJson["data"].(map[string]interface{})["data"].([]interface{})[0].(map[string]interface{})["payload"].(map[string]interface{})["data"].(map[string]interface{})["config"]

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin92
Github: mengbin92
cnblogs: 恋水无意