区块链教程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

感谢关注兄弟连区块链教程分享!

相关实践学习
基于EBS部署高性能的MySQL服务
如果您通常是通过ECS实例部署MySQL来使用数据库服务,您可以参考本实验操作来搭建高性能的MySQL服务。本实验为您演示如何通过EBS ESSD云盘部署一个高性能的MySQL服务。
相关文章
|
1月前
|
供应链 区块链 数据安全/隐私保护
探索区块链技术在金融领域的应用与前景分析
本文将深入探讨区块链技术在金融领域的具体应用场景,分析其优势与挑战,并展望未来发展趋势。通过案例分析和技术解析,揭示区块链技术在金融行业中的革新意义及前景。
|
7月前
|
区块链
区块链的发币流程技术分析
区块链现在是发展的如火如荼,很多人都想趁着这个风口,投入区块链创业的浪潮中。 那么我们该怎么做才能抓住这个机会呢? 进行区块链发币要求是很多的,主要有以下几个步骤。
|
7月前
|
安全 算法 区块链
区块链交易所开发技术说明:智能合约设计与实现步骤实现分析
智能合约是区块链技术的核心应用,其能够自动执行、验证和执行合同,并以可验证的方式进行操作。在区块链交易所中,智能合约扮演着重要的角色,它们保证了交易的透明性、效率和安全性。作为一名专业的交易所开发团队一员,在交易所开发这块拥有相对成熟的开发技术,目前已经有成熟的区块链交易所开发案例。本文将介绍如何设计和实现可靠的智能合约来支持区块链交易所。
|
7月前
|
区块链 安全 数据安全/隐私保护
区块链LP流动性SWAP博饼交易所系统开发分析模式
Web3在生态的每一个要素中,都体现出了去中心化的特点。
|
8月前
|
安全 Go 区块链
区块链游戏链游系统开发功能详情丨方案逻辑丨开发项目丨案例分析丨源码规则
 In recent years, with the continuous development of blockchain technology, NFTs (non homogeneous tokens) and DAPPs (decentralized applications) have emerged in the gaming industry.
|
9月前
|
存储 前端开发 JavaScript
区块链交易所系统开发(正式版)丨DEX/DEFI/SWAP去中心化智能合约系统开发详细案例/方案项目/技术分析/源码功能
  去中心化存储技术是一种新型存储技术,它改变了传统的集中式存储技术,将数据从单一位置移到多个位置,这样就消除了存储数据的中心机构或服务器的责任,增加了安全性和数据的有效存储,确保用户的数据安全性。
|
10月前
|
存储 算法 区块链
链游项目系统开发(方案设计)丨DAPP链游系统开发(案例分析)/成熟技术/区块链游戏开发/源码说明
  在区块链中,每个块包含了一定数量的交易信息和该块的唯一标识符,同时还包含了前一个块的哈希值。这样的设计保证了区块之间的顺序和完整性,一旦一个块被添加到区块链中,它就不可更改。This makes blockchain a secure and trustworthy distributed ledger that can be used to record and verify various types of transactions.
|
11月前
|
NoSQL 区块链 Redis
区块链聚合交易所平台开发源码实例分析
区块链聚合交易所平台开发源码实例分析
|
11月前
|
人工智能 自然语言处理 安全
区块链直销软件开发部署分析介绍
区块链直销软件开发是指为直销软件开发公司或个人开发的用于构建区块链直销平台的软件。这些软件通常包括直销商城、直销管理、直销分析等功能,并采用区块链技术确保数字货币交易的安全和透明。
|
11月前
|
存储 安全 算法
区块链游戏DAO模式开发步骤详情 |(源码demo实例分析)
区块链游戏的 DAO 模式开发是指利用 DAO 模式进行游戏开发和管理,其中 DAO 代表着“抵抗者”的意思。这种开发模式颠覆了传统游戏开发中的中心化管理方式,通过去除中介和减少不必要的成本来降低游戏开发的成本。

热门文章

最新文章