Page 292 - 《软件学报》2020年第9期
P. 292

张志威  等:区块链的数据管理技术综述                                                              2913


                以在该阶段之前判断事务不可执行,则可以提前将事务标记为终止状态,从而节省后续阶段的开销.
             基于以上两点,针对区块内事务的顺序问题,文献[75]提出了利用冲突图的方法产生执行顺序的算法.具体
         而言,在冲突图中,图中的一个节点表示一个事务.当两个事务 T i ,T j 存在读写冲突时,相应的事务的点之间存在一
         条有向边 T i ←T j ,表示 T i 应在 T j 之前执行.而一个区块中,代表所有可执行事务的点以及之间的边所构成的图一
         定是冲突图中的一个无环子图,因而作者提出了启发式的算法,在冲突图中,通过查找其中最大的无环图,进而
         产生相应的事务执行顺序的算法.
             同时,针对区块间的事务读写冲突,作者提出分别在模拟阶段与排序阶段判断事务是否可行的机制.如果不
         可行,则事务不需进入到下一个阶段.在模拟阶段,系统的节点需对数据进行读操作.节点的数据都添加了相应
         的版本号.当一个事务的多个读数据的版本号不一致时,则证明部分读入的数据已经被其他事务修改,则该事务
         被标记为不可行.在排序阶段,当两个事务都需读入相同数据且后一事务读入的版本号与前一事务不相同时,则
         后一事务被标记为不可行.其原因在于:Fabric 的事务执行不是以单一事务为单位,而是以区块内所有事务为单
         位,因而区块内事务读入的数据应具有相同的版本号.
             ParBlockchain [76] 以及文献[77]研究了在 Hyperledger Fabric 中事务的并行问题,并针对执行阶段进行优化.
         在 ParBlockchain 的执行阶段,与文献[75]类似,部分节点根据事务的读写冲突建立关系依赖图.图中的节点表示
         事务,并用有向边表示事务的冲突.该图在建立后,被传送到负责排序阶段的节点中.排序节点根据关系依赖图
         确认事务的执行顺序.在执行层面,当多个事务属于不同的应用,或者不同事务之间不存在读写冲突时,则这些
         事务可以并行执行.ParBlockchain 将执行事务的节点按照不同的应用进行分类,一个节点只负责处理一部分应
         用的事务.当需并行执行不同应用的事务时,处理不同应用的节点可并行地执行对应应用的事务.在执行完成之
         后,各个节点广播其执行结果,即可保证所有节点数据的一致性.
             以上工作主要针对的是排序与执行过程.针对验证阶段,文献[78,79]研究针对智能合约验证过程的并发控
         制.智能合约在公有链上的执行一般分为两个阶段:在第 1 个阶段,挖矿节点负责串行的执行智能合约代码并将
         新生成的事务、智能合约的新状态、前一个区块的哈希等均存储在一个新的区块中,之后,该区块会通过挖矿
         节点间的共识,加入到区块链中;在第 2 个阶段,所有网络中的节点会验证该区块内的事务与结果是否与本地的
         数据一致,只有当对应的数据均一致时,该区块才会被节点所接受.因此在第 2 个阶段,智能合约所产生的事务会
         串行的被节点重新执行.文献[78,79]通过不同的机制实现该阶段智能合约的并发验证.在文献[78]中,作者利用
         加锁的方式实现并发控制.对于挖矿节点,其在执行智能合约代码的同时生成 happens-before 图.该图中,每个节
         点代表一个智能合约,节点与节点的边记录智能合约的执行需遵循的先后顺序,该顺序可根据智能合约间的读
         写冲突确定.挖矿节点在生成 happens-before 图之后,将其写在区块内.区块链网络的节点需要验证区块内容时,
         可根据 happens-before 图,确认可以并发执行的智能合约.与文献[78]中加锁机制不同,文献[79]则利用软件事务
         内存(STM)机制来处理智能合约的并发执行.文献[79]将一个智能合约视作一个原子事务,原子事务中包含的操
         作只可能全部执行或者全部取消.在验证过程中,所有智能合约均会按照时间戳的顺序并发地执行.同时,节点
         会检测智能合约之间是否存在读写冲突.当智能合约间存在冲突时,则终止其中一个合约,并在之后重新提交该
         智能合约的事务.文献[80]则研究事务处理的顺序如何满足拜占庭容错.
         3.3   确保一致性的处理技术
             针对事务的一致性,文献[81]提出利用数据库的一致性来处理区块链中并发事务的一致性问题.现有数据
         库可以支持执行多种事务与查询,因而在数据库上建立区块链的一个核心问题是:如何确保所有数据库节点执
         行事务的顺序完全一致,从而可以保证节点数据的一致性.在文献[81]中,为了保证区块链的安全性,作者假定在
         联盟链的环境中,每一个节点均需要对其提交的每一个事务进行签名.其余节点可根据签名验证事务的真实性.
         为提高吞吐量,在确定事务处理顺序时,作者优化了快照隔离的并发控制方法                           [82,83] ,使其从针对事务的并发拓展
         到针对区块的并发,并提出两种针对一般事务的并发控制策略.
             (1)  传统的先排序后执行并发控制.在该方式框架下,系统中的部分节点负责对提交的事务进行验证并排
         序.由于在区块链中,一个区块内的事务需全部执行之后方能完成,当存在写操作时,若采用传统数据库中的快
   287   288   289   290   291   292   293   294   295   296   297