Hyperledger Fabric Ledger源码相关

2017-05-05  本文已影响0人  xixuejia

节点级别的账本

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
}
上一篇下一篇

猜你喜欢

热点阅读