fabric-區(qū)塊結(jié)構(gòu)

楔子

在做區(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)

直接上圖

交易區(qū)塊

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

對應(yīng)的metadata為

metadata

讀寫集分兩種

- 普通讀寫集
- 私有讀寫集

讀寫集得概念,類似于mysql中得mvcc理論概念,這里不在多余贅述。

下面分別展示兩種讀寫集的數(shù)據(jù)結(jié)構(gòu)

普通讀寫集

讀寫集

此讀寫集和圖一內(nèi)容一致。

私有數(shù)據(jù)讀寫集

私有數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容