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

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

new byte interface tor 客戶 edge exec ldb stat

區塊鏈教程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

未完待續歡迎繼續關註兄弟連區塊鏈教程分享!

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