兄弟連區塊鏈教程Fabric1.0源代碼分析Ledger(賬本)一
阿新 • • 發佈:2018-10-31
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(暫時均為空接口)。
????
????* 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(賬本)一