区块链教程Fabric1.0源代码分析ledgerID数据库-兄弟连区块链教程-阿里云开发者社区

开发者社区> 区块链教程> 正文

区块链教程Fabric1.0源代码分析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数据库)

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

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的 适应高吞吐量的数据库解决方案。 优点 1. Oracle 能在所有主流平台上运行(包括 windows)完全支持所有工业标准采用完全开放策略使客户选择适合解决方案对开发商全力支持。 2. Oracle 并行服务器通过使组结点共享同簇工作来扩展wi
16 0
大数据分析在新型智慧能源建设中的应用
智慧一词已经提出很多年,这是一种全新的能源形式,包括符合生态文明和可持续发展要求的相关能源技术和能源制度体能源这系。智慧能源是以互联网技术为基础,以电力系统为中心,将电力系统与天然气网络、供热网络以及工业、交通、建筑系统等紧密耦合,横向实现电、气、热、可再生能源等“多源互补”,纵向实现“源、网、荷、储”各环节高度协调,生产和消费双向互动,集中与分布相结合的能源服务网络。
1604 0
Quick BI 支持多种数据源进行多维分析
随着互联网的高速发展,数据量爆发式增长的同时,数据的存储形式也开始呈现出多样性,有结构化存储,如 Mysql, Oracle, SQLServer 等,半结构化甚至非结构化存储,如HBase,OSS 等。
2097 0
ML之catboost:catboost模型中常用的Pool类型数据结构源代码解读、案例应用之详细攻略(二)
ML之catboost:catboost模型中常用的Pool类型数据结构源代码解读、案例应用之详细攻略
13 0
“数据访问函数库”(DataAccessLibrary for .net2.0 )源代码下载 09.06.15更新
最新下载地址: http://www.naturefw.com/nature/down.aspx      DLL文件说明      Controls.dll 控件集合,包含QuickPager分页控件等。
730 0
用代码画UML类图快餐教程
之前我们讨论了graphviz的dot图,mermaid画流程图和时序图,plantuml画时序图。 plantuml除了可以画时序图之外,还可以画UML类图。
2519 0
40
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载