查看区块链信息
docker exec [container] peer channel getinfo -c [channel]
#返回如下信息
Blockchain info: {"height":3,"currentBlockHash":"MvXGp1W3jK7vnn5V0dGZAgg7iIadjLCl1ArCh5XHXHs=","previousBlockHash":"BxXo7hCkE6Gb4Y/KDi0M85dw/8d7S4BU1hvcVz0DQJw="}
#区块链高度为3,区块链的编号为0, 1, 2,其中0是创世区块
获取区块文件
#获取区块链文件
docker exec [container] peer channel fetch [block-number] -c [channel]
#区块文件保存在当前文件夹,文件名为[channel]_[block-number].block
#拷贝区块文件到宿主机器当前文件夹
docker cp [container]:/opt/gopath/src/github.com/hyperledger/fabric/peer/[channel]_[block-number].block ./
解析区块文件
使用fabric-samples中的二进制工具configtxgen解析区块文件,可以将configtxgen所在文件夹添加到PATH中。再查看环境变量中是否有FABRIC_CFG_PATH,没有的话要设置成configtx.yaml所在文件夹,否则configtxgen会找不到配置文件。
#将区块文件解析成json文件
configtxgen -inspectBlock [.block file] > [.json file]
区块结构
为了增强可读性,可以用在线工具将json转成yaml
---
header:
data_hash: ...
number: ...
previous_hash: ...
data:
data:
- payload: ...
signature: ...
metadata:
metadata: ...
可以看到一个区块包括三部分:
- 区块头:包含当前区块哈希、区块序号、前一区块的哈希;
- 区块数据:交易组成的数组
- 元数据:和当前区块相关的元数据
交易结构
signature: ...
payload:
header:
channel_header: ... //包括txid、时间戳、通道等信息
signature_header: ... //包括sender的证书、mspid、随机数nonce
data:
actions:
- header:
payload: ...
可以看到一个交易包括:交易发送者的签名、数据载荷payload。
payload又包含两部分:
- header
- data: 包括一个由action组成的数组,下面看看action包含哪些东西
actions:
- header: ... //和signature_header一样
payload:
chaincode_proposal_payload: ... //请求智能合约的函数名、参数等
action:
endorsements: ... //背书者的id组成的数组
proposal_response_payload: ... //链码模拟执行结果对KV类型状态数据库的读写集