Hyperledger Fabric 交易过程中读写集语义

https://hyperledger-fabric.readthedocs.io/zh_CN/latest/readwrite.html

交易模拟和读写集

背书节点 在模拟交易期间,会为交易准备一个读写集。读集 包含了模拟期间交易读取的键和键的版本的列表。写集 包含了交易写入键(可以与读取集中的键重叠)的新值。如果交易是删除一个键,该键就会被增加一个删除标识(在新值的位置)。

如果交易多次向同一个键写入数据,只有最后写入的数据会记录下来。同样,如果交易读取一个键的值,就会返回这个键的已提交状态的值,即使读取之前在同一个交易中更新了键值。换句话说,不支持 “读你所写” 的语义。

就像前面所说的,键的版本只记录在读集中;写集只包含键和交易设置的键的最新值。

版本的实现有很多种。版本设计的基本需求是,键不能有重复的版本号。例如单调递增的数字。** 在目前的实现中,我们使用交易所在的区块高度来作为交易中所有修改的键的版本号。** 这样区块中交易的高度通过一个元组来表示(txNumber 是区块中交易的高度)。这种方式比递增的数字有更多好处,主要有,它可以让其他组件比如状态数据库、交易模拟和验证有更多的设计选择。

下边是为模拟一个交易所准备的读写集示例。为了简化说明,我们使用了一个递增的数字来表示版本。

<TxReadWriteSet><NsReadWriteSet name="chaincode1"><read-set><read key="K1", version="1"><read key="K2", version="1"></read-set><write-set><write key="K1", value="V1"><write key="K3", value="V2"><write key="K4", isDelete="true"></write-set></NsReadWriteSet>
<TxReadWriteSet>

另外,如果交易在模拟中执行的是一个范围查询,范围查询和它的结果都会被记录在读写集的 查询信息(query-info) 中。


交易验证和使用读写集更新世界状态

提交节点 使用读写集中的读集来验证交易,使用写集来更新受影响的键的版本和值。

在验证阶段,如果读集中键的版本和世界状态中键的版本一致就认为该交易是 有效的 ,这里我们假设所有之前 有效 的交易(同一个区块中该交易之前的交易)都会被提交(提交状态)。当读写集中包含一个或多个查询信息(query-info)时,需要执行额外的验证。

这种额外的验证需要确保在根据查询信息获得的结果的超集(多个范围的合并)中没有插入、删除或者更新键。 换句话说,如果我们在模拟执行交易期间重新执行任何一个范围,我们应该得到相同的结果。这个检查保证了如果交易在提交期间出了虚项,该交易就会被标记为无效的。这种检查只存在于范围查询中(例如链码中的 GetStateByRange 方法)其他查询中没有实现(例如链码中的 GetQueryResult 方法)。其他查询仍会存在出现虚项的风险,我们应该只在不向排序服务提交的只读交易中使用查询,除非应用程序能保证模拟的结果和验证 / 提交时的结果一致。

如果交易通过了有效性验证,提交节点就会根据写集更新世界状态。在更新阶段,会根据写集更新世界状态中对应的键的值。然后,世界状态中键的版本会更新到最新的版本。


模拟和验证示例

本章节通过示例场景帮助你理解读写集语义。在本例中,k 表示键,在世界状态中表示一个元组 (k,ver,val) , ver 是键 k 的版本, val 是值。

现在假设有五个交易 T1,T2,T3,T4 和 T5 ,所有的交易模拟都基于同一个世界状态的快照。下边的步骤展示了世界状态和模拟这些交易时的读写活动。

