区块链教程Fabric1.0源代码分析Ledger statedb(状态数据库)-兄弟连区块链

简介:

Fabric 1.0源代码笔记 之 Ledger #statedb(状态数据库)

1、statedb概述

statedb,或VersionedDB,即状态数据库,存储了交易(transaction)日志中所有键的最新值,也称世界状态(world state)。
可选择基于leveldb或cauchdb实现。

statedb,代码分布在core/ledger/kvledger/txmgmt/statedb目录下,目录结构如下:

  • statedb.go,定义了核心接口VersionedDBProvider、VersionedDB、ResultsIterator和QueryResult,以及UpdateBatch和nsIterator结构体及方法。
  • util.go,包括工具函数EncodeValue和DecodeValue的实现。
  • stateleveldb目录,VersionedDBProvider和VersionedDB接口的leveldb版本实现,即stateleveldb.VersionedDBProvider和stateleveldb.versionedDB结构体及方法。
  • statecouchdb目录,VersionedDBProvider和VersionedDB接口的couchdb版本实现,即statecouchdb.VersionedDBProvider和statecouchdb.VersionedDB结构体及方法。

2、核心接口定义

VersionedDBProvider接口定义:

type VersionedDBProvider interface {
    GetDBHandle(id string) (VersionedDB, error) //获取VersionedDB句柄
    Close() //关闭所有 VersionedDB 实例
}
//代码在core/ledger/kvledger/txmgmt/statedb/statedb.go

VersionedDB接口定义:

type VersionedDB interface {
    //获取给定命名空间和键的值
    GetState(namespace string, key string) (*VersionedValue, error)
    //在单个调用中获取多个键的值
    GetStateMultipleKeys(namespace string, keys []string) ([]*VersionedValue, error)
    //返回一个迭代器, 其中包含给定键范围之间的所有键值(包括startKey,不包括endKey)
    GetStateRangeScanIterator(namespace string, startKey string, endKey string) (ResultsIterator, error)
    //执行给定的查询并返回迭代器
    ExecuteQuery(namespace, query string) (ResultsIterator, error)
    //批处理应用
    ApplyUpdates(batch *UpdateBatch, height *version.Height) error
    //返回statedb一致的最高事务的高度
    GetLatestSavePoint() (*version.Height, error)
    //测试数据库是否支持这个key(leveldb支持任何字节, 而couchdb只支持utf-8字符串)
    ValidateKey(key string) error
    //打开db
    Open() error
    //关闭db
    Close()
}
//代码在core/ledger/kvledger/txmgmt/statedb/statedb.go

ResultsIterator和QueryResult接口定义:

type ResultsIterator interface {
    Next() (QueryResult, error)
    Close()
}

type QueryResult interface{}
//代码在core/ledger/kvledger/txmgmt/statedb/statedb.go

补充CompositeKey、VersionedValue和VersionedKV结构体:

type CompositeKey struct {
    Namespace string //命名空间
    Key       string //Key
}

type VersionedValue struct {
    Value   []byte //Value
    Version *version.Height //版本
}

type VersionedKV struct {
    CompositeKey //嵌入CompositeKey
    VersionedValue //嵌入VersionedValue
}
//代码在core/ledger/kvledger/txmgmt/statedb/statedb.go

nsUpdates结构体及方法:

type nsUpdates struct {
    m map[string]*VersionedValue //string为Key
}

func newNsUpdates() *nsUpdates//构造nsUpdates
//代码在core/ledger/kvledger/txmgmt/statedb/statedb.go

UpdateBatch结构体及方法:

type UpdateBatch struct {
    updates map[string]*nsUpdates //string为Namespace
}

//构造UpdateBatch
func NewUpdateBatch() *UpdateBatch
//按namespace和key获取Value
func (batch *UpdateBatch) Get(ns string, key string) *VersionedValue
//按namespace和key添加Value
func (batch *UpdateBatch) Put(ns string, key string, value []byte, version *version.Height)
//按namespace和key删除Value,即置为nil
func (batch *UpdateBatch) Delete(ns string, key string, version *version.Height)
//按namespace和key查找是否存在
func (batch *UpdateBatch) Exists(ns string, key string) bool
//获取更新的namespace列表
func (batch *UpdateBatch) GetUpdatedNamespaces() []string
//按namespace获取nsUpdates
func (batch *UpdateBatch) GetUpdates(ns string) map[string]*VersionedValue
//构造nsIterator
func (batch *UpdateBatch) GetRangeScanIterator(ns string, startKey string, endKey string) ResultsIterator
//按namespace获取或创建nsUpdates
func (batch *UpdateBatch) getOrCreateNsUpdates(ns string) *nsUpdates
//代码在core/ledger/kvledger/txmgmt/statedb/statedb.go

