Hyperledger Fabric Ledger源码相关
节点级别的账本
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 struct
是ledger.PeerLedgerProvider
接口的实现。一个Peer可以参与多个channel,因此PeerLedgerProvider是在Peer层面的抽象,它可以对Peer参与的所有channel的账本进行操作。 Provider
的实现中包含4个域,说明如下
-
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
}
-
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
主要包含以下两部分。
-
Block存储的文件系统的配置属性(比如存在那个目录啊,文件超过多大就用下一个文件呀)和索引配置(比如从block hash/block number索引到对应的block啊, 从BlockNum:TranNum索引到对应的transaction啊等等)。
-
leveldbhelper.Provider
,此goleveldb的实例就是用来存储Block及transaction相关的索引信息的 -
vdbProvider
用于存储world state。它拥有一个goleveldb instance,用于存储Peer参与的所有channel的world state。 默认目录为/var/hyperledger/production/ledgersData/stateLeveldb。statedb.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
}
-
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
}