World state: (k1,1,v1), (k2,1,v2), (k3,1,v3), (k4,1,v4), (k5,1,v5)
T1 -> Write(k1, v1'), Write(k2, v2')
T2 -> Read(k1), Write(k3, v3')
T3 -> Write(k2, v2'')
T4 -> Write(k2, v2'''), read(k2)
T5 -> Write(k6, v6'), read(k5)

现在,假设这些交易的顺序是从 T1 到 T5(他们可以在同一个区块,也可以在不同区块)

  1. T1 通过了验证,因为它没有执行任何读操作。然后世界状态中的键 k1 和 k2 被更新为 (k1,2,v1'), (k2,2,v2')

  2. T2 没有通过验证,因为它读了键 k1,但是交易 T1 改变了 k1

  3. T3 通过了验证,因为它没有执行任何读操作。然后世界状态中的键 k2 被更新为 (k2,3,v2'')

  4. T4 没有通过验证,因为它读了键 k2,但是交易 T1 改变了 k2

  5. T5 通过了验证,因为它读了键 k5,但是 k5 没有被其他任何交易改变

注意:不支持有多个读写集的交易。

hyperledger fabricread the docs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/606494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【读书笔记】《我的天才女友》

这套书一共有四本&#xff0c;这个是第一本&#xff0c;作者意大利人埃莱娜费兰特&#xff0c;这个只是她的笔名&#xff0c;至今还不知道这位作者是谁&#xff0c;她以每年一本书的速度出了“那不勒斯四部曲”&#xff0c;这四本书以两个女主人公莉拉和莱农的友情为主线。 莉拉…

ElasticSearch 集群搭建与状态监控cerebro

单机的elasticsearch做数据存储&#xff0c;必然面临两个问题:海量数据存储问题、单点故障问题。为了解决存储能力上上限问题就可以用到集群部署。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&#xff0c;存储到多个节点单点故障问题:将分片数据在不同节点备份 (r…

力扣题:高精度运算-1.3

力扣题-1.3 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;43. 字符串相乘 解题思想&#xff1a;类似计算时采用的竖式乘法。首先取得num2的低位&#xff0c;并补齐对应的0&#xff0c;然后与num1进行相乘&#xff0c;然后进行字符串的相加操作。…

腾讯云com域名注册1元条件说明

腾讯云com域名注册优惠价格1元首年&#xff0c;条件是企业新用户&#xff0c;个人新用户注册com域名是33元首年&#xff0c;第二年续费价格85元一年。活动 txybk.com/go/domain-sales 活动打开如下图&#xff1a; 腾讯云com域名注册优惠价格 腾讯云com域名注册原价是85元一年&a…

【初识微服务Cloud-预习】

如果你是公司的一名技术负责人或者技术架构&#xff0c;当公司需要进行技术选型&#xff0c;整个微服务的架构搭建&#xff0c;你会怎么办&#xff1f; 1.Spring cloud NetFlix 一站式解决方案! api网关&#xff0c;zuul 组件Feign — Httpclinet ---- Http通信方式&#xff0…

pytest框架测试用例实现输出log到指定文件

要使用pytest框架将测试用例的输出日志重定向到指定文件&#xff0c;你可以使用Python的内置日志模块和pytest的插件功能。以下是一个简单的示例&#xff0c;展示如何将测试用例的输出日志记录到指定的文件中&#xff1a; 首先&#xff0c;确保你已经安装了pytest。你可以使用以…

搜索docker镜像

要查看Docker镜像库&#xff0c;可以使用docker search命令。 docker search <关键词>例如&#xff0c;如果你想要查找名为nginx的镜像&#xff0c;可以执行以下命令&#xff1a; docker search nginx命令执行后&#xff0c;将会列出所有与关键词nginx相关的Docker镜像…

数据结构—图(下)

文章目录 12.图(下)(4).生成树和最小生成树#1.什么是生成树和最小生成树&#xff1f;i.生成树ii.最小生成树 #2.Prim算法i.算法思想ii.看看例子iii.代码实现 #3.Kruskal算法i.算法思想ii.看看例子iii.代码实现 #4.次小生成树 (5).最短路径问题#1.加权有向图的最短路径问题#2.单…

【QML COOK】- 002-添加一个图片

1. 编辑main.qml import QtQuickWindow {width: 800height: 800visible: truetitle: qsTr("Hello World")Image {anchors.fill: parentsource: "qrc:/Resources/Images/arrow.png"} }将Window的width和height都改成800&#xff0c;因为我们要添加的图片大…

SpringBoot 静态资源映射

文章目录 一、静态资源映射1.1 什么是静态资源映射1.2 常见的静态资源映射方式 二、SpringBooot默认配置2.1 resources 目录2.2 SpringBoot 默认配置 三、SpringBoot手动配置3.1 配置属性3.2 自定义配置类 参考资料 一、静态资源映射 1.1 什么是静态资源映射 资源映射指的是将…

客服系统即时通讯Nginx配置支持WebSocket

如果遇到搭建好客服系统后&#xff0c;发消息不能即时通知推送&#xff0c;那就是webscoket部分没有配置正确 在反向代理的配置块里 增加以下两句 proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";proxy_set_header Upgrade $http…

jenkins设置Jenkinsfile的pipeline脚本 nohup运行

问题 默认情况下&#xff0c;jenkins pipiline 会kill 掉衍生后台的子进程&#xff0c;比如nohup 命令等。 解决 设置环境变量即可。withEnv([‘JENKINS_NODE_COOKIEdontKillMe’]) stage(上传到阿里云OSS) {steps{script {withEnv([JENKINS_NODE_COOKIEdontKillMe]){sh so…

x-cmd pkg | you-get - web 媒体内容下载工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 You-Get 是一个开源的命令行小型下载工具&#xff0c;用于从各种网站下载视频、音频和其他媒体文件。 它可以解析和下载嵌套在网页中的媒体&#xff0c;能从 YouTube、优酷、Niconico 、bilibili 等热门网站下载视频、…

用RASP五步轻松保护云端无服务器架构

近年来无服务器架构发展势头正猛&#xff0c;预计未来十年将增长近25%。据称&#xff0c;2022年无服务器架构市场的规模超过了90亿美元&#xff0c;年复合增长率预计将增加。到2032年&#xff0c;市场规模可能超过900亿美元。 这表明&#xff0c;在组织日益采用DevOps的影响下&…

Python从入门到网络爬虫(日期和时间详解)

Python 日期和时间 Python 程序能用很多方式处理日期和时间&#xff0c;转换日期格式是一个常见的功能。 Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。 时间间隔是以秒为单位的浮点小数。 每个时间戳都以自从1970年1月1日午夜&#xff08;历元&…

Nvidia Jetson AGX Orin使用CAN与底盘通信(ROS C++ 驱动)

文章目录 一、Nvidia Jetson AGX Orin使用CAN通信1.1 CAN使能配置修改GPIO口功能1.2 can收发测试 二、通过CAN协议编写CAN的SocketCan ROS1驱动程序2.1 通讯协议2.2 接收数据节点2.3 发送数据节点2.4 功能包配置 三、ROS2驱动程序 一、Nvidia Jetson AGX Orin使用CAN通信 参考…

Avalonia学习点征集

你对什么内容感兴趣&#xff1f; 你需要集成哪些功能控件&#xff1f; 你需要研究哪些第三方库&#xff1f; 你需要实现什么功能&#xff1f; 我自己写的自己感兴趣的&#xff0c;没有体系。 我自己写太单薄&#xff0c;无法及时更新最新的。 向大家征集学习点。也希望大…

OCS2 入门教程(四)- 机器人示例

系列文章目录 前言 OCS2 包含多个机器人示例。我们在此简要讨论每个示例的主要特点。 System State Dim. Input Dim. Constrained Caching Double Integrator 2 1 No No Cartpole 4 1 Yes No Ballbot 10 3 No No Quadrotor 12 4 No No Mobile Manipul…

问答:攻击面发现及管理

Q1: 长亭云图极速版&#xff08;Cloud Atlas&#xff09;是什么&#xff1f; A1: 它是长亭科技推出的一款攻击面管理运营平台&#xff0c;目的是将企业的网络安全从被动防御转变为主动出击&#xff0c;提前于攻击者采取措施。 Q2: 长亭云图极速版的主要功能包括哪些&#xff…

vue中的防抖和节流

在Vue中&#xff0c;防抖和节流是两种常用的优化技术&#xff0c;用于限制事件的触发频率&#xff0c;以提高页面性能。 防抖&#xff08;Debounce&#xff09;是指在事件被触发后&#xff0c;等待一段时间后再执行回调函数。如果在这段等待时间内&#xff0c;事件又被触发&am…