区块链教程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

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

相关文章
|
3月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
625 5
|
11月前
|
关系型数据库 MySQL API
新手教程:数据库操作(使用PDO或MySQLi扩展)
本文为新手介绍如何使用PDO和MySQLi扩展连接与操作MySQL数据库。PDO更现代灵活,支持多种数据库,适合大多数应用;MySQLi提供面向过程和面向对象两种API,适合直接控制数据库操作。教程涵盖安装配置、创建连接、执行查询(查询、插入、更新、删除)及错误处理等内容。希望这篇教程能帮助你快速上手PHP中的数据库操作!
349 32
|
10月前
|
存储 关系型数据库 分布式数据库
PolarDB 开源基础教程系列 8 数据库生态
PolarDB是一款开源的云原生分布式数据库,源自阿里云商业产品。为降低使用门槛,PolarDB携手伙伴打造了完整的开源生态,涵盖操作系统、芯片、存储、集成管控、监控、审计、开发者工具、数据同步、超融合计算、ISV软件、开源插件、人才培养、社区合作及大型用户合作等领域。通过这些合作伙伴,PolarDB提供了丰富的功能和服务,支持多种硬件和软件环境,满足不同用户的需求。更多信息请访问[PolarDB开源官方网站](https://openpolardb.com/home)。
520 4
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
587 0
【入门级教程】MySQL:从零开始的数据库之旅
|
存储 机器学习/深度学习 监控
南大通用GBase 8s数据库onbar基础使用教程
数据备份与恢复是确保数据安全和业务连续性的关键。onbar作为GBase 8s数据库的备份工具,需配合存储管理器使用,通过配置BAR_BSALIB_PATH等参数,实现数据的备份与恢复。本文详细介绍了onbar的配置、备份、恢复及监控流程,帮助数据库管理员构建高效的数据保护方案。
|
SQL NoSQL MongoDB
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
400 0
|
存储 NoSQL API
.NET NoSQL 嵌入式数据库 LiteDB 使用教程
.NET NoSQL 嵌入式数据库 LiteDB 使用教程~
533 0
|
3月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
163 3
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
800 152

热门文章

最新文章