# 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源代码分析(22)Ledger #blkstorage(block文件存储)相关推荐

  1. Fabric 1.0源代码分析(2) blockfile(区块文件存储)

    # Fabric 1.0源代码笔记 之 blockfile(区块文件存储) ## 1.blockfile概述 blockfile,即Fabric区块链区块文件存储,默认目录/var/hyperledg ...

  2. Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

    # Fabric 1.0源代码笔记 之 Ledger #idStore(ledgerID数据库) ## 1.idStore概述 * Fabric支持创建多个Ledger,不同Ledger以ledger ...

  3. Fabric 1.0源代码分析(26)Orderer #ledger(Orderer Ledger)

    # Fabric 1.0源代码笔记 之 Orderer #ledger(Orderer Ledger) ## 1.Orderer Ledger概述 Orderer Ledger代码分布在orderer ...

  4. Fabric 1.0源代码分析(32) Peer #peer node start命令实现

    # Fabric 1.0源代码笔记 之 Peer #peer node start命令实现 ## 1.peer node加载子命令start和status peer node加载子命令start和st ...

  5. Fabric 1.0源代码分析(25) Orderer

    # Fabric 1.0源代码笔记 之 Orderer ## 1.Orderer概述 Orderer,为排序节点,对所有发往网络中的交易进行排序,将排序后的交易安排配置中的约定整理为块,之后提交给Co ...

  6. Fabric 1.0源代码分析(43) Tx(Transaction 交易)

    # Fabric 1.0源代码笔记 之 Tx(Transaction 交易) ## 1.Tx概述 Tx,即Transaction,交易或事务. Tx代码分布目录结构如下: * protos/commo ...

  7. Fabric 1.0源代码分析(23)LevelDB(KV数据库)

    # Fabric 1.0源代码笔记 之 LevelDB(KV数据库) ## 1.LevelDB概述 LevelDB是Google开源的持久化KV单机数据库,具有很高的随机写,顺序读/写性能,但是随机读 ...

  8. Fabric 1.0源代码分析(31) Peer

    # Fabric 1.0源代码笔记 之 Peer ## 1.Peer概述 在Fabric中,Peer(节点)是指在网络中负责接收交易请求.维护一致账本的各个fabric-peer实例.节点之间彼此通过 ...

  9. Fabric 1.0源代码分析(42)scc(系统链码) #cscc(通道相关)

    # Fabric 1.0源代码笔记 之 scc(系统链码) #cscc(通道相关) ## 1.cscc概述 cscc代码在core/scc/cscc/configure.go. ## 2.PeerCo ...

最新文章

  1. 浅谈敏捷开发及Scrum工具leangoo(三)
  2. sklearn自学指南(part55)--决策树
  3. 二阶传递函数的推导及几种求解方法的比较
  4. 键盘忍者:使用单个热键弹出Vista日历
  5. top、postop、scrolltop、scrollHeight、offsetHeight
  6. mysql replicatedodb_MySQL存储引擎MyISAM与InnoDB的区别
  7. MyBatis 的 4 个妙用,别再踩坑了!
  8. 笔试遇到的rgba转16进制,但透明度不需要加到里面
  9. linux桌面小程序开发(pyqt+新增csv增删改查功能)附加章节
  10. win10怎么解除bitlocker加密?
  11. 关于UML中的Stereotype
  12. 大气辐射学期中知识点总结
  13. Android studio 图片按钮
  14. Mysql delete删除表数据之后,表空间没有释放的问题
  15. 【备忘】真.护眼色 数值
  16. 整数运算(加减法)详解
  17. android crt证书,android https 抓包,root安装证书
  18. 密集恐惧症候群测试图
  19. STC硬件主板--电子乐谱展示的设计
  20. go-ethereum相关

热门文章

  1. iptables屏蔽ip某个端口访问
  2. 根据url动态生成二维码
  3. czl蒻蒟的OI之路5
  4. 微信多媒体文件speex格式转为mp3文件格式
  5. 以太网接口 数据采集 matlab,基于以太网接口并行多通道采集器的设计
  6. 路由器交换机存储部件浅析
  7. 《TCP/IP详解》中文版下载地址
  8. 笔记12 SQL优化
  9. 二建考生速看 拿到二级建造师证书后该如何进行注册?
  10. 白兵机器人怎样连接_“玩具之家”的新宠——星战白兵冲锋队员机器人体验