区块链教程 Fabric1.0 源代码分析 Ledger(账本) 一, 2018 年下半年, 区块链行业正逐渐褪去发展之初的浮躁, 回归理性, 表面上看相关人才需求与身价似乎正在回落. 但事实上, 正是初期泡沫的渐退, 让人们更多的关注点放在了区块链真正的技术之上.
Fabric 1.0 源代码笔记 之 Ledger(账本)
1,Ledger 概述
Ledger, 即账本数据库. Fabric 账本中有四种数据库, idStore(ledgerID 数据库),blkstorage(block 文件存储),statedb(状态数据库),historydb(历史数据库).
其中 idStore,historydb 使用 leveldb 实现, statedb 可选择使用 leveldb 或 couchDB. 而 blkstorage 中 index 部分使用 leveldb 实现, 实际区块链数据存储使用文件实现.
idStore, 默认目录 / var/hyperledger/production/ledgersData/ledgerProvider, 更详细内容, 参考: Fabric 1.0 源代码笔记 之 Ledger #idStore(ledgerID 数据库)
blkstorage, 默认目录 / var/hyperledger/production/ledgersData/chains, 更详细内容, 参考: Fabric 1.0 源代码笔记 之 Ledger #blkstorage(block 文件存储)
statedb, 默认目录 / var/hyperledger/production/ledgersData/stateLeveldb, 更详细内容, 参考: Fabric 1.0 源代码笔记 之 Ledger #statedb(状态数据库)
historydb, 默认目录 / var/hyperledger/production/ledgersData/historyLeveldb, 更详细内容, 参考: Fabric 1.0 源代码笔记 之 Ledger #historydb(历史数据库)
2,Ledger 代码目录结构
Ledger 相关代码分布在 common/ledger,core/ledger 和 protos/ledger 目录下. 目录结构如下:
common/ledger 目录
???? ledger_interface.go, 定义了通用接口 Ledger,ResultsIterator, 以及 QueryResult 和 PrunePolicy(暂时均为空接口).
???? blkstorage 目录, blkstorage 相关接口及实现.
????* util/leveldbhelper 目录, LevelDB 数据库操作的封装.
????
core/ledger 目录
???? ledger_interface.go, 定义了核心接口 PeerLedgerProvider,PeerLedger,ValidatedLedger(暂时未定义),QueryExecutor,HistoryQueryExecutor 和 TxSimulator.
???? kvledger 目录, 目前 PeerLedgerProvider,PeerLedger 等接口仅有一种实现即: kvledger.
???????? kv_ledger_provider.go, 实现 PeerLedgerProvider 接口, 即 Provider 结构体及其方法, 以及 idStore 结构体及方法.
???????? kv_ledger.go, 实现 PeerLedger 接口, 即 kvLedger 结构体及方法.
???????? txmgmt 目录, 交易管理.
???????????? statedb 目录, statedb 相关接口及实现.
???????? history/historydb 目录, historydb 相关接口及实现.
???? ledgermgmt/ledger_mgmt.go,Ledger 管理相关函数实现.
???? ledgerconfig/ledger_config.go,Ledger 配置相关函数实现.
???? util 目录, Ledger 工具相关函数实现.
????
3, 核心接口定义
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
未完待续欢迎继续关注兄弟连区块链教程分享!
来源: http://www.bubuko.com/infodetail-2828976.html