區塊鏈教程Fabric1.0源代碼分析Ledger blkstorage block文件存儲
阿新 • • 發佈:2018-11-01
filesize 叠代 rep site ransac 子目錄 fabric lan 操作 區塊鏈教程Fabric1.0源代碼分析Ledger blkstorage block文件存儲,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關註點放在了區塊鏈真正的技術之上。
Fabric 1.0源代碼筆記 之 Ledger #blkstorage(block文件存儲)
blkstorage概述
blkstorage,默認目錄/var/hyperledger/production/ledgersData/chains,含index和chains兩個子目錄。
其中index為索引目錄,采用leveldb實現。而chains為各ledger的區塊鏈文件,子目錄以ledgerid為名,使用文件系統實現。
blkstorage相關代碼在common/ledger/blkstorage目錄,目錄結構如下:
- blockstorage.go,定義核心接口BlockStoreProvider和BlockStore。
- fsblkstorage目錄,BlockStoreProvider和BlockStore接口實現,即:FsBlockstoreProvider和fsBlockStore。
- config.go,結構體Conf,blockStorage路徑和塊文件大小(默認最大64M)。
- fs_blockstore.go,BlockStore接口實現,即fsBlockStore,主要為封裝blockfileMgr。
- fs_blockstore_provider.go,BlockStoreProvider接口實現,即FsBlockstoreProvider。
blockfile更詳細內容,參考:Fabric 1.0源代碼筆記 之 blockfile(區塊文件存儲)。
1、核心接口定義
BlockStoreProvider接口定義:提供BlockStore句柄。
type BlockStoreProvider interface { CreateBlockStore(ledgerid string) (BlockStore, error) //創建並打開BlockStore OpenBlockStore(ledgerid string) (BlockStore, error) //創建並打開BlockStore Exists(ledgerid string) (bool, error) //ledgerid的Blockstore目錄是否存在 List() ([]string, error) //獲取已存在的ledgerid列表 Close() //關閉BlockStore } //代碼在common/ledger/blkstorage/blockstorage.go
BlockStore接口定義:
type BlockStore interface {
AddBlock(block *common.Block) error //添加塊
GetBlockchainInfo() (*common.BlockchainInfo, error) //獲取區塊鏈當前信息
RetrieveBlocks(startNum uint64) (ledger.ResultsIterator, error) //獲取區塊鏈叠代器,可以循環遍歷區塊
RetrieveBlockByHash(blockHash []byte) (*common.Block, error) //根據區塊哈希獲取塊
RetrieveBlockByNumber(blockNum uint64) (*common.Block, error) //根據區塊鏈高度獲取塊
RetrieveTxByID(txID string) (*common.Envelope, error) //根據交易ID獲取交易
RetrieveTxByBlockNumTranNum(blockNum uint64, tranNum uint64) (*common.Envelope, error) //根據區塊鏈高度和tranNum獲取交易
RetrieveBlockByTxID(txID string) (*common.Block, error) //根據交易ID獲取塊
RetrieveTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error) //根據交易ID獲取交易驗證代碼
Shutdown() //關閉BlockStore
}
//代碼在common/ledger/blkstorage/blockstorage.go
2、Conf
Conf定義如下:
type Conf struct {
blockStorageDir string //blockStorage路徑
maxBlockfileSize int //塊文件大小(默認最大64M)
}
func NewConf(blockStorageDir string, maxBlockfileSize int) *Conf //構造Conf
func (conf *Conf) getIndexDir() string //獲取index路徑,即/var/hyperledger/production/ledgersData/chains/index
func (conf *Conf) getChainsDir() string //獲取chains路徑,即/var/hyperledger/production/ledgersData/chains/chains
func (conf *Conf) getLedgerBlockDir(ledgerid string) string //獲取Ledger Block,如/var/hyperledger/production/ledgersData/chains/chains/mychannel
//代碼在common/ledger/blkstorage/fsblkstorage/config.go
3、BlockStore接口實現
BlockStore接口基於文件系統實現,即fsBlockStore結構體及方法,BlockStore結構體定義如下:
type fsBlockStore struct {
id string //即ledgerid
conf *Conf //type Conf struct
fileMgr *blockfileMgr //區塊文件存儲
}
//代碼在common/ledger/blkstorage/fsblkstorage/fs_blockstore.go
涉及方法如下:
//構造fsBlockStore
func newFsBlockStore(id string, conf *Conf, indexConfig *blkstorage.IndexConfig, dbHandle *leveldbhelper.DBHandle) *fsBlockStore
//添加塊,store.fileMgr.addBlock(block)
func (store *fsBlockStore) AddBlock(block *common.Block) error
//獲取區塊鏈當前信息,store.fileMgr.getBlockchainInfo()
func (store *fsBlockStore) GetBlockchainInfo() (*common.BlockchainInfo, error)
//獲取區塊鏈叠代器,可以循環遍歷區塊,store.fileMgr.retrieveBlocks(startNum)
func (store *fsBlockStore) RetrieveBlocks(startNum uint64) (ledger.ResultsIterator, error)
//根據區塊哈希獲取塊,store.fileMgr.retrieveBlockByHash(blockHash)
func (store *fsBlockStore) RetrieveBlockByHash(blockHash []byte) (*common.Block, error)
//根據區塊鏈高度獲取塊,store.fileMgr.retrieveBlockByNumber(blockNum)
func (store *fsBlockStore) RetrieveBlockByNumber(blockNum uint64) (*common.Block, error)
//根據交易ID獲取交易,store.fileMgr.retrieveTransactionByID(txID)
func (store *fsBlockStore) RetrieveTxByID(txID string) (*common.Envelope, error)
//根據區塊鏈高度和tranNum獲取交易,store.fileMgr.retrieveTransactionByBlockNumTranNum(blockNum, tranNum)
func (store *fsBlockStore) RetrieveTxByBlockNumTranNum(blockNum uint64, tranNum uint64) (*common.Envelope, error)
//根據交易ID獲取塊,store.fileMgr.retrieveBlockByTxID(txID)
func (store *fsBlockStore) RetrieveBlockByTxID(txID string) (*common.Block, error)
//根據交易ID獲取交易驗證代碼,store.fileMgr.retrieveTxValidationCodeByTxID(txID)
func (store *fsBlockStore) RetrieveTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error)
//關閉BlockStore,store.fileMgr.close()
func (store *fsBlockStore) Shutdown()
//代碼在common/ledger/blkstorage/fsblkstorage/fs_blockstore.go
4、BlockStoreProvider接口實現
BlockStoreProvider接口實現,即NewProvider結構體及方法。NewProvider結構體定義如下:
type FsBlockstoreProvider struct {
conf *Conf
indexConfig *blkstorage.IndexConfig
leveldbProvider *leveldbhelper.Provider //用於操作index
}
//代碼在common/ledger/blkstorage/fsblkstorage/fs_blockstore_provider.go
涉及方法:
//構造FsBlockstoreProvider
func NewProvider(conf *Conf, indexConfig *blkstorage.IndexConfig) blkstorage.BlockStoreProvider
//創建並打開BlockStore,同p.OpenBlockStore(ledgerid)
func (p *FsBlockstoreProvider) CreateBlockStore(ledgerid string) (blkstorage.BlockStore, error)
//創建並打開BlockStore,調取newFsBlockStore(ledgerid, p.conf, p.indexConfig, indexStoreHandle),即構造fsBlockStore
func (p *FsBlockstoreProvider) OpenBlockStore(ledgerid string) (blkstorage.BlockStore, error)
//ledgerid的Blockstore目錄是否存在,如/var/hyperledger/production/ledgersData/chains/chains/mychannel
func (p *FsBlockstoreProvider) Exists(ledgerid string) (bool, error)
//獲取已存在的ledgerid列表,util.ListSubdirs(p.conf.getChainsDir())
func (p *FsBlockstoreProvider) List() ([]string, error)
//關閉BlockStore,目前僅限關閉p.leveldbProvider.Close()
func (p *FsBlockstoreProvider) Close()
//代碼在common/ledger/blkstorage/fsblkstorage/fs_blockstore_provider.go
感謝關註兄弟連區塊鏈教程分享!
區塊鏈教程Fabric1.0源代碼分析Ledger blkstorage block文件存儲