nsIterator结构体及方法:

type nsIterator struct {
    ns         string //namespace
    nsUpdates  *nsUpdates //batch.updates[ns]
    sortedKeys []string //nsUpdates.m中key排序
    nextIndex  int //startKey
    lastIndex  int //endKey
}

//构造nsIterator
func newNsIterator(ns string, startKey string, endKey string, batch *UpdateBatch) *nsIterator
func (itr *nsIterator) Next() (QueryResult, error) //按itr.nextIndex获取VersionedKV
func (itr *nsIterator) Close() // do nothing
//代码在core/ledger/kvledger/txmgmt/statedb/statedb.go

3、statedb基于leveldb实现

3.1、VersionedDB接口实现

VersionedDB接口实现,即versionedDB结构体,定义如下:

type versionedDB struct {
    db     *leveldbhelper.DBHandle //leveldb
    dbName string //dbName
}
//代码在core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb.go

涉及方法如下:

//构造versionedDB
func newVersionedDB(db *leveldbhelper.DBHandle, dbName string) *versionedDB
func (vdb *versionedDB) Open() error // do nothing
func (vdb *versionedDB) Close() // do nothing
func (vdb *versionedDB) ValidateKey(key string) error // do nothing
//按namespace和key获取Value
func (vdb *versionedDB) GetState(namespace string, key string) (*statedb.VersionedValue, error)
//在单个调用中获取多个键的值
func (vdb *versionedDB) GetStateMultipleKeys(namespace string, keys []string) ([]*statedb.VersionedValue, error)
//返回一个迭代器, 其中包含给定键范围之间的所有键值(包括startKey,不包括endKey)
func (vdb *versionedDB) GetStateRangeScanIterator(namespace string, startKey string, endKey string) (statedb.ResultsIterator, error)
//leveldb不支持ExecuteQuery方法
func (vdb *versionedDB) ExecuteQuery(namespace, query string) (statedb.ResultsIterator, error)
//批处理应用
func (vdb *versionedDB) ApplyUpdates(batch *statedb.UpdateBatch, height *version.Height) error
//返回statedb一致的最高事务的高度
func (vdb *versionedDB) GetLatestSavePoint() (*version.Height, error)
//拼接ns和key,ns []byte{0x00} key
func constructCompositeKey(ns string, key string) []byte
//分割ns和key,分割符[]byte{0x00}
func splitCompositeKey(compositeKey []byte) (string, string)
//代码在core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb.go

func (vdb versionedDB) ApplyUpdates(batch statedb.UpdateBatch, height *version.Height) error代码如下:

dbBatch := leveldbhelper.NewUpdateBatch()
namespaces := batch.GetUpdatedNamespaces() //获取更新的namespace列表
for _, ns := range namespaces {
    updates := batch.GetUpdates(ns) //按namespace获取nsUpdates
    for k, vv := range updates {
        compositeKey := constructCompositeKey(ns, k) //拼接ns和key
        if vv.Value == nil {
            dbBatch.Delete(compositeKey)
        } else {
            dbBatch.Put(compositeKey, statedb.EncodeValue(vv.Value, vv.Version))
        }
    }
}
//statedb一致的最高事务的高度
dbBatch.Put(savePointKey, height.ToBytes()) //var savePointKey = []byte{0x00}
err := vdb.db.WriteBatch(dbBatch, true)
//代码在core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb.go

3.2、ResultsIterator接口实现

ResultsIterator接口实现,即kvScanner结构体及方法。

type kvScanner struct {
    namespace string
    dbItr     iterator.Iterator
}

//构造kvScanner
func newKVScanner(namespace string, dbItr iterator.Iterator) *kvScanner
//迭代获取statedb.VersionedKV
func (scanner *kvScanner) Next() (statedb.QueryResult, error)
func (scanner *kvScanner) Close() //释放迭代器
//代码在core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb.go

