本公开内容属于区块链技术领域,尤其涉及基于dag的区块链的账本同步方法以及基于dag的区块链的账本同步设备。
背景技术:
有向无环图(directedacyclicgraph,dag)结构的区块链系统作为一种分布式账本的实现,提供了相较于传统链式区块链更强大的并发处理能力,是分布式账本的前沿技术。
在基于dag的区块链中,后一个区块(交易块或定序块)在产生的过程中需要链接一个或多个已知的前置区块(例如,交易块或定序块),区块头中包含了两个前置区块的哈希值,使得整个账本呈现出一种网状的结构。该链接动作可以并发执行,同一个前置区块可以被多个后置区块同时链接。网络中所有运行的节点都拥有该基于dag的区块链的完整副本,从而能够达成账本结构上的共识。
然而,现有的基于dag的区块链中,当任一新加入的区块链节点不具备完整的区块链副本时,需要从相邻节点处进行复原和同步。由于基于dag的区块链是一种单向的结构,根据其产生的方式,后一区块记录前一区块的哈希值,但前一区块并不记录后一区块的哈希值,且整个网络不严格有序,使得对于dag账本的复原工作比较困难。
在现有技术中,对于基于dag的区块链的账本复原主要采用递归的方式进行前置交易的追溯获取。区块链节点通过广播的方式接收到最新的区块后,判断本地是否已经获取到了该交易的前置交易。如果没有,则向相邻节点请求该交易。如果已经获取到了,则递归检查该前置交易的前置交易,直到追溯到创世块(也即,第一个定序块)为止。受制于链接的单向性,无法从创世块开始批量获取后置交易,网络中也没有显著的区域性可供划分并批量传输,因此对于一个全新的节点而言,账本的复原涉及非常多的往返通信,耗费大量的时间。
技术实现要素:
由于目前市场上的基于dag的区块链基本都是采用递归追溯的方式进行前置交易的追溯获取,因此,对于一个全新的节点而言,账本的复原涉及非常多的往返通信,耗费大量的时间。
针对上述问题,本公开内容的第一方面提出了一种基于dag的区块链的账本同步方法,其中,所述基于dag的区块链包括多个交易块以及一个或多个定序块,并且每一个交易块直接引用其它的交易块或定序块,每一个定序块直接引用交易块或其它定序块,每一个定序块将其直接引用的交易块以及间接引用的一部分交易块进行确定化,所述定序块至少包括定序块id,每一个定序块的定序块id都是按照生成时间顺序依次递增的序号,所述方法包括:
接收第一区块链节点所存储的第一定序块的定序块id,其中,所述第一定序块是所述第一区块链节点所存储的定序块id的序号值最高的定序块;
确定本地存储的第二定序块的定序块id是否小于所述第一定序块的定序块id,其中,所述第二定序块是本地存储的定序块id的序号值最高的定序块;
在确定所述第二定序块的定序块id小于所述第一定序块的定序块id的情况下,向所述第一区块链节点发送第一同步请求,其中,所述第一同步请求至少包括请求获得存储在所述第一区块链节点中的、比所述第二定序块的定序块id大的所有定序块以及其所确定化的所有交易块;
接收与所述第一同步请求相对应的定序块以及交易块。
根据本公开内容的第一方面,在接收与所述第一同步请求相对应的定序块以及交易块之后,所述方法进一步包括:
确定所接收到的最高的定序块id是否等于所述第一定序块的定序块id;
在确定所接收到的最高的定序块id小于所述第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块;
接收与所述第二同步请求相对应的定序块以及交易块。
根据本公开内容的第一方面,在所述第一区块链节点所存储的第一定序块的定序块id发生改变的情况下,所述方法进一步包括:
在接收与所述第一同步请求相对应的定序块以及交易块之后,确定所接收到的最高的定序块id是否等于最新的第一定序块的定序块id;
在确定所接收到的最高的定序块id小于所述最新的第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块;
接收与所述第二同步请求相对应的定序块以及交易块。
根据本公开内容的第一方面,在所述第二定序块的定序块id与所述第一定序块的定序块id相同的情况下,所述方法进一步包括:
针对本地存储的所有第一类交易块,生成长度为m的第一比特数组,其中,所述第一类交易块是还未被定序块确定化的交易块,10000≤m≤100000并且m是整数;
接收来自所述第一区块链节点的长度为m的第二比特数组,其中,所述第二比特数组是针对所述第一区块链节点中存储的所有第一类交易块所生成的比特数组;
确定所述第一比特数组是否与所述第二比特数组相同;
在确定所述第一比特数组与所述第二比特数组不同的情况下,确定所述第一区块链节点存储的但本地未存储的一个或多个第一类交易块;
向所述第一区块链节点发送第三同步请求,其中,所述第三同步请求至少包括请求获得所述第一区块链节点中存储的但本地未存储的一个或多个第一类交易块;
接收与所述第三同步请求相对应的交易块。
根据本公开内容的第一方面,针对所有第一类交易块,生成长度为m的第一比特数组或第二比特数组进一步包括:
针对本地存储的或所述第一区块链节点存储的每一个第一类交易块,利用所述第一类交易块进行k个哈希函数运算,以得到k个哈希值:h1(x)、h2(x),…,hk(x),其中,5≤k≤10并且k是整数,x是所述交易块的块内容或块哈希,并且0≤hy(x)≤m(y=1,2,…,k并且hy(x)是整数);
生成长度为m的源比特数组,并且将所述源比特数组的每一个位按照顺序进行编号以形成位序号;
确定与每一个第一类交易块的每一个哈希值相等的所述位序号;
将所述源比特数组中与所确定的位序号相对应的位的值设定为1,以生成长度为m的第一比特数组或第二比特数组。
根据本公开内容的第一方面,在确定所述第一比特数组与所述第二比特数组不同的情况下,确定所述第一区块链节点存储的但本地未存储的交易块进一步包括:
将所述第一比特数组中的每一位的值与所述第二比特数组中的相应位的值进行比较,以将在二者之间存在的具有不同值的位所对应的位序号作为差异位序号;
基于所述差异位序号,确定所述第一区块链节点中存储的但本地未存储的一个或多个哈希值;
基于所述一个或多个哈希值以及所述第一区块链节点中存储的每一个第一类交易块的所有哈希值,确定所述第一区块链节点中存储的但本地未存储的第一类交易块。
根据本公开内容的第一方面,在本地存储的任一交易块未在本地查找到其直接引用或间接引用的交易块或定序块,或者本地存储的任一定序块未在本地查找到其直接引用或间接引用的交易块或定序块的情况下,所述方法进一步包括:
基于本地存储的交易块或定序块的头部信息,确定未查找到的其直接引用或间接引用的交易块或定序块的块哈希;
基于所述块哈希生成第四同步请求;
向所述第一区块链节点发送所述第四同步请求;
在所述第一区块链节点存储与所述第四同步请求相对应的交易块或定序块的情况下,接收来自第一区块链节点的相应的交易块或定序块。
针对上述问题,本公开内容的第一方面提出了一种基于dag的区块链的账本同步设备,其中,所述基于dag的区块链包括多个交易块以及一个或多个定序块,并且每一个交易块直接引用其它的交易块或定序块,每一个定序块直接引用交易块或其它定序块,每一个定序块将其直接引用的交易块以及间接引用的一部分交易块进行确定化,所述定序块至少包括定序块id,每一个定序块的定序块id都是按照生成时间顺序依次递增的序号,所述设备包括:
处理器;以及
存储器,其用于存储指令,当所述指令执行时使得所述处理器执行以下操作:
接收第一区块链节点所存储的第一定序块的定序块id,其中,所述第一定序块是所述第一区块链节点所存储的定序块id的序号值最高的定序块;
确定本地存储的第二定序块的定序块id是否小于所述第一定序块的定序块id,其中,所述第二定序块是本地存储的定序块id的序号值最高的定序块;
在确定所述第二定序块的定序块id小于所述第一定序块的定序块id的情况下,向所述第一区块链节点发送第一同步请求,其中,所述第一同步请求至少包括请求获得存储在所述第一区块链节点中的、比所述第二定序块的定序块id大的所有定序块以及其所确定化的所有交易块;
接收与所述第一同步请求相对应的定序块以及交易块。
根据本公开内容的第二方面,在接收与所述第一同步请求相对应的定序块以及交易块之后,当所述指令执行时使得所述处理器进一步执行以下操作:
确定所接收到的最高的定序块id是否等于所述第一定序块的定序块id;
在确定所接收到的最高的定序块id小于所述第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块;以及
接收与所述第二同步请求相对应的定序块以及交易块。
根据本公开内容的第二方面,在所述第一区块链节点所存储的第一定序块的定序块id发生改变的情况下,当所述指令执行时使得所述处理器进一步执行以下操作:
在接收与所述第一同步请求相对应的定序块以及交易块之后,确定所接收到的最高的定序块id是否等于最新的第一定序块的定序块id;
在确定所接收到的最高的定序块id小于所述最新的第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块;以及
接收与所述第二同步请求相对应的定序块以及交易块。
根据本公开内容的第二方面,在所述第二定序块的定序块id与所述第一定序块的定序块id相同的情况下,当所述指令执行时使得所述处理器进一步执行以下操作:
针对本地存储的所有第一类交易块,生成长度为m的第一比特数组,其中,所述第一类交易块是还未被定序块确定化的交易块,10000≤m≤100000并且m是整数;
接收来自所述第一区块链节点的长度为m的第二比特数组,其中,所述第二比特数组是针对所述第一区块链节点中存储的所有第一类交易块所生成的比特数组;
确定所述第一比特数组是否与所述第二比特数组相同;
在确定所述第一比特数组与所述第二比特数组不同的情况下,确定所述第一区块链节点存储的但本地未存储的一个或多个第一类交易块;
向所述第一区块链节点发送第三同步请求,其中,所述第三同步请求至少包括请求获得所述第一区块链节点中存储的但本地未存储的一个或多个交易块;
接收与所述第三同步请求相对应的交易块。
根据本公开内容的第二方面,针对所有第一类交易块,生成长度为m的第一比特数组或第二比特数组进一步包括:
针对本地存储的或所述第一区块链节点存储的每一个第一类交易块,利用所述第一类交易块进行k个哈希函数运算,以得到k个哈希值:h1(x)、h2(x),…,hk(x),其中,5≤k≤10并且k是整数,x是所述交易块的块内容或块哈希,并且0≤hy(x)≤m(y=1,2,…,k并且hy(x)是整数);
生成长度为m的源比特数组,并且将所述源比特数组的每一个位按照顺序进行编号以形成位序号;
确定与每一个第一类交易块的每一个哈希值相等的所述位序号;
将所述源比特数组中与所确定的位序号相对应的位的值设定为1,以生成长度为m的第一比特数组或第二比特数组。
根据本公开内容的第二方面,在确定所述第一比特数组与所述第二比特数组不同的情况下,确定所述第一区块链节点存储的但本地未存储的交易块进一步包括:
将所述第一比特数组中的每一位的值与所述第二比特数组中的相应位的值进行比较,以将在二者之间存在的具有不同值的位所对应的位序号作为差异位序号;
基于所述差异位序号,确定所述第一区块链节点中存储的但本地未存储的一个或多个哈希值;
基于所述一个或多个哈希值以及所述第一区块链节点中存储的每一个第一类交易块的所有哈希值,确定所述第一区块链节点中存储的但本地未存储的交易块。
根据本公开内容的第二方面,在本地存储的任一交易块未在本地查找到其直接引用或间接引用的交易块或定序块,或者本地存储的任一定序块未在本地查找到其直接引用或间接引用的交易块或定序块的情况下,当所述指令执行时使得所述处理器进一步执行以下操作:
基于本地存储的交易块或定序块的头部信息,确定未查找到的其直接引用或间接引用的交易块或定序块的块哈希;
基于所述块哈希生成第四同步请求;
向所述第一区块链节点发送所述第四同步请求;以及
在所述第一区块链节点存储与所述第四同步请求相对应的交易块或定序块的情况下,接收来自第一区块链节点的相应的交易块或定序块。
依据本公开内容的基于dag的区块链的账本同步方法及设备能够通过向基于dag的区块链中加入定期产生的定序块,使得位于不同定序块区间内的区块能够被定义顺序,相同顺序的交易可以被批量同步;另外,对于处于最新定序块之后的区块,本公开内容提出了基于布隆过滤器的账本增量同步方式,避免了递归获取交易的高额时间和通信成本,极大地改善了区块同步的性能。
附图说明
结合附图并参考以下详细说明,本公开的各实施例的特征、优点及其他方面将变得更加明显,在此以示例性而非限制性的方式示出了本公开的若干实施例,在附图中:
图1为依据本公开内容的基于dag的区块链的账本同步方法的实施例之一的流程图;
图2为依据本公开内容的基于dag的区块链的账本同步方法的实施例之二的流程图;
图3为依据本公开内容的基于dag的区块链的结构示意图;以及
图4示出了依据本公开内容的基于dag的区块链的账本同步设备的示意图。
具体实施方式
以下参考附图详细描述本公开的各个示例性实施例。附图中的流程图和框图示出了根据本公开的各种实施例的方法和系统的可能实现的体系架构、功能和操作。应当注意,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,所述模块、程序段、或代码的一部分可以包括一个或多个用于实现各个实施例中所规定的逻辑功能的可执行指令。也应当注意,在有些作为备选的实现中,方框中所标注的功能也可以按照不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,或者它们有时也可以按照相反的顺序执行,这取决于所涉及的功能。同样应当注意的是,流程图和/或框图中的每个方框、以及流程图和/或框图中的方框的组合,可以使用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以使用专用硬件与计算机指令的组合来实现。
本文所使用的术语“包括”、“包含”及类似术语应该被理解为是开放性的术语,即“包括/包含但不限于”,表示还可以包括其他内容。术语“基于”是“至少部分地基于"。术语“一个实施例”表示“至少一个实施例”;术语“另一实施例”表示“至少一个另外的实施例”,等等。
对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为说明书的一部分。对于附图中的各单元之间的连线,仅仅是为了便于说明,其表示至少连线两端的单元是相互通信的,并非旨在限制未连线的单元之间无法通信。
本公开内容的实施例主要关注以下技术问题:在基于dag的区块链网络中所有运行的节点都拥有该dag账本的完整副本,从而能够达成账本结构上的共识。在一个节点并不具备完整副本时,需要从相邻节点处进行复原和同步。由于dag是一种单向的图结构,根据其产生的方式,后一区块(例如,交易块或定序块)记录前一区块(例如,交易块或定序块)的哈希值,但前一区块并不记录后一区块的哈希值,且整个网络不严格有序,使得对于dag账本的复原工作比较困难。
为了解决上述问题,本公开内容通过基于dag的区块链中加入定期产生的定序块,使得位于不同定序块区域内的交易块能够被确定化(也即,具有相同的交易高度),并使得具有相同交易高度的交易块可以被批量同步。对于处于最新定序块之后的区块(例如,交易块),本公开内容还提出了一种基于布隆过滤器的账本增量同步方式,避免了递归获取交易的高额时间和通信成本,极大地改善了区块(或账本)同步的性能。
图1示出了基于dag的区块链的账本同步方法的示例性流程图。
在本公开内容中,所述基于dag的区块链包括多个交易块以及一个或多个定序块,并且每一个交易块直接引用其它的交易块或定序块,每一个定序块直接引用交易块或其它定序块,每一个定序块将其直接引用的交易块以及间接引用的一部分交易块进行确定化,所述定序块至少包括定序块id,每一个定序块的定序块id都是按照生成时间顺序依次递增的序号。
如图3所示,基于dag的区块链的结构中,后一个区块(例如,交易块或定序块)在产生的过程中需要链接一个或多个已知的前置区块(例如,交易块、定序块和/或创世块),一般的区块的头部信息中包含了两个前置区块的哈希值,使得整个账本呈现出一种网状的结构。在本公开内容中,交易块的头部信息中除了其两个前置区块的哈希值之外至少还包括交易高度、交易类型、源账户信息、目的账户信息等。
在本公开内容中,网络定期通过常见共识的方式(例如,工作量证明(powerofworking,简称pow)、权益证明(powerofstake,简称pos)、代理权益证明(delegatedproofofstake,简称dpos)、实用拜占庭容错(practicalbyzantinefaulttolerance,简称pbft)等)生成并广播一个定序块;定序块的头部信息中除了其两个前置区块的哈希值之外至少还包括交易高度、严格有序递增的定序块id、交易顺序等信息。在本公开内容中,基于dag的区块链中的第一个区块被称为创世块,其是定序块id的序号为0的定序块。
在图3中可以看到序号为0的定序块(也即,创世块),以及定序块seq1、seq2、seq3(其定序块id分别是1、2、3),并且每一个定序块都能对一部分交易块进行确定化操作,例如,如图3所示,定序块seq1确定化了区域(1)中的多个交易块,使得定序块seq1的交易高度(也即定序块id)与被其确定化的每一个交易块的交易高度相同;定序块seq2确定化了区域(2)中的多个交易块,使得定序块seq2的交易高度(也即定序块id)与被其确定化的每一个交易块的交易高度相同;定序块seq3确定化了区域(3)中的多个交易块,使得定序块seq3的交易高度(也即定序块id)与被其确定化的每一个交易块的交易高度相同。
在本实施例中,任意区块链节点(在本公开内容中可以称为“本地区块链节点”)可以实施图1所示的方法,具体如下:
步骤110:接收第一区块链节点所存储的第一定序块的定序块id。其中,所述第一定序块是所述第一区块链节点所存储的定序块id的序号值最高的定序块。
例如,当第一区块链节点中存储了定序块id分别等于0,1,2,3,4,5的定序块时,所述第一定序块是定序块id=5的定序块。
步骤120:确定本地存储的第二定序块的定序块id是否小于第一定序块的定序块id。其中,所述第二定序块是本地存储的定序块id的序号值最高的定序块。
例如,当本地区块链节点中存储了定序块id分别等于0,1,2,3的定序块时,所述第二定序块是定序块id=3的定序块。
步骤130:在确定第二定序块的定序块id小于第一定序块的定序块id的情况下,向第一区块链节点发送第一同步请求。其中,所述第一同步请求至少包括请求获得存储在所述第一区块链节点中的、比第二定序块的定序块id大的所有定序块以及其所确定化的所有交易块。
例如,在上述实施例中,本地区块链节点向第一区块链节点发送的第一同步请求中包括请求获得定序块id=4和5的定序块以及这些定序块所确定化的所有交易块。
步骤140:接收与所述第一同步请求相对应的定序块以及交易块。
在本公开内容中,本地区块链节点可以按照定序块id的顺序依次发出多个第一同步请求。例如,在上述实施例中,本地区块链节点首先发出的第一同步请求仅包括请求获得定序块id=4的定序块及其所确定化的交易块;在接收到相应的定序块及其所确定化的交易块的情况下,本地区块链节点再发出的第一同步请求仅包括请求获得定序块id=5的定序块及其所确定化的交易块,接着从第一区块链节点中接收相应的定序块及其所确定化的交易块。
在步骤140之后,区块链节点还进行如下操作:
第一,确定所接收到的最高的定序块id是否等于所述第一定序块的定序块id。
第二,在确定所接收到的最高的定序块id小于所述第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块。
第三,接收与所述第二同步请求相对应的定序块以及交易块。
在本公开内容中上述步骤用于确保本地区块链节点能够同步获得第一区块链中存储的但本地区块链节点中未存储的所有定序块及相应的交易块。
此外,在所述第一区块链节点所存储的第一定序块的定序块id发生改变的情况下,区块链节点还可以执行如下步骤:
首先,在接收与所述第一同步请求相对应的定序块以及交易块之后,确定所接收到的最高的定序块id是否等于最新的第一定序块的定序块id。
其次,在确定所接收到的最高的定序块id小于所述最新的第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块。
例如,当第一区块链节点所存储的第一定序块的定序块id=7时,则经过步骤140之后本地区块链节点所接收到的最高的定序块id=5,那么本地区块链节点需要向第一区块链节点发送第二同步请求,以请求获得定序块id=6,7的定序块及其所确定化的交易块。
最后,接收与所述第二同步请求相对应的定序块以及交易块。
图1所公开的实施例是在本地区块链节点与第一区块链节点之间存在定序块id序号差异的情况,使得本地区块链节点全量同步获得第一区块链节点的相应区块的过程。所公开的实施例能够避免采用递归方式获取区块的高额时间和通信成本。
另外,如图2所示,在所述第二定序块的定序块id与所述第一定序块的定序块id相同的情况下,还需要采用布隆过滤器技术实现增量同步区块,本地区块链节点具体执行如下步骤:
步骤210:针对本地存储的所有第一类交易块,生成长度为m的第一比特数组。其中,所述第一类交易块是还未被定序块确定化的交易块,10000≤m≤100000并且m是整数。
在本公开内容中,针对所有第一类交易块,生成长度为m的第一比特数组或第二比特数组进一步包括:
第一,针对本地存储的或所述第一区块链节点存储的每一个第一类交易块,利用所述第一类交易块进行事先约定的k个哈希函数运算,以得到k个哈希值:h1(x)、h2(x),…,hk(x),其中,5≤k≤10并且k是整数,x是所述交易块的块内容或块哈希,并且0≤hy(x)≤m(y=1,2,…k并且hy(x)是整数)。
第二,生成长度为m的源比特数组,并且将所述源比特数组的每一个位按照顺序进行编号以形成位序号。
在本实施例中,所生成的源比特数组中的每一位初始设定值都设定为0。
第三,确定与每一个第一类交易块的每一个哈希值相等的所述位序号。
第四,将所述源比特数组中与所确定的位序号相对应的位的值设定为1,以生成长度为m的第一比特数组或第二比特数组。
例如,某个区块链节点中的某个第一类交易块的哈希值分别0,3,5,7,300,另一个第一类交易块的哈希值分别1,25,100,107,300,则所生成的比特数组的第0位、第3位、第5位、第7位、第300位、第1位、第25位、第100位、第107位的值均为1。
本公开采用哈希函数与布隆过滤器技术的结合,实现了确定任一区块链节点(例如,第一区块链节点或本地区块链节点)所存储的具体每一个第一类交易块。
步骤220:接收来自所述第一区块链节点的长度为m的第二比特数组。其中,所述第二比特数组是针对所述第一区块链节点中存储的所有第一类交易块所生成的比特数组。
步骤230:确定所述第一比特数组是否与所述第二比特数组相同。
步骤240:在确定所述第一比特数组与所述第二比特数组不同的情况下,确定所述第一区块链节点存储的但本地未存储的一个或多个第一类交易块。
本步骤具体包括:
首先,将所述第一比特数组中的每一位的值与所述第二比特数组中的相应位的值进行比较,以将在二者之间存在的具有不同值的位所对应的位序号作为差异位序号。
其次,基于所述差异位序号以及所述第一区块链节点中存储的每一个第一类交易块的所有哈希值,确定所述第一区块链节点中存储的但本地未存储的一个或多个哈希值。
最后,基于所述一个或多个哈希值以及所述第一区块链节点中存储的每一个第一类交易块的所有哈希值,确定所述第一区块链节点中存储的但本地未存储的第一类交易块。
例如,第一比特数组中的第0、1、3、5、7、25、100、107以及300位分别等于1,第二比特数组中的第0、1、3、5、7、25、100、107、251、295以及300位分别等于1;则可以确定第一比特数组与第二比特数组的差异位序号是第251及295位。然后查看第一区块链节点中存储的哪一个或多个第一类交易块的哈希值等于251或295;在找到一个或多个相应的第一类交易块的情况下,确定这些第一类交易块即是本地区块链节点未存储的第一类交易块。
步骤250:向所述第一区块链节点发送第三同步请求。其中,所述第三同步请求至少包括请求获得所述第一区块链节点中存储的但本地未存储的一个或多个第一类交易块。
步骤260:接收与所述第三同步请求相对应的交易块。
第一区块链节点采用与步骤220-260类似的方式从本地区块链节点中获得其未存储但本地区块链节点中已存储的交易块。
本公开内容所公开的基于布隆过滤器增量同步基于dag的区块链区块技术,能够显著地缩小增量同步过程中的消息往来次数和大小。例如,当需要同步10000个本地区块链节点未存储的区块(n=10000)时,如果选择k=8个哈希函数,则仅需要传输558,962比特(68kb),即能将第一区块链节点是否拥有每一个区块的信息传输给本地区块链节点,并且假阳性率(也即,自身未存储但被认为已存储的区块的概率)小于0.00001%,具体算法如下:
p=pow(1-exp(-k/(m/n)),k);
其中,p——假阳性率;n——需要同步的区块数量;m——比特数组的长度。
并且,假阴性率(也即,自身已存储但被认为未存储的区块的概率)为0。与现有的普通同步策略相比,根据网络结构的情况(例如,基于dag的区块链),需要往返通信至少log2(10000)-1=12次,最多9999次;而本公开仅需要进行1次往返通信即可获取到99.99999%的缺失交易。
另外,在本公开内容中,当本地存储的任一交易块未在本地查找到其直接引用或间接引用的交易块或定序块,或者本地存储的任一定序块未在本地查找到其直接引用或间接引用的交易块或定序块时,区块链节点执行如下步骤:
首先,基于本地存储的交易块或定序块的头部信息,确定未查找到的其直接引用或间接引用的交易块或定序块的块哈希。
其次,基于所述块哈希生成第四同步请求。
再次,向所述第一区块链节点发送所述第四同步请求。
第四,在所述第一区块链节点存储与所述第四同步请求相对应的交易块或定序块的情况下,接收来自第一区块链节点的相应的交易块或定序块。
上述实施例是对于本地区块链节点经过上述的全量同步、增量同步之后仍然未能够同步得到的区块,继续采用传统的递归追溯方式从第一区块链节点中同步获得。
图4示出了基于dag的区块链的账本同步设备400的示意性框图。该账本同步设备400至少包括处理器410和存储器420,其中,存储器420中存储有指令,该指令在由处理器410执行时使得处理器410执行以下动作:
接收第一区块链节点所存储的第一定序块的定序块id,其中,所述第一定序块是所述第一区块链节点所存储的定序块id的序号值最高的定序块;
确定本地存储的第二定序块的定序块id是否小于所述第一定序块的定序块id,其中,所述第二定序块是本地存储的定序块id的序号值最高的定序块;
在确定所述第二定序块的定序块id小于所述第一定序块的定序块id的情况下,向所述第一区块链节点发送第一同步请求,其中,所述第一同步请求至少包括请求获得存储在所述第一区块链节点中的、比所述第二定序块的定序块id大的所有定序块以及其所确定化的所有交易块;
接收与所述第一同步请求相对应的定序块以及交易块。
在依据本公开内容的一个实施例中,在接收与所述第一同步请求相对应的定序块以及交易块之后,当所述指令执行时使得所述处理器410进一步执行以下操作:
确定所接收到的最高的定序块id是否等于所述第一定序块的定序块id;
在确定所接收到的最高的定序块id小于所述第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块;以及
接收与所述第二同步请求相对应的定序块以及交易块。
在依据本公开内容的一个实施例中,在所述第一区块链节点所存储的第一定序块的定序块id发生改变的情况下,当所述指令执行时使得所述处理器410进一步执行以下操作:
在接收与所述第一同步请求相对应的定序块以及交易块之后,确定所接收到的最高的定序块id是否等于最新的第一定序块的定序块id;
在确定所接收到的最高的定序块id小于所述最新的第一定序块的定序块id的情况下,向所述第一区块链节点发送第二同步请求,其中,所述第二同步请求至少包括请求获得比所接收到最高的定序块id大的所有定序块以及其所确定化的所有交易块;以及
接收与所述第二同步请求相对应的定序块以及交易块。
在依据本公开内容的一个实施例中,在所述第二定序块的定序块id与所述第一定序块的定序块id相同的情况下,当所述指令执行时使得所述处理器进一步执行以下操作:
针对本地存储的所有第一类交易块,生成长度为m的第一比特数组,其中,所述第一类交易块是还未被定序块确定化的交易块,10000≤m≤100000并且m是整数;
接收来自所述第一区块链节点的长度为m的第二比特数组,其中,所述第二比特数组是针对所述第一区块链节点中存储的所有第一类交易块所生成的比特数组;
确定所述第一比特数组是否与所述第二比特数组相同;
在确定所述第一比特数组与所述第二比特数组不同的情况下,确定所述第一区块链节点存储的但本地未存储的一个或多个交易块;
向所述第一区块链节点发送第三同步请求,其中,所述第三同步请求至少包括请求获得所述第一区块链节点中存储的但本地未存储的一个或多个第一类交易块;
接收与所述第三同步请求相对应的交易块。
在依据本公开内容的一个实施例中,针对所有第一类交易块,生成长度为m的第一比特数组或第二比特数组进一步包括:
针对本地存储的或所述第一区块链节点存储的每一个第一类交易块,利用所述第一类交易块进行k个哈希函数运算,以得到k个哈希值:h1(x)、h2(x),…,hk(x),其中,5≤k≤10并且k是整数,x是所述交易块的块内容或块哈希,并且0≤hy(x)≤m,y=1,2,…k并且hy(x)是整数;
生成长度为m的源比特数组,并且将所述源比特数组的每一个位按照顺序进行编号以形成位序号;
确定与每一个第一类交易块的每一个哈希值相等的所述位序号;
将所述源比特数组中与所确定的位序号相对应的位的值设定为1,以生成长度为m的第一比特数组或第二比特数组。
在依据本公开内容的一个实施例中,在确定所述第一比特数组与所述第二比特数组不同的情况下,确定所述第一区块链节点存储的但本地未存储的交易块进一步包括:
将所述第一比特数组中的每一位的值与所述第二比特数组中的相应位的值进行比较,以将在二者之间存在的具有不同值的位所对应的位序号作为差异位序号;
基于所述差异位序号,确定所述第一区块链节点中存储的但本地未存储的一个或多个哈希值;
基于所述一个或多个哈希值以及所述第一区块链节点中存储的每一个第一类交易块的所有哈希值,确定所述第一区块链节点中存储的但本地未存储的交易块。
在依据本公开内容的一个实施例中,在本地存储的任一交易块未在本地查找到其直接引用或间接引用的交易块或定序块,或者本地存储的任一定序块未在本地查找到其直接引用或间接引用的交易块或定序块的情况下,当所述指令执行时使得所述处理器进一步执行以下操作:
基于本地存储的交易块或定序块的头部信息,确定未查找到的其直接引用或间接引用的交易块或定序块的块哈希;
基于所述块哈希生成第四同步请求;
向所述第一区块链节点发送所述第四同步请求;以及
在所述第一区块链节点存储与所述第四同步请求相对应的交易块或定序块的情况下,接收来自第一区块链节点的相应的交易块或定序块。
本文所公开的基于dag的区块链的账本同步方法及设备在基于dag的区块链中加入多个定序块,以便于将该区块链进行拓扑上的有序切分(也即,将某个定序块直接引用的交易块以及间接引用的部分交易块确定化)。针对不同区块链节点中存储的不同交易块、定序块进行全量同步或采用布隆过滤器技术进行互相增量同步,从而极大地改善了区块同步的性能。
替代地,上述的账本同步方法能够通过计算机程序产品来实现。计算机程序产品可以包括计算机可读存储介质,其上载有用于执行本公开的各个方面的计算机可读程序指令。计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是但不限于电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、静态随机存取存储器(sram)、便携式压缩盘只读存储器(cd-rom)、数字多功能盘(dvd)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
以上所述仅为本公开的实施例可选实施例,并不用于限制本公开的实施例,对于本领域的技术人员来说,本公开的实施例可以有各种更改和变化。凡在本公开的实施例的精神和原则之内,所作的任何修改、等效替换、改进等,均应包含在本公开的实施例的保护范围之内。
虽然已经参考若干具体实施例描述了本公开的实施例,但是应该理解,本公开的实施例并不限于所公开的具体实施例。本公开的实施例旨在涵盖在所附权利要求的精神和范围内所包括的各种修改和等同布置。所附权利要求的范围符合最宽泛的解释,从而包含所有这样的修改及等同结构和功能。