本文译自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. Elasticsearch 学习之 节点重启

    ElasticSearch集群的高可用和自平衡方案会在节点挂掉(重启)后自动在别的结点上复制该结点的分片,这将导致了大量的IO和网络开销.如果离开的节点重新加入集群,elasticsearch为了对数 ...

  2. numpy 中不常用的一些方法

    作者:代码律动链接:https://zhuanlan.zhihu.com/p/36303821来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 挑战 1:引入 numpy ...

  3. maven项目启动报错:SLF4J: Class path contains multiple SLF4J bindings.

    SringBoot的Application启动报错: SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding ...

  4. Spring 嵌套方法AOP不生效问题

    问题描述, 如下Abc定义为一个Bean, b()方法添加@TargetDatasource,定义切面DynamicDataSourceAspect,期望:调用a()方法,b()方法上的AOP拦截能生 ...

  5. CM5.x配置spark错误解决

    通过cloudera manager 5.x添加spark服务,在创建服务过程中,发现spark服务创建失败,可以通过控制台错误输出看到如下日志信息: + perl -pi -e 's#{{CMF_C ...

  6. 安装MAC的ReactNative环境

    brew install node brew install watchman npm config set registry https://registry.npm.taobao.org --gl ...

  7. git 新建工程

    之前的一篇文章 https://www.cnblogs.com/wjw-blog/p/7189730.html,按照流程能搭建好git仓库,有时候会有一些小问题. 按照这个流程:-在github 上新 ...

  8. 几个linux内核参数

    raid=noautodetec libata.force=3.0G mem=1G 不检测raid, sata限制3.0G 内存限制1G https://serverfault.com/questio ...

  9. 关于ionic如何到最新版本

    首先删除 我叫他它叫做依赖node_modules 文件夹然后修改 修改依赖版本package.json 各个文件的版本号接着下载 下载最新的依赖 会根据package.json 各个文件的版本号添加 ...

  10. 内部排序->选择排序->简单选择排序

    文字描述 简单排序的基本思想是:每一趟在n-i+1(i=1,2,…,n)个记录中选取关键字最小的记录作为有序列表中的第i个记录. 示意图 略 算法分析 简单排序算法中,所需进行记录移动的操作次数较少, ...