本发明属于区块链技术领域,尤其涉及分片(sharding)技术,具体是一种面向联盟链的分片方法。
背景技术:
区块链是一种面向互不可信环境的多方共同维护的分布式账本,具有去中心化、不可篡改、可追溯等特点。然而,作为一种去中心化的拜占庭容错的分布式系统,区块链系统在计算和存储方面的可扩展性较弱,严重制约了系统吞吐,难以满足企业级应用的高吞吐需求。
分片基于分而治之思想,是传统分布式数据库中提高系统计算和存储可扩展的典型方法。它将计算与存储任务分解为相对独立的多个单元,分派到不同服务器,从而提高并发处理能力,使系统整体计算和存储可扩展。
通过分片技术,能提升区块链的整体性能。基于从存储、计算和传输三个维度,区块链分片技术又被细分为状态分片、交易分片和网络分片三个层级。其中网络分片和交易分片相对比较容易,而状态分片最有挑战。目前学术界针对无许可的公有链提出了一些分片方案,而针对有许可的联盟链,一种方案是借用可信硬件sgx将单个分片的拜占庭容错率提升至50%,可在分片规模小的情况下保障分片安全。但还不存在面向联盟链、不依赖于tee(trustedexecutionenvironment)的通用分片方案。
也因此,为了提升联盟链的整体性能,有必要提出一种面向联盟链的安全可靠且不依赖硬件的通用分片技术。
技术实现要素:
本发明的目的是以提高联盟链吞吐率和可扩展性为目标,针对现有技术的缺失,提出一种面向联盟链的分片方法,其包括分片的划分、分片的重组织和跨分片交易的处理三个部分。在分片划分的过程中,首先将联盟链中的节点按逻辑角色划分为执行分片、验证分片和存储分片,通过对执行和验证的解耦合,提高了联盟链整体的吞吐。且只有当执行分片与验证分片均不安全时,才会使得系统整体不安全。在分片重组织的过程中,通过动态分裂分片的方式避免了分片重组织时大量的数据移动,解决了分片重组织时服务不可用的问题。在跨分片交易的处理过程中,通过拜占庭容错的跨分片提交协议保证了跨片交易原子性和安全性。本发明可应用于联盟链,在保证分片后系统整体安全的前提下提高了吞吐率和可扩展性。
实现本发明目的的具体技术方案是:
一种面向联盟链的分片方法,该方法包括以下具体步骤:
步骤1:在有一条主链的基础上,将联盟链中的节点按逻辑角色划分至不同的分片;
具体包括:
步骤a1:联盟链中已存在的主链完成存证、审计,以及所有的跨片交易的协调工作;
步骤a2:联盟链中的节点从逻辑角色上被分为三类:执行节点、验证节点和轻存储节点;
步骤a3:一个节点可承担多种步骤a2所述的逻辑角色;
步骤a4:按节点承担的逻辑角色将节点划分至k个对应的分片;
步骤a5:各个分片独立并行处理联盟链中的交易;
步骤2:确定不同分片所承担的任务和相互间的交互逻辑;具体包括:
步骤b1:将处理交易的整个流程分为共识、验证和存储三个阶段;
步骤b2:执行分片负责共识阶段、验证分片负责验证阶段、存储分片负责存储阶段;
步骤b3:执行分片和验证分片分别与存储分片进行交互;
步骤b4:执行和验证阶段通过流水线并发执行;
所述步骤b2具体包括:
步骤b21:执行分片负责共识后打包区块、并行执行区块中的交易,并将自带读写集的以交易依赖图表示的调度日志保存至存储分片;
步骤b22:验证分片从存储分片读取调度日志,快速回放执行和验证执行结果;
步骤b23:存储分片存储调度日志和被验证后的交易;
步骤3:新节点加入分片时分片通过分裂方式进行重组织;具体包括:
步骤c1:新节点加入时,执行分片和验证分片通过对分片内的节点进行重新分组产生新的分片;
步骤c2:新节点加入时,存储分片通过分裂的方式产生新的分片;具体包括:
步骤c21:假设每个分片中的节点数目的下界为m,上界为2m;
步骤c22:若新节点加入某个分片,未导致该分片的节点数目突破上界,则成为所加入分片的全节点;
步骤c23:若新节点的加入导致该分片节点数目超过上界,则将当前分片分裂为两个等大的分片,使得每个分片的规模都在m与2m之间;
步骤c24:一个节点的加入时发送一笔标识节点加入的交易至分片中,当对应的交易被执行时,新的节点就被加入到分片中;
步骤4:基于分片分裂方式对相应数据进行迁移;具体包括:
步骤d1:原分片中的所有节点产生一个分布式随机数,将该随机数作为种子对所有节点进行重新分片;
步骤d2:重新分片后原始的节点暂不删除不属于自己的分片数据,对外提供接收交易和查询的服务,但不共识出块;
步骤d3:分裂后的两个子分片各自内部进行一次共识,将共识结果广播至全网;
步骤d4:确认子分片完成共识后,原始节点删除不属于自己的分片数据,并将分裂期间收到的交易重新路由至新的子分片;
步骤d5:新的子分片开始共识出块;
步骤5:通过原子性提交协议处理跨片交易;具体包括:
步骤e1:联盟链的主链承担两阶段提交的协调者,对区块进行合法性检查、共识、分发、提交和存证;
步骤e2:主链共识完成以后,区块中的交易被发送到相应的分片进行执行和验证;具体包括:
步骤e21:主链向跨片交易涉及的分片发送准备(prepare)消息;
步骤e22:分片内节点对当前区块达成共识后回复主链同意(agree)消息,并对相应数据项加锁;
步骤e23:主链收齐各分片的同意(agree)消息后,再一次发起共识,对提交的跨片交易消息进行共识;
步骤e24:通过共识后,主链给涉及的分片发送提交(commit)消息,存储分片提交更新,解锁步骤e21中已加锁的相关的数据项;
步骤e25:若某个分片执行子交易失败,则主链收到分片的不同意(disagree)消息时,会再次向涉及的分片发送回滚(rollback)消息,涉及该区块中交易的全部分片都撤销相关的数据修改,中止当前区块的验证,在完成撤销操作后回复主链中止(abort)消息。
本发明的有益效果包括:
基于主链和多个由分片构成的子链的架构将任务拆分,并将节点按逻辑角色分至执行、验证和存储分片中,使分片能独立并行处理各自的交易。
在上述的多分片架构下,通过随机选取分片节点,确保各个分片内部的恶意节点数目不超过共识算法的上限。只有当执行分片和验证分片均不安全时,才会使系统整体不安全,提高了联盟链中的分片安全。且通过对执行和验证的解耦合,使得执行和验证可以完全流水线并行,进一步提高系统吞吐率。执行分片并发执行当前区块中的所有交易,传输并发调度日志给验证节点,验证分片通过高效回放并发调度日志来执行和验证交易,如验证不通过则触发审计,进一步保证分片的安全性。
动态分裂的分片重组织方式解决了新节点加入分片时的状态变化和数据迁移,保证数据访问服务在分片重组织的过程中平滑过渡,克服了数据服务短时间不可用的问题。
主链协调的跨片交易通过两阶段提交协议保证了跨片交易的原子性和安全性。
附图说明
图1是本发明涉及的面向联盟链基于主链和多分片的系统架构示意图;
图2是本发明分片重组织时,新加入节点未导致该分片的节点数目突破上界,分片进行分裂的流程示意图;
图3是本发明分片重组织时,新加入节点导致该分片的节点数目突破上界,分片进行分裂的流程示意图;
图4是本发明分裂具体步骤的流程示意图;
图5是本发明主链协调跨片交易,跨片交易成功提交的流程示意图;
图6是本发明主链协调跨片交易,跨片交易失败中止的流程示意图。
具体实施方式
结合以下具体实施例和附图,对本发明作进一步的详细说明。实施本发明的过程、条件、实验方法等,除以下专门提及的内容之外,均为本领域的普遍知识和公知常识,本发明没有特别限制内容。
实施例
本实施例是在联盟链系统实施的一种分片方法。
图1是本发明提出的系统架构。该图描述了主链和分片间的交互方式。主链主要完成存证、审计以及所有的跨片交易的协调工作,子链(即分片)独立并行处理各自的交易。且在图1中,将隶属于子链的节点从逻辑角色上被分为三类,包括执行节点、验证节点和在线轻存储节点,执行节点、验证节点和在线轻存储节点各自独立分片。其中执行节点和验证节点是无状态的,执行节点和验证节点通过在线轻存储节点进行交互。执行节点承担执行和共识的任务,对区块内交易并行执行,并将共识签名后的带证明的并发执行调度日志,写入在线轻节点存储。验证节点从在线轻存储节点读取调度日志快速回放,并进行验证,验证通过则将最终结果写回在线轻存储节点,若验证不通过,则触发审计。
需要说明的是,执行分片和验证分片各自需要独立共识,由于数据读取可以通过之前写入的签名证明来进行验证,因此存储分片的共识可以异步完成,在线轻存储节点异步共识结束以后,将一致性检查点保存至主链存证,方便上层应用的数据读取。并且一旦验证分片验证通过,最终状态数据得到确认,在线存储分片上的读写集即可删除。
轻存储节点中验证通过的数据异步写入最底层的持久化存储引擎,持久化存储引擎采用纠删码进行编码分片存储,每个单个的节点可以逻辑恢复出整条链的所有数据,是一个拜占庭容错的可扩展存储引擎。从逻辑上看,持久化存储引擎保存两类区块链数据,一类是各个分片维护的子链,其中各个子链数据相互独立;另外一类是主链数据,其中包括配置、审计和存证等管理类信息。
分片重组织采用对存储分片进行分裂的方案来产生新的分片。每个分片中的节点数目的下界为m,上界为2m。图2和图3中m值为2。
图2描述了当新节点加入某个分片,未导致该分片的节点数目突破上界,则新节点成为所加入分片的全节点,无需任何操作。
图3描述了当新节点加入某个分片,导致该分片的结点数超过上界,则当前分片分裂为两个等大的分片,使得每个分片的规模都在m与2m之间,图3中分裂后的每个分片规模在2到4个节点之间。
需要说明的是,每一个节点的加入都需要发送一笔标识节点加入的交易至分片中,当对应的交易被执行时,新的节点就被加入到分片中。此时区块高度就类似于一个逻辑时钟,每个节点都是在同一区块高度加入新的节点。
具体的分裂过程包括步骤s301-s304如图4所示:
s301,所述原分片中的所有节点产生一个分布式随机数,将该随机数作为种子对所有节点进行重新分片。
s302,分裂后状态也会进行分片,为确保状态分片安全,分片后原始的节点暂不删除不属于自己的分片数据,仍然对外提供接收交易和查询的服务,但不共识出块。
s303,两个子分片各自内部进行一次共识,将共识结果广播至全网,以告知本子分片已经确认好各节点状态,可以独立工作。
s304,当子分片确认其它子分片完成共识后,原始节点删除原分片中不属于当前子分片的数据,然后将分裂期间收到的交易重新路由至新的子分片,此时新的子分片可以开始共识出块。
需要说明的是,s302可以保证数据访问服务在重分片的过程中平滑过渡,克服数据服务短时间不可用的问题。
图5描述了跨片交易成功提交的过程,主链向跨片交易涉及的分片发送准备(prepare)消息,分片内节点对当前区块达成共识后回复主链同意(agree)消息,并对相应数据项加锁,主链收齐各分片的同意(agree)消息后,再一次发起共识,对提交的跨片交易消息进行共识,通过共识后,主链给涉及的分片发送提交(commit)消息,存储分片提交更新,解锁已加锁的相关的数据项。
图6描述了跨片交易失败中止的过程,主链向跨片交易涉及的分片发送准备(prepare)消息,此时若某个分片执行子交易失败,则主链收到分片的不同意(disagree)消息时,会再次向涉及的分片发送回滚(rollback)消息,涉及该区块中交易的全部分片都撤销相关的数据修改,中止当前区块的验证,在完成撤销操作后回复主链中止(abort)消息
需要说明的是,主链来承担两阶段提交的协调者,并且传统两阶段提交中节点失败问题在本发明的架构中不会出现,即协调者和其他参与者都不会宕机或被攻破,这是因为每个分片都通过共识算法来保证安全性。跨片交易需要通过主链进行合法性检查、共识、分发、提交和存证。在主链共识完成以后,涉及跨片的交易被发送到相应的分片进行执行与验证。
本发明的保护内容不局限于以上实施例。在不背离发明构思的精神和范围下,本领域技术人员能够想到的变化和优点都被包括在本发明中,并且以所附的权利要求书为保护范围。