# Fabric 1.0源代码笔记 之 Ledger #idStore(ledgerID数据库)

## 1、idStore概述

* Fabric支持创建多个Ledger,不同Ledger以ledgerID区分。
* 多个ledgerID及其创世区块存储在idStore数据库中,idStore数据库基于leveldb实现。
* idStore默认使用路径:/var/hyperledger/production/ledgersData/ledgerProvider/。
* idStore库中特殊key "underConstructionLedgerKey",用于标志最新在建的ledgerID,ledgerID创建成功后或失败时该标志将清除,另外此标志也用于异常时按ledgerID恢复数据。
* idStore相关代码集中在core/ledger/kvledger/kv_ledger_provider.go。

## 2、idStore结构体定义

leveldbhelper更详细内容,参考:[Fabric 1.0源代码笔记 之 LevelDB(KV数据库)](../leveldb/README.md)

```go
type idStore struct {
    db *leveldbhelper.DB
}
//代码在core/ledger/kvledger/kv_ledger_provider.go
```

## 3、idStore方法定义

```go
func openIDStore(path string) *idStore //按path创建并打开leveldb数据库
func (s *idStore) setUnderConstructionFlag(ledgerID string) error //设置ledgerID在建标志,将key为"underConstructionLedgerKey",value为ledgerID写入库
func (s *idStore) unsetUnderConstructionFlag() error //取消ledgerID在建标志(确认构建失败时),删除key"underConstructionLedgerKey"
func (s *idStore) getUnderConstructionFlag() (string, error) //获取ledgerID在建标志(按ledgerID恢复时),按key"underConstructionLedgerKey",取ledgerID
func (s *idStore) createLedgerID(ledgerID string, gb *common.Block) error //创建LedgerID,即以ledgerID为key,将创世区块写入库
func (s *idStore) ledgerIDExists(ledgerID string) (bool, error) //查找ledgerID是否存在,即查库中key为ledgerID是否存在
func (s *idStore) getAllLedgerIds() ([]string, error) //获取ledgerID列表
func (s *idStore) close() //关闭idStore leveldb数据库
func (s *idStore) encodeLedgerKey(ledgerID string) []byte //为ledgerID添加前缀即"l"
func (s *idStore) decodeLedgerID(key []byte) string //解除ledgerID前缀
//代码在core/ledger/kvledger/kv_ledger_provider.go
```

func (s *idStore) createLedgerID(ledgerID string, gb *common.Block) error代码如下:
将ledgerID和Block入库,并清除ledgerID在建标志。

```go
func (s *idStore) createLedgerID(ledgerID string, gb *common.Block) error {
    key := s.encodeLedgerKey(ledgerID) //为ledgerID添加前缀即"l"
    var val []byte
    var err error
    if val, err = proto.Marshal(gb); err != nil { //Block序列化
        return err
    }
    if val, err = s.db.Get(key); err != nil {
        return err
    }
    if val != nil {
        return ErrLedgerIDExists //ledgerID已存在
    }
    batch := &leveldb.Batch{}
    batch.Put(key, val) //ledgerID和Block入库
    batch.Delete(underConstructionLedgerKey) //清除ledgerID在建标志
    return s.db.WriteBatch(batch, true) //提交执行
}
//代码在core/ledger/kvledger/kv_ledger_provider.go
```




Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

网址:http://www.qukuailianxueyuan.io/

Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN

Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)





Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

网址:http://www.qukuailianxueyuan.io/

Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

欲领取造币技术与全套虚拟机资料

区块链技术交流QQ群:756146052  备注:CSDN

尹成学院微信:备注:CSDN

Fabric 1.0源代码分析(20) Ledger #idStore(ledgerID数据库)

相关文章:

  • 2021-06-29
  • 2021-05-07
  • 2021-06-17
  • 2022-12-23
  • 2021-08-23
  • 2021-05-23
  • 2021-10-09
  • 2021-08-14
猜你喜欢
  • 2021-10-15
  • 2021-12-16
  • 2021-08-02
  • 2021-07-08
  • 2021-05-24
  • 2021-06-27
  • 2021-05-18
相关资源
相似解决方案