3.3、VersionedDBProvider接口实现

VersionedDBProvider接口实现,即VersionedDBProvider结构体及方法。

type VersionedDBProvider struct {
    dbProvider *leveldbhelper.Provider
}

func NewVersionedDBProvider() *VersionedDBProvider //构造VersionedDBProvider
//获取statedb.VersionedDB
func (provider *VersionedDBProvider) GetDBHandle(dbName string) (statedb.VersionedDB, error)
func (provider *VersionedDBProvider) Close() //关闭statedb.VersionedDB
//代码在core/ledger/kvledger/txmgmt/statedb/stateleveldb/stateleveldb.go

4、statedb基于cauchdb实现

暂略,待补充。

相关文章
|
2月前
|
存储 机器学习/深度学习 监控
南大通用GBase 8s数据库onbar基础使用教程
数据备份与恢复是确保数据安全和业务连续性的关键。onbar作为GBase 8s数据库的备份工具,需配合存储管理器使用,通过配置BAR_BSALIB_PATH等参数,实现数据的备份与恢复。本文详细介绍了onbar的配置、备份、恢复及监控流程,帮助数据库管理员构建高效的数据保护方案。
|
3月前
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
72 0
【入门级教程】MySQL:从零开始的数据库之旅
|
3月前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
3月前
|
SQL NoSQL MongoDB
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
一款基于分布式文件存储的数据库MongoDB的介绍及基本使用教程
56 0
|
3月前
|
存储 NoSQL API
.NET NoSQL 嵌入式数据库 LiteDB 使用教程
.NET NoSQL 嵌入式数据库 LiteDB 使用教程~
|
17天前
|
供应链 安全 分布式数据库
探索区块链技术在供应链管理中的应用
【10月更文挑战第21天】 本文深入探讨了区块链技术如何在供应链管理中发挥关键作用,通过具体案例分析,揭示了区块链提高透明度、降低成本和增强安全性的潜力。文章首先概述了区块链技术的基本原理及其对传统供应链模式的挑战,接着详细讨论了区块链如何在不同供应链环节中实施,并分析了其带来的变革。最后,文章提出了企业在采纳区块链技术时可能面临的挑战和应对策略,为供应链管理者提供了宝贵的参考。
|
28天前
|
存储 安全 物联网
未来已来:区块链技术在物联网与虚拟现实中的应用
随着科技的不断进步,新兴技术如区块链、物联网(IoT)和虚拟现实(VR)正在逐渐改变我们的生活和工作方式。本文将探讨这些技术的发展趋势和应用场景,以及它们如何相互融合,为我们带来更便捷、安全和沉浸式的体验。
|
2月前
|
存储 供应链 分布式数据库
深入理解区块链技术:原理、应用与挑战
本文旨在探讨区块链技术的基本原理、主要应用及其面临的挑战。通过分析区块链的分布式账本技术、加密算法和共识机制,我们揭示了其如何在无需中心化权威的情况下确保数据的不可篡改性和透明性。此外,文章还讨论了区块链在金融、供应链管理、智能合约等领域的应用案例,并指出了当前区块链技术面临的可扩展性、隐私保护和法律监管等挑战。通过对这些内容的深入分析,我们希望为读者提供一个全面而深入的区块链技术概览。
129 16
|
28天前
|
存储 供应链 算法
深入探索区块链技术:原理、应用与未来展望
本文将带你深入了解区块链技术的基本原理,探讨其在金融、供应链、医疗等多个领域的应用案例,并展望其未来的发展趋势。通过本文,你将对区块链技术有一个全面的认识,理解其背后的技术逻辑和应用场景。
|
2月前
|
供应链 安全 区块链
探索区块链技术在数据安全中的应用
本文深入探讨了区块链技术如何革新数据安全领域,特别是在保护个人隐私、增强数据完整性和透明度方面的作用。通过分析区块链的去中心化特性、加密技术以及智能合约的功能,文章阐述了这一技术如何有效防止数据篡改、确保交易记录的不可逆性,并促进跨组织间的信任建立。此外,还讨论了当前区块链技术面临的挑战及未来发展趋势,为理解其在数据安全领域的潜力提供了全面视角。

热门文章

最新文章