美文网首页
Hyperledger Fabric Ledger源码相关

Hyperledger Fabric Ledger源码相关

作者: xixuejia | 来源:发表于2017-05-05 13:38 被阅读0次

    节点级别的账本

    Ledger Provider对应的是一个节点Peer所拥有的Ledger, 可能包含多个Channel。可以说是Peer level的ledger provider。它负责管理Peer所拥有的所有账本,包含此Peer所参与的所有channel的block账本, state账本, history账本以及存放ledgerId的账本

    type PeerLedgerProvider interface

    core/ledger/ledger_interface PeerLedgerProvider接口

    // PeerLedgerProvider provides handle to ledger instances
    type PeerLedgerProvider interface {
        // Create creates a new ledger with the given genesis block.
        // This function guarentees that the creation of ledger and committing the genesis block would an atomic action
        // The chain id retrieved from the genesis block is treated as a ledger id
        Create(genesisBlock *common.Block) (PeerLedger, error)
        // Open opens an already created ledger
        Open(ledgerID string) (PeerLedger, error)
        // Exists tells whether the ledger with given id exists
        Exists(ledgerID string) (bool, error)
        // List lists the ids of the existing ledgers
        List() ([]string, error)
        // Close closes the PeerLedgerProvider
        Close()
    }
    
    type Provider struct

    core/ledger/kvledger/kv_ledger_provider.go Ledger Provider实现

    // Provider implements interface ledger.PeerLedgerProvider
    type Provider struct {
        idStore            *idStore
        blockStoreProvider blkstorage.BlockStoreProvider
        vdbProvider        statedb.VersionedDBProvider
        historydbProvider  historydb.HistoryDBProvider
    }
    

    Provider structledger.PeerLedgerProvider接口的实现。一个Peer可以参与多个channel,因此PeerLedgerProvider是在Peer层面的抽象,它可以对Peer参与的所有channel的账本进行操作。 Provider的实现中包含4个域,说明如下

    1. idStore:使用goleveldb存储Peer加入的所有的ledger id(又叫chain id, channel id)及其对应的创世块。默认存储目录为/var/hyperledger/production/ledgersData/ledgerProvider
      type idStore struct
      core/ledger/kvledger/kv_ledger_provider.go
      仅仅是goleveldb instance的wrapper
    //////////////////////////////////////////////////////////////////////
    // Ledger id persistence related code
    ///////////////////////////////////////////////////////////////////////
    type idStore struct {
        db *leveldbhelper.DB
    }
    
    1. blockStoreProvider 用于管理Peer加入的所有channel的Block chain。目前使用文件系统file system来存储Block的数据,但是查询Block或者Block内的transaction的索引是存储在goleveldb中的。blkstorage.BlockStoreProvider的具体实现fsblkstorage.FsBlockStoreProvider,给定ledgerID可以提供fsblkstorage.fsBlockStore的实例。fsblkstorage.fsBlockStore的接口为blkstorage.BlockStore
      common/ledger/blkstorage/blockstorage.go
    // BlockStoreProvider provides an handle to a BlockStore
    type BlockStoreProvider interface {
        CreateBlockStore(ledgerid string) (BlockStore, error)
        OpenBlockStore(ledgerid string) (BlockStore, error)
        Exists(ledgerid string) (bool, error)
        List() ([]string, error)
        Close()
    }
    

    FsBlockStoreProvider主要包含以下两部分。

    1. Block存储的文件系统的配置属性(比如存在那个目录啊,文件超过多大就用下一个文件呀)和索引配置(比如从block hash/block number索引到对应的block啊, 从BlockNum:TranNum索引到对应的transaction啊等等)。

    2. leveldbhelper.Provider,此goleveldb的实例就是用来存储Block及transaction相关的索引信息的

    3. vdbProvider 用于存储world state。它拥有一个goleveldb instance,用于存储Peer参与的所有channel的world state。 默认目录为/var/hyperledger/production/ledgersData/stateLeveldbstatedb.VersionedDBProvider只是leveldbhelper.Provider的wrapper(用goleveldb存储state),或者couchdb.CouchInstance的wrapper(用couchdb存储state)。

    // VersionedDBProvider implements interface VersionedDBProvider
    type VersionedDBProvider struct {
        dbProvider *leveldbhelper.Provider
    }
    
    // VersionedDBProvider implements interface VersionedDBProvider
    type VersionedDBProvider struct {
        couchInstance *couchdb.CouchInstance
        databases     map[string]*VersionedDB
        mux           sync.Mutex
        openCounts    uint64
    }
    
    1. historydbProvider 用于存储history data。historydb.HistoryDBProvider接口的实现也只是leveldbhelper.Provider的一个wrapper。使用goleveldb来存储key value。key是compositeHistoryKey,由ns, writeKey, blockNo, tranNo构成,为了节省存储空间,value为空值[]byte{}
    // HistoryDBProvider implements interface HistoryDBProvider
    type HistoryDBProvider struct {
        dbProvider *leveldbhelper.Provider
    }
    

    通道级别的账本

    这是channel层次的账本。具体实现是kvLedger。结构体包含了它所代表的ledgerID,存储Block的账本, 存储state的账本, 以及存放history的账本。
    core/ledger/kvledger/kv_ledger.go

    // KVLedger provides an implementation of `ledger.PeerLedger`.
    // This implementation provides a key-value based data model
    type kvLedger struct{
      ledgerID  string
      blockStore blkstorage.BlockStore
      txtmgmt    txmgr.TxMgr
      historyDB  historydb.HistoryDB
    }
    

    相关文章

      网友评论

          本文标题:Hyperledger Fabric Ledger源码相关

          本文链接:https://www.haomeiwen.com/subject/axvrtxtx.html