楔子
在做区块浏览器获取数据等业务场景时,需要拿到区块中的一些部分数据信息,因此我们需要解析区块。笔者在做跨链业务交易有效性验证场景时需要拿到相关证书、mspid等信息,由于刚入区块链行业又是fabric萌新,本人也在网上找了一些相关教程文章,但大多数都是区块数据解析的不够彻底,本文在先人的基础场继续深挖,补充了“交易区块”未被解析的部分。
Fabric数据结构关系非常复杂,对于新手来说门槛较高,为了降低难度以及重复劳作,因此诞生了此文章。
区块类型
fabric中区块类型分为
- 普通区块(也就是正常交易产生的区块)
- 配置区块(比如修改共识规则,则会产生一个配置区块)
那如何解析?
Fabric得区块数据结构是采用protobuf进行编解码,因此不像结构化数据json那样具有可读性,解析方式主要采用 github.com/hyperledger/fabric/protoutil 包中的UnmarshalXxx() 方法进行解析。
例如:
- protoutil.UnmarshalEnvelope()
- protoutil.UnmarshalPayload()
- protoutil.UnmarshalSignatureHeader()
- 其他
示例代码,以及解析区块代码可参考:https://github.com/chaunsin/block
交易区块结构
直接上图
大多数情况不需要关注TxReadWriteSet(读写集)节点以下得内容,此处是为了查看数据完整样貌。数据集详情请看下文。
对应的metadata为
读写集分两种
- 普通读写集
- 私有读写集
读写集得概念,类似于mysql中得mvcc理论概念,这里不在多余赘述。
下面分别展示两种读写集的数据结构
普通读写集
此读写集和图一内容一致。
私有数据读写集
以上基本上涵盖了区块数据结构的情况,有些不明确存疑的都在图中进行了说明,通过图能直观的展示出区块结构情况,在实际使用代码解析时,可根据图进行一步一步参考解析。
配置区块结构
目前暂时业务场景还没有涉及到解析配置区块场景,因此本人暂时没有深入分析,不过以下提供了解析配置区块的相关参考方式。
获取配置区块的最后区块位置
protoutil.GetLastConfigIndexFromBlock(block)
判断当前区块是否是配置区块
protoutil.IsConfigBlock(block)
已有工具
configtxlator
configtxlator是一个命令行工具,参考本人的issue https://github.com/hyperledger/fabric/issues/3261#issuecomment-1103036080
另外官方还有一个项目是构建配置区块的一个项目,目的就是为了方便更改区块配置,可以参考 https://github.com/hyperledger/fabric-config
问题
1.目前拿不到区块创建或产生时间
比如区块产生时间等等。目前我是以区块中最后一个交易的产生时间来作为区块产生时间的,这在严格意义上来说是不对,因为产生最后一个交易后需要经过Orderer节点的排序、打包、共识等操作才能产生区块,会有时间差等问题。
总结
本文对普通交易区块结构进行了详细的说明,有些存疑不明确的地方进行了标注说明,但目前没有提供配置区块得解析,后续有机会填坑。另外在参考使用时要留意,如有问题、错误请指出,不胜感激。
最后也建议读一下本文列出的参考文章,收录了一些非常有价值的文章。
参考
https://haojunsheng.github.io/2020/01/fabric-data-strcture/
https://www.zhihu.com/question/268822264
https://www.cnblogs.com/yimeixiaobai1314/p/14359395.html
https://blog.csdn.net/alextan_/article/details/110826476