楔子
在做區(qū)塊瀏覽器獲取數(shù)據(jù)等業(yè)務(wù)場景時,需要拿到區(qū)塊中的一些部分?jǐn)?shù)據(jù)信息,因此我們需要解析區(qū)塊。筆者在做跨鏈業(yè)務(wù)交易有效性驗(yàn)證場景時需要拿到相關(guān)證書、mspid等信息,由于剛?cè)雲(yún)^(qū)塊鏈行業(yè)又是fabric萌新,本人也在網(wǎng)上找了一些相關(guān)教程文章,但大多數(shù)都是區(qū)塊數(shù)據(jù)解析的不夠徹底,本文在先人的基礎(chǔ)場繼續(xù)深挖,補(bǔ)充了“交易區(qū)塊”未被解析的部分。
Fabric數(shù)據(jù)結(jié)構(gòu)關(guān)系非常復(fù)雜,對于新手來說門檻較高,為了降低難度以及重復(fù)勞作,因此誕生了此文章。
區(qū)塊類型
fabric中區(qū)塊類型分為
- 普通區(qū)塊(也就是正常交易產(chǎn)生的區(qū)塊)
- 配置區(qū)塊(比如修改共識規(guī)則,則會產(chǎn)生一個配置區(qū)塊)
那如何解析?
Fabric得區(qū)塊數(shù)據(jù)結(jié)構(gòu)是采用protobuf進(jìn)行編解碼,因此不像結(jié)構(gòu)化數(shù)據(jù)json那樣具有可讀性,解析方式主要采用?github.com/hyperledger/fabric/protoutil 包中的UnmarshalXxx() 方法進(jìn)行解析。
例如:
-?protoutil.UnmarshalEnvelope()
-?protoutil.UnmarshalPayload()
-?protoutil.UnmarshalSignatureHeader()
- 其他
示例代碼,以及解析區(qū)塊代碼可參考:https://github.com/chaunsin/block
交易區(qū)塊結(jié)構(gòu)
直接上圖

大多數(shù)情況不需要關(guān)注TxReadWriteSet(讀寫集)節(jié)點(diǎn)以下得內(nèi)容,此處是為了查看數(shù)據(jù)完整樣貌。數(shù)據(jù)集詳情請看下文。
對應(yīng)的metadata為

讀寫集分兩種
- 普通讀寫集
- 私有讀寫集
讀寫集得概念,類似于mysql中得mvcc理論概念,這里不在多余贅述。
下面分別展示兩種讀寫集的數(shù)據(jù)結(jié)構(gòu)
普通讀寫集

此讀寫集和圖一內(nèi)容一致。
私有數(shù)據(jù)讀寫集

以上基本上涵蓋了區(qū)塊數(shù)據(jù)結(jié)構(gòu)的情況,有些不明確存疑的都在圖中進(jìn)行了說明,通過圖能直觀的展示出區(qū)塊結(jié)構(gòu)情況,在實(shí)際使用代碼解析時,可根據(jù)圖進(jìn)行一步一步參考解析。
配置區(qū)塊結(jié)構(gòu)
目前暫時業(yè)務(wù)場景還沒有涉及到解析配置區(qū)塊場景,因此本人暫時沒有深入分析,不過以下提供了解析配置區(qū)塊的相關(guān)參考方式。
獲取配置區(qū)塊的最后區(qū)塊位置
protoutil.GetLastConfigIndexFromBlock(block)
判斷當(dāng)前區(qū)塊是否是配置區(qū)塊
protoutil.IsConfigBlock(block)
已有工具
configtxlator
configtxlator是一個命令行工具,參考本人的issue?https://github.com/hyperledger/fabric/issues/3261#issuecomment-1103036080
另外官方還有一個項(xiàng)目是構(gòu)建配置區(qū)塊的一個項(xiàng)目,目的就是為了方便更改區(qū)塊配置,可以參考 https://github.com/hyperledger/fabric-config
問題
1.目前拿不到區(qū)塊創(chuàng)建或產(chǎn)生時間
比如區(qū)塊產(chǎn)生時間等等。目前我是以區(qū)塊中最后一個交易的產(chǎn)生時間來作為區(qū)塊產(chǎn)生時間的,這在嚴(yán)格意義上來說是不對,因?yàn)楫a(chǎn)生最后一個交易后需要經(jīng)過Orderer節(jié)點(diǎn)的排序、打包、共識等操作才能產(chǎn)生區(qū)塊,會有時間差等問題。
總結(jié)
本文對普通交易區(qū)塊結(jié)構(gòu)進(jìn)行了詳細(xì)的說明,有些存疑不明確的地方進(jìn)行了標(biāo)注說明,但目前沒有提供配置區(qū)塊得解析,后續(xù)有機(jī)會填坑。另外在參考使用時要留意,如有問題、錯誤請指出,不勝感激。
最后也建議讀一下本文列出的參考文章,收錄了一些非常有價(jià)值的文章。
參考
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