Ledger

Ledger(账本)即所有的state transitions(状态切换),是有序且不可篡改的。state transitions(状态切换)是由参与方提交的chaincode(智能合约)调用(“transactions/事务”)的结果。每个事务都将产生一组资产键值对,这些键值对作为创建、更新或删除而提交给Ledger(账本)。

Ledger(账本)由blockchain(区块链)(“chain”)组成,区块则用来存储有序且不可篡改的记录,以及保存当前状态的state database(状态数据库)。在每一个channel中都会存在一个Ledger(账本)。每一个peer都会维护它作为其中成员的每一个channel中的本地拷贝的Ledger(账本)。

Chain

chain是一个事务日志,是一个由hash链接的链接各个区块的结构,其中每个区块都包含了N个事务的序列。区块header包含了该区块的事务的hash,以及上一个区块头的hash。这样,所有在账本上的交易都是按顺序排列的,并以密码方式链接在一起。换句话说,在不破坏hash链接的情况下篡改账本数据是不可能的。最近的区块的hash代表了以前的每个事务,从而确保所有的peers都处于一致和可信的状态。

chain存储在peer文件系统(本地或附加存储)上,有效地支持blockchain工作负载的应用程序的特性。

State Database

该账本的当前状态数据表示chain事务日志中包含的所有键的最新值。由于当前状态表示channel所知道的所有最新键值,因此有时也称为“World State(世界状态)”。

在chaincode调用对当前状态数据执行操作的事务时,为了使这些chaincode交互非常有效,所有键的最新值都存储在一个状态数据库中。状态数据库只是一个索引视图到chain的事务日志中,因此可以在任何时候从chain中重新生成它。在事务被接受之前,状态数据库将自动恢复(或在需要时生成)。

状态数据库选项包括LevelDB和CouchDB。LevelDB是嵌入在peer进程中的默认状态数据库,并将chaincode数据存储为键/值对。CouchDB是一个可选的外部状态数据库,当你所写的chaincode数据被建模为JSON时,它提供了额外的查询支持,允许对JSON内容进行丰富的查询。

Transaction Flow

在高层业务逻辑处理上,transaction flow(事务处理流程)是由应用程序客户端发送的事务协议,该协议最终发送到指定的背书节点。背书节点会验证客户端的签名,并执行一个chaincode函数来模拟事务。最终返回给客户端的是chaincode结果,即一组在chaincode(读集)中读取的键/值版本,以及在chaincode(写集)中写入的键/值集合,即返回该peer执行chaincode后模拟出来的读写集结果,同时还会附带一个背书签名。

客户端将背书组合成一个事务payload,并将其广播至一个ordering service(排序服务节点),ordering service(排序服务节点)为当前channel上的所有peers提供排序服务并生成区块。

实际上,客户端在将事务广播到排序服务之前,先将本次请求提交到peer,由peer来验证事务。

首先,peer将检查背书策略,以确保指定的peer的正确分配已经签署了结果,并且他们将根据事务payload对签名进行身份验证。

其次,peer将对事务读取集进行版本控制,以确保数据完整性,并防止诸如重复开销之类的问题。Hyperledger Fabric具有并发控制,即事务允许并行执行(通过背书)来增加吞吐量,并且在提交(所有peer)的情况下,每个事务都经过验证,以确保没有其他事务修改它已经读取的数据。换句话说,它确保了在执行(批准)时间之后读取的数据没有发生变化,因此执行结果仍然有效,并且可以提交到账本状态数据库。如果读取的数据被另一个事务更改,则该区块中的相同事务被标记为无效,并且不应用于账本状态数据库。客户端应用程序被警告,并且可以在适当的情况下处理错误或重试。

(备注:上述最后一段话的逻辑理论上是正确的,即读取本地版本然后根据本地版本发送广播至排序服务,再由排序服务进行事务处理。但事务处理结果通过实际使用sdk开发,该结果并未即时返回给当前调用客户端,即客户端无法实时获取事务状态,只能通过再次查询来确认最终结果。后续版本sdk可能会修复此问题。)

请参阅Hyperledger Fabric Transaction Flow——事务处理流程Hyperledger Fabric Read-Write set semantics——读写集Hyperledger Fabric CouchDB as the State Database——使用CouchDB,以深入了解事务结构、并发控制和状态数据库。

