区块链教程Fabric1.0源代码分析Ledger blkstorage block文件存储-兄弟连区块链
区块链教程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
感谢关注兄弟连区块链教程分享!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
从数据中推断用户行为--模型实现
接着上一篇讲吧:https://yq.aliyun.com/articles/656644?spm=a2c4e.11155435.0.0.5b663312UP3TMa 1.用户短信模型 C(t) ~ Poisson(lambda_1) t < tau # 用户在第t天前每天收到的短信数量C服从参数为lambda_1的泊松分布。 ~ Poisson(lambda_2) t >= tau # 用户在第t天前每天收到的短信数量C服从参数为lambda_2的泊松分布。 其中 lambda_1~Exp(1/alpha) lambda_2~Exp(1/alpha), # lambda_1,lambda_2都服从参数为alpha 的指数分布。 alpha = E(data). # alpha是真实样本数据的平均值,也称为样本的数学期望。 那么我们希望从lambda的先验概率中产生大量的lambda,然后不断的 2.lambda的先验 lambda服...
- 下一篇
区块链教程Fabric1.0源代码分析Ledger historydb历史数据库
1、historydb概述 historydb,用于存储所有块读写集中写集的内容。代码分布在core/ledger/kvledger/history/historydb目录下,目录结构如下: historydb.go,定义核心接口HistoryDBProvider和HistoryDB。 histmgr_helper.go,historydb工具函数。 historyleveldb目录,historydb基于leveldb的实现。* historyleveldb.go,HistoryDBProvider和HistoryDB接口实现,即historyleveldb.HistoryDBProvider和historyleveldb.historyDB结构体及方法。 * historyleveldb_query_executer.go,定义LevelHistoryDBQueryExecutor和historyScanner结构体及方法。 2、核心接口定义 HistoryDBProvider接口定义: type HistoryDBProvider interface { GetDBHandle(...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19