一、区块整体结构 1. 结构图
2. json格式
{
header: {
number: '37',
previous_hash:'b57d891702819c0e62dd7d405743b0663d19e49365d43c6420f281b43492e78d',
data_hash:'c730c7f832a24f9906e5224205182a66f25ef92b766c02aba60e23293883361f'
},
data: {
data: [{
signature:,
payload: {
header: {
channel_header: {
type: 3,
version: 1,
timestamp: '2019-12-27T02: 30: 35.321Z',
channel_id: 'mychannel',
tx_id:'cbd9e30878c5a9c6887d67596e6cd0a2cb30c253ef32e7dceb4440b4d0ec3b9d',
epoch: '0',
extension: ,
typeString: 'ENDORSER_TRANSACTION'
},
signature_header: {
creator: {
Mspid: 'Org1MSP',
IdBytes:'-----BEGIN CERTIFICATE-----\nMIICKTCCAdCgAwIBAgIQWv/vCt79Gp31mVsZBLDTBzAKBggqhkjOPQQDAjBzMQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\nb3JnMS5leGFtcGxlLmNvbTAeFw0xOTEyMjcwMTE4MDBaFw0yOTEyMjQwMTE4MDBa\nMGwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\nYW4gRnJhbmNpc2NvMQ8wDQYDVQQLEwZjbGllbnQxHzAdBgNVBAMMFkFkbWluQG9y\nZzEuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATFYP5wn0Nr\n9NXpCXbqDiNa53r9RXcO0qcIgZhj9apQIn1ZOqdj4E7UQ/Yv9J8nOJMfFCwfU6VU\nNJ0B5DI7R/jro00wSzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNV\nHSMEJDAigCAfNb1MjsB1bCjo4uzb2roawarG0SSzApS1Qp8u50YO5DAKBggqhkjO\nPQQDAgNHADBEAiBofjUeoqz1oTNc5yeE7R7/5incME4/aQJX8U7Ym8oHMgIgdor2\n40bkUNJmhFdeB2kXoLHGrD9F+bRzN+6zoerkApg=\n-----END CERTIFICATE-----\n'
},
nonce:
}
},
data: {
actions: [{
header: {
creator: {
Mspid: 'Org1MSP',
IdBytes:'-----BEGIN CERTIFICATE-----\nMIICKTCCAdCgAwIBAgIQWv/vCt79Gp31mVsZBLDTBzAKBggqhkjOPQQDAjBzMQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEZMBcGA1UEChMQb3JnMS5leGFtcGxlLmNvbTEcMBoGA1UEAxMTY2Eu\nb3JnMS5leGFtcGxlLmNvbTAeFw0xOTEyMjcwMTE4MDBaFw0yOTEyMjQwMTE4MDBa\nMGwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1T\nYW4gRnJhbmNpc2NvMQ8wDQYDVQQLEwZjbGllbnQxHzAdBgNVBAMMFkFkbWluQG9y\nZzEuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATFYP5wn0Nr\n9NXpCXbqDiNa53r9RXcO0qcIgZhj9apQIn1ZOqdj4E7UQ/Yv9J8nOJMfFCwfU6VU\nNJ0B5DI7R/jro00wSzAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADArBgNV\nHSMEJDAigCAfNb1MjsB1bCjo4uzb2roawarG0SSzApS1Qp8u50YO5DAKBggqhkjO\nPQQDAgNHADBEAiBofjUeoqz1oTNc5yeE7R7/5incME4/aQJX8U7Ym8oHMgIgdor2\n40bkUNJmhFdeB2kXoLHGrD9F+bRzN+6zoerkApg=\n-----END CERTIFICATE-----\n'
},
nonce:
},
payload: {
chaincode_proposal_payload: {
input: {
chaincode_spec: {
type: 1,
typeString: 'GOLANG',
input: {
args: [
,
],
decorations: {}
},
chaincode_id: {
path: '',
name: 'mycc',
version: ''
},
timeout: 0
}
}
},
action: {
proposal_response_payload: {
proposal_hash:'50180bdb986b6b4488a54528e9f002221109ea1f6bb87847783cf4bdabeb2037',
extension: {
results:{
data_model: 0,
ns_rwset: [{
namespace: 'lscc',
rwset: {
reads: [{
key: 'mycc',
version: {
block_num: '1',
tx_num: '0'
}
}],
range_queries_info: [],
writes: [],
metadata_writes: []
},
collection_hashed_rwset: []
},
{
namespace: 'mycc',
rwset: {
reads: [],
range_queries_info: [],
writes: [{
key: '8543b514-1fa8-49f6-a610-cd44d4d5a318',
is_delete: false,
value:'{
"bizType": "HY",
"bizUUID": "6399e25f-2ad1-4f7c-80cc-6ba720f312b9",
"count": 5,
"fillPerson": "许褚",
"requestID": "89c06e39-403b-430d-9bac-caab738c1aeb",
"requestTime": "2019-12-27 10:30:24",
"reviewOpinion": "从许攸,袭乌巢",
"reviewPass": "通过",
"reviewer": "曹操",
"submissionTim": "提交审核时间",
"toGzwTime": "上报时间",
"blockTimeTamp": "2019-12-27 10:30:35:320",
"tx_id": "cbd9e30878c5a9c6887d67596e6cd0a2cb30c253ef32e7dceb4440b4d0ec3b9d"
}'
}],
metadata_writes: []
},
collection_hashed_rwset: []
}]
},
events: {
chaincode_id: '',
tx_id: '',
event_name: '',
payload:
},
response: {
status: 200,
message: 'insert finished successfully',
payload:'8543b514-1fa8-49f6-a610-cd44d4d5a318: {
"bizType": "HY",
"bizUUID": "6399e25f-2ad1-4f7c-80cc-6ba720f312b9",
"count": 5,
"fillPerson": "许褚",
"requestID": "89c06e39-403b-430d-9bac-caab738c1aeb",
"requestTime": "2019-12-27 10:30:24",
"reviewOpinion": "从许攸,袭乌巢",
"reviewPass": "通过",
"reviewer": "曹操",
"submissionTim": "提交审核时间",
"toGzwTime": "上报时间",
"blockTimeTamp": "2019-12-27 10:30:35:320",
"tx_id": "cbd9e30878c5a9c6887d67596e6cd0a2cb30c253ef32e7dceb4440b4d0ec3b9d"
}'
},
chaincode_id: {
path: '',
name: 'mycc',
version: '1.0'
}
}
},
endorsements: [{
endorser: {
Mspid: 'Org1MSP',
IdBytes:'-----BEGIN CERTIFICATE-----\nMIICKTCCAc+gAwIBAgIRALSEbL20/qyKuufJLYD1EH0wCgYIKoZIzj0EAwIwczEL\nMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBG\ncmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMTE2Nh\nLm9yZzEuZXhhbXBsZS5jb20wHhcNMTkxMjI3MDExODAwWhcNMjkxMjI0MDExODAw\nWjBqMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN\nU2FuIEZyYW5jaXNjbzENMAsGA1UECxMEcGVlcjEfMB0GA1UEAxMWcGVlcjAub3Jn\nMS5leGFtcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABArT+vAEGJ/5\nOS0ntKWOJS9krod8flniyops3SqN3vFhGfRzmDq5dxARMnCTjT16g9I4Jo4QyFAo\nUAfXu1Zv93qjTTBLMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMCsGA1Ud\nIwQkMCKAIB81vUyOwHVsKOji7NvauhrBqsbRJLMClLVCny7nRg7kMAoGCCqGSM49\nBAMCA0gAMEUCIQDWlXWhXOkwlANMLmkAB8REFYyqmKQz9UKe3z3VmjOQ+AIgWPq/\nDZgErjIfq7KT5XWVCfvsxbJRWjD3o3aw0TE291A=\n-----END CERTIFICATE-----\n'
},
signature:
}]
}
}
}]
}
}
}]
},
metadata: {
metadata: [
{
value: '\n\u0000',
signatures: [{
signature_header: {
creator: {
Mspid: 'OrdererMSP',
IdBytes:'-----BEGIN CERTIFICATE-----\nMIICCzCCAbKgAwIBAgIQU4Xlp67Edi3tdBugbUNo9TAKBggqhkjOPQQDAjBpMQsw\nCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZy\nYW5jaXNjbzEUMBIGA1UEChMLZXhhbXBsZS5jb20xFzAVBgNVBAMTDmNhLmV4YW1w\nbGUuY29tMB4XDTE5MTIyNzAxMTgwMFoXDTI5MTIyNDAxMTgwMFowWDELMAkGA1UE\nBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lz\nY28xHDAaBgNVBAMTE29yZGVyZXIuZXhhbXBsZS5jb20wWTATBgcqhkjOPQIBBggq\nhkjOPQMBBwNCAATdnI0rfvsU27XRhbPEp81yTiBpjiP4kLTHtAuXPc58RHHM2zYX\n4oBC+UeOsreh2pibd/J1qJ0gnSlxL8ZmtdKTo00wSzAOBgNVHQ8BAf8EBAMCB4Aw\nDAYDVR0TAQH/BAIwADArBgNVHSMEJDAigCBcNzwBMeyKcdPqnBdYhDyqMKUAYA6W\nUcitApPVWMMjEzAKBggqhkjOPQQDAgNHADBEAiBQegfrUuFYAHqDla+DJlSMHqiW\nQoI8q1Dv8t39c72tOQIgDpg9AbEPgz7s+8HUW+ahlZcYnRsRg1HM3WtElcMRlVM=\n-----END CERTIFICATE-----\n'
},
nonce:
},
signature:
}]
},
{
value: {
index: '0'
},
signatures: []
},
[0]
]
}
}
二、如何查看区块 1. 查看区块链信息
docker exec [container] peer channel getinfo -c [channel]
#返回如下信息
Blockchain info: {"height":3,"currentBlockHash":"MvXGp1W3jK7vnn5V0dGZAgg7iIadjLCl1ArCh5XHXHs=","previousBlockHash":"BxXo7hCkE6Gb4Y/KDi0M85dw/8d7S4BU1hvcVz0DQJw="}
#区块链高度为3,区块链的编号为0, 1, 2,其中0是创世区块
2. 获取区块文件
#获取区块链文件
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 ./
3. 解析区块文件
使用fabric-samples中的二进制工具configtxgen解析区块文件,可以将configtxgen所在文件夹添加到PATH中。再查看环境变量中是否有FABRIC_CFG_PATH,没有的话要设置成configtx.yaml所在文件夹,否则configtxgen会找不到配置文件。
#将区块文件解析成json文件
configtxgen -inspectBlock [.block file] > [.json file]
三、解析 1. 区块结构
为了增强可读性,可以用在线工具将json转成yaml
---
header:
data_hash: ...
number: ...
previous_hash: ...
data:
data:
- payload: ...
signature: ...
metadata:
metadata: ...
可以看到一个区块包括三部分:
- 区块头:包含当前区块哈希、区块序号、前一区块的哈希;
- 区块数据:交易组成的数组
- 元数据:和当前区块相关的元数据
2. 交易结构
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类型状态数据库的读写集
Hyperledger Fabric区块和交易结构解析
https://blog.csdn.net/qq_33657251/article/details/104452568
https://www.cnblogs.com/adderhuang/archive/2004/01/13/12108426.html