Ledger,即账本数据库。Fabric账本中有四种数据库,idStore(ledgerID数据库)、blkstorage(block文件存储)、statedb(状态数据库)、historydb(历史数据库)。
其中idStore、historydb使用leveldb实现,statedb可选择使用leveldb或couchDB。而blkstorage中index部分使用leveldb实现,实际区块链数据存储使用文件实现。
Ledger相关代码分布在common/ledger、core/ledger和protos/ledger目录下。目录结构如下:
PeerLedgerProvider接口定义:提供PeerLedger实例handle。
type PeerLedgerProvider interface {
????Create(genesisBlock *common.Block) (PeerLedger, error) //用给定的创世纪块创建Ledger
????Open(ledgerID string) (PeerLedger, error) //打开已创建的Ledger
????Exists(ledgerID string) (bool, error) //按ledgerID查Ledger是否存在
????List() ([]string, error) //列出现有的ledgerID
????Close() //关闭 PeerLedgerProvider
}
//代码在core/ledger/ledger_interface.go
PeerLedger接口定义:
PeerLedger和OrdererLedger的不同之处在于PeerLedger本地维护位掩码,用于区分有效交易和无效交易。
type PeerLedger interface {
????commonledger.Ledger //嵌入common/ledger/Ledger接口
????GetTransactionByID(txID string) (*peer.ProcessedTransaction, error) //按txID获取交易
????GetBlockByHash(blockHash []byte) (*common.Block, error) //按blockHash获取Block
????GetBlockByTxID(txID string) (*common.Block, error) //按txID获取包含交易的Block
????GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error) //获取交易记录验证的原因代码
????NewTxSimulator() (TxSimulator, error) //创建交易模拟器,客户端可以创建多个"TxSimulator"并行执行
????NewQueryExecutor() (QueryExecutor, error) //创建查询执行器,客户端可以创建多个‘QueryExecutor‘并行执行
????NewHistoryQueryExecutor() (HistoryQueryExecutor, error) //创建历史记录查询执行器,客户端可以创建多个‘HistoryQueryExecutor‘并行执行
????Prune(policy commonledger.PrunePolicy) error //裁剪满足给定策略的块或交易
}
//代码在core/ledger/ledger_interface.go
未完待续欢迎继续关注兄弟连区块链教程分享!
兄弟连区块链教程Fabric1.0源代码分析Ledger(账本)一
原文:http://blog.51cto.com/14041296/2311267