如何利用configtxlator工具查看ledger block的内容。
第一步:从orderer获取block
输入条件时blockid。
$ cat get.sh
#!/bin/bash
# The block to get
export BLOCKID=$1
export FABRIC_CFG_PATH=$(pwd)
export CORE_PEER_LOCALMSPID=Org1MSP
export CORE_PEER_MSPCONFIGPATH=${FABRIC_CFG_PATH}/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
export CHANNEL=mychannel
peer \
channel fetch ${BLOCKID} ${CHANNEL}block${BLOCKID}.pb \
-o orderer.example.com:7050 \
-c ${CHANNEL} \
--tls \
--cafile ${FABRIC_CFG_PATH}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.ordererorg.example.co
m-cert.pem
如果orderer不是TLS enabled,那么可以把--tls和--cafile参数去掉。
这一步生成本地文件${CHANNEL}block${BLOCKID}.pb,这是一个二进制文件。
第二步,把上面的pb文件转换成json可读文件。
利用configtxlator 工具
$ configtxlator proto_decode --input ${CHANNEL}block${BLOCKID}.pb --type common.Block --output ${CHANNEL}block${BLOCKID}.json
第三步,查看json的内容
例如,查看proposal内容:
$ jq ".data.data[0].payload.data.actions[0].payload.chaincode_proposal_payload" mychannelblock3.json {
"input": {
"chaincode_spec": {
"chaincode_id": {
"name": "mychaincode",
"path": "",
"version": ""
},
"input": {
"args": [
"aW52b2tl",
"Yg==",
"YQ==",
"MQ=="
]
},
"timeout": 0,
"type": "GOLANG"
},
"id_generation_alg": ""
}
}
我们可以看到调用的chaincode的名字(mychaincode),以及调用的输入参数(input.args)。
再看具体input.args的值:
$ echo "aW52b2tl" | base64 -d
invoke
$ echo "Yg==" | base64 -d
b
$ echo "YQ==" | base64 -d
a
$ echo "MQ==" | base64 -d
1
正好是从b转账1块钱到a的请求。
再看proposal response的值。
$ jq ".data.data[0].payload.data.actions[0].payload.action.proposal_response_payload" mychannelblock3.json
{
"extension": {
"chaincode_id": {
"name": "mychaincode",
"path": "",
"version": "1.0"
},
"response": {
"message": "",
"status": 200
},
"results": "EhsKBGxzY2MSEwoRCgtteWNoYWluY29kZRICCAESNwoLbXljaGFpbmNvZGUSKAoHCgFhEgIIAgoHCgFiEgIIAhoJCgFhGgQxMDAyGgkKAWIaBDE5OTg="
},
"proposal_hash": "roxMAR4hqXMnIjUZx0w8Uo3TuOrDeSGDTvVCYHu9YZU="
}
解析results的值:
$ echo "EhsKBGxzY2MSEwoRCgtteWNoYWluY29kZRICCAESNwoLbXljaGFpbmNvZGUSKAoHCgFhEgIIAgoHCgFiEgIIAhoJCgFhGgQxMDAyGgkKAWIaBDE5OTg=" | base6 -d
�
lscc��
�
mychaincode���7
mychaincode�(
�a��
�b���
�a��1002�
�b��1998
这是一个二进制数据,不能完全解析,但是部分可见的字符我们可以猜测他的含义:包含一个readset和writeset,其中writeset里面包含b要写入的值是1002,a要写入的值是1998,是不是?