本文译自Fabric 1.0 文档,这篇文档详述了当前读写集语义实现的细节。文档地址为: 
https://hyperledger-fabric.readthedocs.io/en/latest/readwrite.html

交易模拟和读写集 
在一个背书人上进行交易模拟期间,会为交易准备一个读写数据集。读集包含一份唯一键的列表和该键的提交版本,用于交易模拟期间读取。写集包含一份唯一键的列表(键值可能与读集有重叠)和交易写入的对应的新键值。如果交易更新是删除该键,那么会对该键做一个删除标记。 
进一步的,如果交易对一个键对应的值进行多次写操作,该键只会保留最后一次写入的值。同样,如果交易读取一个键对应的值,会返回处于已提交状态的值。即使在进行读取操作之前该交易已经更新了该键的值。换句话说就是,不支持在交易中读取该交易写入的数据。 
正如前面提到的,键的版本只被记录在读集中。写集仅包含唯一键的列表和交易设置的键的最新值。 
有很多方案可以实现版本控制,最简单的方案是给每一个键生成一个独一无二的标识符。例如:用单调递增数字代表版本号就是这样一种方案。在Fabric 1.0 中,我们基于版本控制,使用了正在提交的交易所在的区块链高度作为所有被交易改变的键的最新版本。在此方案中,一笔交易的高度使用一个元组表示(txNumber 是该交易所在区块的高度)。这种方式相比于单调递增数字的方案有很多优势,首要的就是它让状态数据库、交易模拟和验证等组件进行有效的设计选择成为可能。

下面是对读写集例子的说明,为了简便,这里使用单调递增数字代表版本: 
 
另外,如果交易在模拟中进行了range查询操作,查询操作和其结果都将被添加到读写集作为query-info。

交易验证和使用读写集更新世界状态 
提交者使用读写集的读集部分校验一笔交易的有效性,使用写集更新相关键的版本和键值。 
在验证阶段,如果一笔交易中每个读集中的键与世界状态中对应键的版本号一致,那么该笔交易被认为是有效的–假设先前的有效交易都已经被提交了,包括同一区块中的先前交易。但是如果读写集中包含了一个或者多个query-info,就需要执行额外的验证。 
额外的验证要确保在先前的query-info中的结果没有键被插入、删除或者更新。换句话说,如果我们在验证时基于已提交状态重复执行range查询操作,应该得到和我们在交易模拟时观察到的一样的结果。这种验证确保如果一笔交易在提交时观察到幽灵条目,该笔交易应该被标记为无效。注意虚假保护仅限于range查询(比如链码中的GetStateByRange函数),还没有在其他查询操作中实现。其他查询操作对幽灵有风险,所以应该被用于只读的并不提交到ordering的交易,除非应用可以保证模拟和验证/提交时的结果集的稳定性。 
如果一笔交易通过了有效性验证,提交者会使用写集更新世界状态。在更新阶段,写集中每个键所对应的世界状态中的该键的值都会被设置为写集中确定的值。并且,世界状态中的键的版本也更新到最新版本。

模拟和验证例子 
这节通过小例子来帮助理解读写集语义。为此,键k在世界状态中被表示为(k,ver,val),其中ver是最新版本,val是它的值。 
现在假设有T1,T2,T3,T4和T5共5笔交易,所有的模拟都基于同一个世界状态的快照。下面的片段展示了世界状态的快照以及交易模拟和每个交易模拟的一系列读写操作: 

现在假定这些交易被排序为T1到T5依次执行: 
1、T1通过验证,因为它并没有任何读操作。并且世界状态中k1和k2键的值别更新为(k1,2,v1’), (k2,2,v2’)。 
2、T2不能通过验证,因为它读取了k1键的值,该值在T1中被修改了。 
3、T3通过验证,因为它并没有任何读操作。并且世界状态中k2的值被更新为(k2,3,v2”)。 
4、T4不能通过验证,因为它读取了k2键的值,该值在T1中被修改了。 
5、T5通过验证,虽然读取了k5的值,但是k5的值之前交易并未修改过。

注意:目前不支持带有多重读写集的交易。

转自:https://blog.csdn.net/lengconglin/article/details/76863195

