当前位置:首页 » 区块链精品文章 » 正文

5.2 读写集

1974 人参与  2018年10月15日 10:48  分类 : 区块链精品文章  评论

5.2.1 交易模拟和读写集

在背书节点(Endorser)模拟执行交易的过程中,会生成读写集(Read-Write Set)。读集(Read Set)包含了唯一键的列表,还有在模拟执行过程中交易读取的已提交键值。写集(Write Set)也包含了一个唯一键的列表,还有在模拟执行过程中交易写的键值。交易过程中有删除键,它会记录删除标记。如果在一个交易中对同一个键进行了多次更 新,则会以最后一个为准。交易只会读取已提交的数据,即使在交易中更新了某个键的值。就是说,不支持读取本次交易更新后的结果。

读集会包含键的版本,写集只会包含键的最新值。

版本号是使每个键不重复的唯一标识,实现的方法有很多,比如可以采用单调递增的数值来表示。在目前的实现中,采用 的是区块链的高度来表示,一个交易中所有键值修改的版本号都是相同的。高度是一个二元组Heigh(blockNumber,txNuber),其 中,blockNumber是区块号,txNumber是区块内的交易编号。采用区块链高度来表示版本号是有好处的,其他模块,比如状态数据 statedb、交易模拟和验证都能更高效地判断版本号的有效性。

下面是一个读写集的示例,为了描述简单,版本号就用数字来表示:


<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来表示。

5.2.2 交易验证和世界状态更新

提交节点根据读写集中的读集来验证交易,根据写集来更新键的版本和值。

在验证阶段,怎么判断交易的合法性呢?首先,检查读集的版本号,比较在交易中读集里每个键的版本号是否和世界状态 (World State)键的版本号一致。然后,如果读写集包含了query-info,则会检查query-info包含的键是否有变化,比如新增键、更新或者删除 键。要比较在模拟阶段交易进行范围查询的结果是否和验证阶段范围查询的结果是一致的。这能够保证在提交过程中如果出现了幻影项(Phantom Item),交易就会标记为无效。注意幻影保护只实现了范围查询(即链码调用GetStateByRange),没有实现其他查询(比如链码调用 GetQueryResult)。其他查询是有幻影风险的,只能用在不提交给排序服务的只读交易中,除非应用能够保证在模拟阶段和提交阶段结果的稳定性。

如果交易通过了上面的检查,那么提交节点会根据写集来更新世界状态。遍历写集中的每个键,更新世界状态里对应的键值和版本号。

5.2.3 模拟和验证示例

为了便于理解,来看一个例子。假设一个键值对在世界状态里用一个三元组来表示:(k,ver,val),其中,键k最新版本ver的值是val。

有5个交易T1、T2、T3、T4、T5,它们都基于同一个世界状态的快照进行模拟。下面的片段说明的是每个交易的读写集的操作:


世界状态: (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中被修改了。

3)T3检查通过。因为在这个交易里没有任何读操作。更新后世界状态的三元组为:(k2,3,v2'')。

4)T4检查失败。因为交易需要读取的键k2在前面一个交易T1中被修改了。

5)T5检查通过。因为交易需要读取的键k5在前面的交易中没有被修改。

来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=1069

区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>

网站分类

标签列表

最近发表

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

本站资源大部分来自互联网,版权归原作者所有!