Fabric 1.0原始碼分析(22)Ledger #blkstorage(block檔案儲存)
# 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(區塊檔案儲存)](../blockfile/README.md)。
## 1、核心介面定義
BlockStoreProvider介面定義:提供BlockStore控制程式碼。
```go
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介面定義:
```go
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定義如下:
```go
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結構體定義如下:
```go
type fsBlockStore struct {
id string //即ledgerid
conf *Conf //type Conf struct
fileMgr *blockfileMgr //區塊檔案儲存
}
//程式碼在common/ledger/blkstorage/fsblkstorage/fs_blockstore.go
```
涉及方法如下:
```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結構體定義如下:
```go
type FsBlockstoreProvider struct {
conf *Conf
indexConfig *blkstorage.IndexConfig
leveldbProvider *leveldbhelper.Provider //用於操作index
}
//程式碼在common/ledger/blkstorage/fsblkstorage/fs_blockstore_provider.go
```
涉及方法:
```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
```
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
網址:http://www.qukuailianxueyuan.io/
欲領取造幣技術與全套虛擬機器資料
區塊鏈技術交流QQ群:756146052 備註:CSDN
尹成學院微信:備註:CSDN
相關文章
- Fabric 1.0原始碼分析(26)Orderer #ledger(Orderer Ledger)原始碼
- Fabric 1.0原始碼分析(2) blockfile(區塊檔案儲存)原始碼BloC
- Fabric 1.0原始碼分析(18) Ledger(賬本)原始碼
- Fabric 1.0原始碼分析(20) Ledger #idStore(ledgerID資料庫)原始碼資料庫
- Fabric 1.0原始碼分析(19) Ledger #statedb(狀態資料庫)原始碼資料庫
- Fabric 1.0原始碼分析(21)Ledger #historydb(歷史資料庫)原始碼資料庫
- Fabric 1.0原始碼分析(28) Orderer #localconfig(Orderer配置檔案定義)原始碼
- Fabric 1.0原始碼分析(25) Orderer原始碼
- Fabric 1.0原始碼分析(31) Peer原始碼
- Fabric 1.0原始碼分析(3)Chaincode(鏈碼)原始碼AI
- Fabric 1.0原始碼分析(40) Proposal(提案)原始碼
- Fabric 1.0原始碼分析(14) flogging(Fabric日誌系統)原始碼
- Fabric 1.0原始碼分析(43) Tx(Transaction 交易)原始碼
- Fabric 1.0原始碼分析(47)Fabric 1.0.4 go程式碼量統計原始碼Go
- Fabric 1.0原始碼分析(42)scc(系統鏈碼)原始碼
- Fabric 1.0原始碼分析(13)events(事件服務)原始碼事件
- Fabric 1.0原始碼分析(39) policy(背書策略)原始碼
- Fabric 1.0原始碼分析(45)gRPC(Fabric中註冊的gRPC Service)原始碼RPC
- Fabric 1.0原始碼分析(10)consenter(共識外掛)原始碼
- Fabric 1.0原始碼分析(15)gossip(流言演算法)原始碼Go演算法
- Fabric 1.0原始碼分析(23)LevelDB(KV資料庫)原始碼資料庫
- Fabric 1.0原始碼分析(44)Tx #RWSet(讀寫集)原始碼
- Fabric 1.0原始碼分析(5)Chaincode(鏈碼)體系總結原始碼AI
- Fabric 1.0原始碼分析(6)configtx(配置交易) #ChannelConfig(通道配置)原始碼
- Fabric 1.0原始碼分析(29) Orderer #multichain(多鏈支援包)原始碼AI
- Fabric 1.0原始碼分析(30) Orderer #BroadcastServer(Broadcast服務端)原始碼ASTServer服務端
- Fabric 1.0原始碼分析(35)Peer #EndorserServer(Endorser服務端)原始碼Server服務端
- Fabric 1.0原始碼分析(36) Peer #EndorserClient(Endorser客戶端)原始碼client客戶端
- Fabric 1.0原始碼分析(37) Peer #DeliverClient(Deliver客戶端)原始碼client客戶端
- Fabric 1.0原始碼分析(38) Peer #BroadcastClient(Broadcast客戶端)原始碼ASTclient客戶端
- Fabric 1.0原始碼分析(41)putils(protos/utils工具包)原始碼
- Fabric 1.0原始碼分析(7)configtx(配置交易) #configtxgen(生成通道配置)原始碼
- Fabric 1.0原始碼分析(9)configtx(配置交易)體系介紹原始碼
- Fabric 1.0原始碼分析(27) Orderer #configupdate(處理通道配置更新)原始碼
- Fabric 1.0原始碼分析(32) Peer #peer node start命令實現原始碼
- Fabric 1.0原始碼分析(42)scc(系統鏈碼) #cscc(通道相關)原始碼
- Fabric 1.0原始碼分析(4)Chaincode(鏈碼)#platforms(鏈碼語言平臺)原始碼AIPlatform
- Laravel 儲存 (Storage) 原始碼分析Laravel原始碼