本文译自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. docker 搭建ntp服务器

    背景 在搭建etcd集群时,如果主机时间相差太多会出现同步错误,如果外部网络不可用时,需要使用内部的ntp服务器同步时间. 构建ntp镜像 创建Dockerfile # usage: # docker ...

  2. iOS - 富文本直接设置文字的字体大小和颜色

    富文本效果图: 富文本实现代码: UILabel *orderSureLabel = [Common lableFrame:CGRectZero title:] textColor:[UIColor ...

  3. spring框架学习感悟

    学习了一段时间的spring,但是在练习时老是出现bug,一方面,框架封装了很多东西,简化了开发,但是万一出现问题,就很难排查.这说明应该找个慢慢的熟悉它,并且掌握它. 在这个过程中,可能要不断地试错 ...

  4. 比例尺与DEM空间分辨率

    我国 4 种比例尺 DEM 及其空间分辨率的对应关系:  1:100 万 DEM  --  1000m 空间分辨率:  1:25 万 DEM  --  100m 空间分辨率:  1:5 万 DEM  ...

  5. db2 MON_GET_PKG_CACHE_STMT 表函数 抓取分析SQL

    MON_GET_PKG_CACHE_STMT 表函数 还可以使用 MON_GET_PKG_CACHE_STMT 表函数来查询当前 PACKAGE CACHE 中 SQL 语句(包括动态 SQL 和静态 ...

  6. Codeforces 279C - Ladder - [简单DP]

    题目链接:http://codeforces.com/problemset/problem/279/C 题意: 给出 $n$ 个整数 $a[1 \sim n]$,$m$ 个查询,对于一个查询 $[l_ ...

  7. 在ubuntu系统中,python依赖存放的路径

    你在使用python,之后你想给python安装一些第三方库,如tensorflow或者tensorrt,那么这些包存放在哪个路径下呢? 该目录下: /usr/local/lib/python3.5/ ...

  8. spring @Order标记

    @Order标记定义了组件的加载顺序. @Order标记从spring 2.0出现,但是在spring 4.0之前,@Order标记只支持AspectJ的切面排序.spring 4.0对@Order做 ...

  9. MyCAT 在 Cobar 的基础上,完成了彻底的 NIO 通讯,并且合并了两个线程池

    研读: 1.http://www.mycat.io <Mycat权威指南> 第 2 章 Mycat 前世今生: 浏览: 深度认识 Sharding-JDBC:做最轻量级的数据库中间层 - ...

  10. mysql缓冲