# 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数据库)]( idstore.md)
* blkstorage,默认目录/var/hyperledger/production/ledgersData/chains,更详细内容,参考:[
Fabric 1.0源代码笔记 之 Ledger #blkstorage(block文件存储)]( blkstorage.md)
* statedb,默认目录/var/hyperledger/production/ledgersData/stateLeveldb,更详细内容,参考:[
Fabric 1.0源代码笔记 之 Ledger #statedb(状态数据库)]( statedb.md)
* historydb,默认目录/var/hyperledger/production/ledgersData/historyLeveldb,更详细内容,参考:[
Fabric 1.0源代码笔记 之 Ledger #historydb(历史数据库)]( historydb.md)
## 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。
```go
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本地维护位掩码,用于区分有效交易和无效交易。
```go
type
PeerLedger
interface {
commonledger.Ledger