Hyperledger Fabric Ledger——账本总账的更多相关文章

  1. 用Java为Hyperledger Fabric(超级账本)编写区块链智能合约链代码

    编写第一个 Java 链代码程序 在上一节中,您已经熟悉了如何构建.运行.部署和调用链代码,但尚未编写任何 Java 代码. 在本节中,将会使用 Eclipse IDE.一个用于 Eclipse 的 ...

  2. 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境

    面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...

  3. 用Java为Hyperledger Fabric(超级账本)开发区块链智能合约链代码之部署与运行示例代码

    部署并运行 Java 链代码示例 您已经定义并启动了本地区块链网络,而且已构建 Java shim 客户端 JAR 并安装到本地 Maven 存储库中,现在已准备好在之前下载的 Hyperledger ...

  4. hyperledger fabric超级账本java sdk样例e2e代码流程分析

     一  checkConfig  Before     1.1  private static final TestConfig testConfig = TestConfig.getConfig() ...

  5. HyperLedger Fabric Introduction——区块链超级账本介绍

    介绍 HyperLedger Fabric是一个基于模块化架构的分布式账本解决方案平台,它拥有深度加密.便捷扩展.部署灵活及可插拔等特性.它设计之初的目的是支持不同组件的可插拔实现,并适应整个经济生态 ...

  6. Hyperledger Fabric Model——超级账本组成模型

    超级账本组成模型 本文主要讲述Hyperledger Fabric的关键设计特性,并细述如何实现了一个全面的.可定制的企业级区块链解决方案: 资产定义--资产这里理解为任何具有货币价值的东西,它们都可 ...

  7. Hyperledger Fabric 账本结构解析

    前言 现在很多人都在从事区块链方面的研究,作者也一直在基于Hyperledger Fabric做一些开发工作.为了方便后来人更快的入门,本着“开源”的精神,在本文中向大家讲解一下Hyperledger ...

  8. HyperLedger Fabric 1.4 超级账本项目(5.4)

    超级账本(Hyperledger)项目分框架类和工具类两种项目,框架类有Hyperledger Burrow.Hyperledger Fabric.Hyperledger Indy.Hyperledg ...

  9. 联盟链IBM的超级账本Hyperledger Fabric框架,JP Morgan’s Quorum

    联盟链IBM的超级账本Hyperledger Fabric框架,JP Morgan’s Quorum JP Morgan’s Quorum https://www.coindesk.com/jpmor ...

随机推荐

  1. 小白学svn

    该博客是本人第一次在自己的电脑中部署svnserver后的一些心得,希望对小白们有所帮助.尽管本人之前有使用svn开发的经验,可是那都是使用百度开发人员平台的,我一直以为在自己的电脑中弄svnserv ...

  2. TensorFlow函数(六)初始值生成函数

    1.常量生成函数 tf.constant(value, dtype) 生成一个初始值为常量value的数组 value:指定的常量 dtype:数据类型 tf.zeros(shape, dtype) ...

  3. swoole_table应用类

    <?php/* Redis可真能坑爷,原先的设计用redis保存临时数据,可到了实际应用(实际上也就是几十个人同时用),总是出现莫名其妙的问题,最常见的就是读不出数据来,调试了好多天,那问题还是 ...

  4. [转] Eclipse安装SVN插件

    eclipse里安装SVN插件,一般来说,有三种方式: 1. 直接下载SVN插件,将其解压到eclipse的对应目录里 2. 使用eclipse 里Help菜单的“Install New Softwa ...

  5. 分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点,使之满足下列要求:

    (1) Point2D有两个整型成员变量x, y (分别为二维空间的X,Y方向坐标),Point2D的构造方法要实现对其成员变量x, y的初始化. (2)Point2D有一个void型成员方法offs ...

  6. LeetCode559. Maximum Depth of N-ary Tree

    第一次写出了具有迭代和递归的函数,还是有点收获的,虽然题目比较简答 当要对某些对象重复使用时,考虑循环,也就是迭代 当函数可以简化一个重复的操作时,考虑递归,而且就当下一次使用这和函数的结果已经有啦, ...

  7. (转)WebSocket的原理

    前言:无聊逛知乎,就逛到H5的栏目去了,正好看到了关于Websocket的东西.个人是比较喜欢看这类风格的,转到博客分享,以便自己以后理解. ---------------------分割线----- ...

  8. Oracle 的存储过程以及用jdbc调用存储过程

    存储过程 就是一组用于完成特定功能的PL/SQL 具名语句块,该SQL语句集经过编译后存储在数据库系统中.在使用时候,我们只需要通过指定已经定义的存储过程名字并给出对应的参数来执行  存储过程的定义语 ...

  9. 笔记1:MYSQL

    (注:第一次写,如有错误之处,希望指出,不胜感激,谢谢,不喜也勿喷) 一.MYSQL简单描述 1.MYSQL是什么? MYSQL是现在最流行的关系型数据库管理系统之一: MYSQL是开源软件: 关系型 ...

  10. jQuery插件,判断鼠标的移入移出方向

    今天用jQuery封装了一个简单的插件,判断鼠标的移入移出方向,以后的项目中可能还会遇到这样一个简单的效果,就记录下来吧! 先看结构和样式: <!DOCTYPE html> <htm ...