(转)Fabric 1.0 读写集
本文译自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 读写集的更多相关文章
- Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署
6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...
- Hyperledger Fabric Read-Write set semantics——读写集
Read-Write set semantics(读写集) 本文讨论了关于读写集当前实现的细节. Transaction simulation and read-write set(事务模拟和读写集) ...
- HyperLedger Fabric 1.0的Transaction处理流程
如果把区块链比作一个只能读写,不能删改的分布式数据库的话,那么事务和查询就是对这个数据库进行的最重要的操作.以比特币来说,我们通过钱包或者Blockchain.info进行区块链的查询操作,而转账行为 ...
- Fabric 1.0交易流程
这篇文章详细介绍fabric的交易流程,以图片加文字的形式呈现. Fabric 1.0交易流程 fabric中的所有交易都是通过chaincode执行 1.应用程序客户端通过SDK调用证书服务(CA) ...
- Hyperledger Fabric 1.0 从零开始(十三)——orderer分布式方案
简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群 ...
- Hyperledger Fabric 1.0 从零开始(七)——启动Fabric多节点集群
5:启动Fabric多节点集群 5.1.启动orderer节点服务 上述操作完成后,此时各节点的compose配置文件及证书验证目录都已经准备完成,可以开始尝试启动多机Fabric集群. 首先启动or ...
- Hyperledger Fabric 1.0 从零开始(六)——创建Fabric多节点集群
4:创建Fabric多节点集群 4.1.配置说明 首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过 ...
- Hyperledger Fabric 1.0 从零开始(一)——吐槽
在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017 ...
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
在 Hyperledger Fabric 1.0 从零开始(十二)--fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也 ...
随机推荐
- mtr
一般在windows 来判断网络连通性用ping 和tracert,ping的话可以来判断丢包率,tracert可以用来跟踪路由,在Linux中有一个更好的网络连通性判断工具,它可以结合ping ns ...
- 170829、mybatis使用oracle和mybatis中批量更新
一.mybatis执行批量更新batch update 的方法(mysql数据库) 1.数据库连接必须配置:&allowMultiQueries=true(切记一定要加上这个属性,否则会有问题 ...
- PHP数组(数组正则表达式、数组、预定义数组)
正则表达式 1.替换 $s = "hello5world"; $s = preg_replace("/\d/","#",$s); echo ...
- 洛谷 P1181数列分段SectionI 【贪心】
题目描述 对于给定的一个长度为NN的正整数数列A_iAi,现要将其分成连续的若干段,并且每段和不超过MM(可以等于MM),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 第1行包含两 ...
- c# 串口关闭死机
用C#编写的wince串口通信程序基本大功告成了,与之前用API函数和线程来做串口通信不同,这次直接使用SerialPort控件来做,原本以为使用控件做会简单和方便许多,没成想,还遇到了很多麻烦. 通 ...
- c语言之要点-泛篇
1.goto goto由goto和标签名组成, 1 1 if(....) 2 2 { 3 3 ..... 4 4 goto part2; 5 5 } 6 6 part2: printf(". ...
- sql join 语句的小总结
CREATE TABLE Persons ( id INT PRIMARY KEY, LastName CHAR() NOT NULL, FirstName VARCHAR (), address V ...
- [No000012D]WPF(5/7)依赖属性
介绍 WPF带来了很多传统 Windows 应用程序没有的新特性和选择.我们已经讨论了一些 WPF 的特性,是时候更进一步介绍其他特性了.当你读完这个系列之前的文章,我希望你已经或多或少地了解了 WP ...
- 使用graalvm.js调用promise
前提 1.JDK1.8 2.引入jar包 <!--graalvm.js --> <dependency> <groupId>org.graalvm.js</g ...
- python与pip安装
# Install pip for 2.7 and then python 2.7 itself sudo apt install python-pip sudo apt install python ...