區塊鏈教程Fabric1.0源代碼分析Ledger(賬本)一兄弟連區塊鏈

  區塊鏈教程Fabric1.0源代碼分析Ledger(賬本)一,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。

Fabric 1.0源代碼筆記 之 Ledger(賬本)

1、Ledger概述

Ledger,即賬本數據庫。Fabric賬本中有四種數據庫,idStore(ledgerID數據庫)、blkstorage(block文件存儲)、statedb(狀態數據庫)、historydb(歷史數據庫)。
其中idStore、historydb使用leveldb實現,statedb可選擇使用leveldb或couchDB。而blkstorage中index部分使用leveldb實現,實際區塊鏈數據存儲使用文件實現。

  • idStore,默認目錄/var/hyperledger/production/ledgersData/ledgerProvider,更詳細內容,參考:Fabric 1.0源代碼筆記 之 Ledger #idStore(ledgerID數據庫)
  • blkstorage,默認目錄/var/hyperledger/production/ledgersData/chains,更詳細內容,參考:Fabric 1.0源代碼筆記 之 Ledger #blkstorage(block文件存儲)
  • statedb,默認目錄/var/hyperledger/production/ledgersData/stateLeveldb,更詳細內容,參考:Fabric 1.0源代碼筆記 之 Ledger #statedb(狀態數據庫)
  • historydb,默認目錄/var/hyperledger/production/ledgersData/historyLeveldb,更詳細內容,參考:Fabric 1.0源代碼筆記 之 Ledger #historydb(歷史數據庫)

2、Ledger代碼目錄結構

Ledger相關代碼分佈在common/ledger、core/ledger和protos/ledger目錄下。目錄結構如下:

  • common/ledger目錄
        * ledger_interface.go,定義了通用接口Ledger、ResultsIterator、以及QueryResult和PrunePolicy(暫時均爲空接口)。

    * blkstorage目錄,blkstorage相關接口及實現
    * util/leveldbhelper目錄,LevelDB數據庫操作的封裝。
    

  • core/ledger目錄
        * ledger_interface.go,定義了核心接口PeerLedgerProvider、PeerLedger、ValidatedLedger(暫時未定義)、QueryExecutor、HistoryQueryExecutor和TxSimulator。

    * kvledger目錄,目前PeerLedgerProvider、PeerLedger等接口僅有一種實現即:kvledger。
        * kv_ledger_provider.go,實現PeerLedgerProvider接口,即Provider結構體及其方法,以及idStore結構體及方法
        * kv_ledger.go,實現PeerLedger接口,即kvLedger結構體及方法。
        * txmgmt目錄,交易管理。
            * statedb目錄,statedb相關接口及實現
        * history/historydb目錄,historydb相關接口及實現
    * ledgermgmt/ledger_mgmt.go,Ledger管理相關函數實現。
    * ledgerconfig/ledger_config.go,Ledger配置相關函數實現。
    * util目錄,Ledger工具相關函數實現。
    

3、核心接口定義

PeerLedgerProvider接口定義:提供PeerLedger實例handle。

type PeerLedgerProvider interface {
    Create(genesisBlock *common.Block) (PeerLedger, error) //用給定的創世紀塊創建Ledger
    Open(ledgerID string) (PeerLedger, error) //打開已創建的Ledger
    Exists(ledgerID string) (bool, error) //按ledgerID查Ledger是否存在
    List() ([]string, error) //列出現有的ledgerID
    Close() //關閉 PeerLedgerProvider
}
//代碼在core/ledger/ledger_interface.go

PeerLedger接口定義:
PeerLedger和OrdererLedger的不同之處在於PeerLedger本地維護位掩碼,用於區分有效交易和無效交易。

type PeerLedger interface {
    commonledger.Ledger //嵌入common/ledger/Ledger接口
    GetTransactionByID(txID string) (*peer.ProcessedTransaction, error) //按txID獲取交易
    GetBlockByHash(blockHash []byte) (*common.Block, error) //按blockHash獲取Block
    GetBlockByTxID(txID string) (*common.Block, error) //按txID獲取包含交易的Block
    GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error) //獲取交易記錄驗證的原因代碼
    NewTxSimulator() (TxSimulator, error) //創建交易模擬器,客戶端可以創建多個"TxSimulator"並行執行
    NewQueryExecutor() (QueryExecutor, error) //創建查詢執行器,客戶端可以創建多個'QueryExecutor'並行執行
    NewHistoryQueryExecutor() (HistoryQueryExecutor, error) //創建歷史記錄查詢執行器,客戶端可以創建多個'HistoryQueryExecutor'並行執行
    Prune(policy commonledger.PrunePolicy) error //裁剪滿足給定策略的塊或交易
}
//代碼在core/ledger/ledger_interface.go
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章