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 通过了验证,因为它没有执行任何读操作。然后世界状态中的键 k1k2 被更新为 (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.mzph.cn/news/606494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…