fabric-区块结构

楔子

在做区块浏览器获取数据等业务场景时,需要拿到区块中的一些部分数据信息,因此我们需要解析区块。笔者在做跨链业务交易有效性验证场景时需要拿到相关证书、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为

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容