当前位置: 首页 > news >正文

兄弟连区块链教程Fabric1.0源代码分析Ledger(账本)一

  区块链教程Fabric1.0源代码分析Ledger(账本)一,2018年下半年,区块链行业正逐渐褪去发展之初的浮躁、回归理性,表面上看相关人才需求与身价似乎正在回落。但事实上,正是初期泡沫的渐退,让人们更多的关注点放在了区块链真正的技术之上。

Fabric 1.0源代码笔记 之 Ledger(账本)

1、Ledger概述

Ledger,即账本数据库。Fabric账本中有四种数据库,idStore(ledgerID数据库)、blkstorage(block文件存储)、statedb(状态数据库)、historydb(历史数据库)。
其中idStore、historydb使用leveldb实现,statedb可选择使用leveldb或couchDB。而blkstorage中index部分使用leveldb实现,实际区块链数据存储使用文件实现。

  • idStore,默认目录/var/hyperledger/production/ledgersData/ledgerProvider,更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #idStore(ledgerID数据库)
  • blkstorage,默认目录/var/hyperledger/production/ledgersData/chains,更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #blkstorage(block文件存储)
  • statedb,默认目录/var/hyperledger/production/ledgersData/stateLeveldb,更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #statedb(状态数据库)
  • historydb,默认目录/var/hyperledger/production/ledgersData/historyLeveldb,更详细内容,参考:Fabric 1.0源代码笔记 之 Ledger #historydb(历史数据库)

2、Ledger代码目录结构

Ledger相关代码分布在common/ledger、core/ledger和protos/ledger目录下。目录结构如下:

  • common/ledger目录
         ledger_interface.go,定义了通用接口Ledger、ResultsIterator、以及QueryResult和PrunePolicy(暂时均为空接口)。
        
    blkstorage目录,blkstorage相关接口及实现
        * util/leveldbhelper目录,LevelDB数据库操作的封装。
        
  • core/ledger目录
         ledger_interface.go,定义了核心接口PeerLedgerProvider、PeerLedger、ValidatedLedger(暂时未定义)、QueryExecutor、HistoryQueryExecutor和TxSimulator。
        
    kvledger目录,目前PeerLedgerProvider、PeerLedger等接口仅有一种实现即:kvledger。
             kv_ledger_provider.go,实现PeerLedgerProvider接口,即Provider结构体及其方法,以及idStore结构体及方法
            
    kv_ledger.go,实现PeerLedger接口,即kvLedger结构体及方法。
             txmgmt目录,交易管理。
                
    statedb目录,statedb相关接口及实现
             history/historydb目录,historydb相关接口及实现
        
    ledgermgmt/ledger_mgmt.go,Ledger管理相关函数实现。
         ledgerconfig/ledger_config.go,Ledger配置相关函数实现。
        
    util目录,Ledger工具相关函数实现。
        

3、核心接口定义

PeerLedgerProvider接口定义:提供PeerLedger实例handle。

type PeerLedgerProvider interface {
    Create(genesisBlock *common.Block) (PeerLedger, error) //用给定的创世纪块创建Ledger
    Open(ledgerID string) (PeerLedger, error) //打开已创建的Ledger
    Exists(ledgerID string) (bool, error) //按ledgerID查Ledger是否存在
    List() ([]string, error) //列出现有的ledgerID
    Close() //关闭 PeerLedgerProvider
}
//代码在core/ledger/ledger_interface.go

PeerLedger接口定义:
PeerLedger和OrdererLedger的不同之处在于PeerLedger本地维护位掩码,用于区分有效交易和无效交易。

type PeerLedger interface {
    commonledger.Ledger //嵌入common/ledger/Ledger接口
    GetTransactionByID(txID string) (*peer.ProcessedTransaction, error) //按txID获取交易
    GetBlockByHash(blockHash []byte) (*common.Block, error) //按blockHash获取Block
    GetBlockByTxID(txID string) (*common.Block, error) //按txID获取包含交易的Block
    GetTxValidationCodeByTxID(txID string) (peer.TxValidationCode, error) //获取交易记录验证的原因代码
    NewTxSimulator() (TxSimulator, error) //创建交易模拟器,客户端可以创建多个"TxSimulator"并行执行
    NewQueryExecutor() (QueryExecutor, error) //创建查询执行器,客户端可以创建多个'QueryExecutor'并行执行
    NewHistoryQueryExecutor() (HistoryQueryExecutor, error) //创建历史记录查询执行器,客户端可以创建多个'HistoryQueryExecutor'并行执行
    Prune(policy commonledger.PrunePolicy) error //裁剪满足给定策略的块或交易
}
//代码在core/ledger/ledger_interface.go

未完待续欢迎继续关注兄弟连区块链教程分享!

转载于:https://blog.51cto.com/14041296/2311267

相关文章:

  • 简单远程遥控程序【网络程序设计 - 简单远程遥控程序,C实现】
  • CStringArray error C2248: 'CObject::CObject' : cannot access private member declared in class
  • js 在光标处插入内容
  • fastcgi_param 详解
  • dup
  • 常用STL用法总结
  • SQLServer之事务简介
  • 个人笔记:ORACLE大页内存hugepage和SGA、PGA的经验,SGA并不是越大越好
  • JavaScript 类数组对象与 arguments
  • 点击按钮,找不到url
  • WPF模板(一)详细介绍
  • 猿课python第二天
  • 再见了Server对象,拥抱IHostingEnvironment服务对象(.net core)
  • Sublime Text在Ubuntu下无法输入中文的解决方案
  • Oracle11g RAC下ASM 的管理与维护
  • Asm.js的简单介绍
  • CentOS 7 修改主机名
  • co.js - 让异步代码同步化
  • CSS盒模型深入
  • E-HPC支持多队列管理和自动伸缩
  • Fastjson的基本使用方法大全
  • jquery ajax学习笔记
  • jquery cookie
  • Meteor的表单提交:Form
  • October CMS - 快速入门 9 Images And Galleries
  • Sass Day-01
  • 创建一种深思熟虑的文化
  • 仿天猫超市收藏抛物线动画工具库
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 离散点最小(凸)包围边界查找
  • 理解在java “”i=i++;”所发生的事情
  • 前嗅ForeSpider采集配置界面介绍
  • 为什么要用IPython/Jupyter?
  • 自定义函数
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (3)选择元素——(17)练习(Exercises)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (arch)linux 转换文件编码格式
  • (C)一些题4
  • (LeetCode) T14. Longest Common Prefix
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (转载)Linux 多线程条件变量同步
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • .gitignore文件设置了忽略但不生效
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net环境下的缓存技术介绍
  • .NET基础篇——反射的奥妙