(转)Fabric 1.0 读写集的更多相关文章

  1. Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署

    6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...

  2. Hyperledger Fabric Read-Write set semantics——读写集

    Read-Write set semantics(读写集) 本文讨论了关于读写集当前实现的细节. Transaction simulation and read-write set(事务模拟和读写集) ...

  3. HyperLedger Fabric 1.0的Transaction处理流程

    如果把区块链比作一个只能读写,不能删改的分布式数据库的话,那么事务和查询就是对这个数据库进行的最重要的操作.以比特币来说,我们通过钱包或者Blockchain.info进行区块链的查询操作,而转账行为 ...

  4. Fabric 1.0交易流程

    这篇文章详细介绍fabric的交易流程,以图片加文字的形式呈现. Fabric 1.0交易流程 fabric中的所有交易都是通过chaincode执行 1.应用程序客户端通过SDK调用证书服务(CA) ...

  5. Hyperledger Fabric 1.0 从零开始(十三)——orderer分布式方案

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群 ...

  6. Hyperledger Fabric 1.0 从零开始(七)——启动Fabric多节点集群

    5:启动Fabric多节点集群 5.1.启动orderer节点服务 上述操作完成后,此时各节点的compose配置文件及证书验证目录都已经准备完成,可以开始尝试启动多机Fabric集群. 首先启动or ...

  7. Hyperledger Fabric 1.0 从零开始(六)——创建Fabric多节点集群

    4:创建Fabric多节点集群 4.1.配置说明 首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过 ...

  8. Hyperledger Fabric 1.0 从零开始(一)——吐槽

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017 ...

  9. Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】

    在 Hyperledger Fabric 1.0 从零开始(十二)--fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也 ...

随机推荐

  1. 深入理解 Java 虚拟机之学习笔记(2)

    本节介绍 Java堆的OutOfMemoryError测试 Eclipse Memory Analyzer分析内存溢出 虚拟机栈和本地方法栈StackOverflowError测试 方法区和运行时常量 ...

  2. Windows下MySQL的绿化与精简

    MySQL本身就支持安装使用,本文只是对自己使用免安装版MySQL的经历记录下来,以便以后查看. 首先是获取Windows下的MySQL免安装版本,这个需要去到MySQL官网进行下载.我一般喜欢把首页 ...

  3. simulation vs emulation

    Hardware emulation, the use of special purpose hardware to emulate the behavior of a yet-to-be-built ...

  4. linux下内核的配置和编译(2017-1-17)

    4.1 什么是内核 内核是操作系统内核的简称,内核负责实现操作系统的核心功能,包括资源管理模块,譬如内 存管理.调度系统等等.内核不包括应用程序.对于 linux 内核而言全世界是有一份内核,我们可 ...

  5. Maven知识点积累一

    配置maven变量,变量名可以是:MAVEN_HOME 或 M2_HOME settings.xml配置本地仓库地址: <localRepository>G:/.m2/repository ...

  6. 线段树||BZOJ5194: [Usaco2018 Feb]Snow Boots||Luogu P4269 [USACO18FEB]Snow Boots G

    题面:P4269 [USACO18FEB]Snow Boots G 题解: 把所有砖和靴子排序,然后依次处理每一双靴子,把深度小于等于它的砖块都扔线段树里,问题就转化成了求线段树已有的砖块中最大的砖块 ...

  7. 将音乐生成波浪图形,JavaScript Html5

    x 省略废话(N+)... Windows Media Palyer中的经典波浪形 自己也行动手做一个,最好是JavaScript实现的, 搜索到了资源部分关键词"HTML5 频谱" ...

  8. 网卡配置文件详解 用户管理与文件权限篇 文件与目录权限 软连接 tar解压命令 killall命令 linux防火墙 dns解析设置 计划任务crond服务 软件包安装 阿里云 yum源 安装

    Linux系统基础优化及常用命令 Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ...

  9. [No0000D8]rar合并到JPG.bat用图片隐藏文件

    echo off cls echo 请拖入jpg图像文件后回车: set /p imagefile= echo 请拖入rar文件后回车: set /p rarfile= copy /b %imagef ...

  10. python3读取excel数据

    import xlrd worksheet = xlrd.open_workbook('XXXX.xlsx')   #打开excel文件 sheet_names= worksheet.sheet_na ...