博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
区块链教程Fabric1.0源代码分析ledgerID数据库-兄弟连区块链教程
阅读量:6824 次
发布时间:2019-06-26

本文共 2227 字,大约阅读时间需要 7 分钟。

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数据库)

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

3、idStore方法定义

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",取ledgerIDfunc (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在建标志。

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

感谢关注兄弟连区块链教程分享!

转载地址:http://oblzl.baihongyu.com/

你可能感兴趣的文章
个人作业4——alpha阶段个人总结
查看>>
Oracle11g 新功能
查看>>
Groovy
查看>>
滑动窗口的最大值
查看>>
[转]BT常用渗透命令
查看>>
面向.Net程序员的前端优化
查看>>
HTTPS到底是个什么鬼?
查看>>
Yii框架中ActiveRecord使用Relations
查看>>
leetcode 55.跳跃游戏
查看>>
flexPaper +swftools实现文档在线阅读
查看>>
分形树的绘制
查看>>
获取父页面标签对象,获取当前标签div高度
查看>>
分享10条PHP性能优化的小技巧,帮助你更好的用PHP开发:
查看>>
loadrunner请求中有汉字 如何编码
查看>>
java数据结构 • 面向对象 • 异常 • 随机数·时间
查看>>
springmvc 实现pc端手机端适配(同一个请求根据不同客户端展示不同界面)
查看>>
BTree和B+Tree详解
查看>>
VS2005工程迁移到Eclipse CDT
查看>>
Linux高端内存映射(上)【转】
查看>>
usb_control_msg参数详解【转】
查看>>