一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种可再投票的二元共识方法及装置与流程

2021-12-14 22:53:00 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,具体地,涉及一种可再投票的二元共识方法及装置。


背景技术:

2.二元共识是拜占庭容错协议(拜占庭共识,bft)的主要组成部分,目前已知的异步拜占庭共识协议都直接或者间接依赖二元共识,其可以使分布式系统在异步环境下达成共识。同时,二元共识也可以用于构造状态机复制(state machine replication),进而使用状态机复制为分布式容错系统建立基础,另外,二元共识还可以应用在数据库等技术领域。因此,对于二元共识的研究是目前业界重要的研究方向。


技术实现要素:

3.本技术实施例中提供了一种可再投票的二元共识方法及装置,用于解决现有技术中共识效率低的问题。
4.本技术实施例中提供了一种可再投票的二元共识方法,其特征在于,应用于分布式系统中的任一共识节点,所述分布式系统至少包括n个共识节点,其中n≥3f 1,所述f为大于0的整数,所述方法包括:
5.针对任一共识节点的待共识提议,确定对应于该待共识提议的初始投票值以及初始辅助值;其中投票值包括优先投票值以及其他投票值两种值;初始投票值为优先投票值或其他投票值;
6.在所述初始投票值为其他投票值、且满足预设条件的情况下,重新将所述初始投票值确定为优先投票值;
7.广播携带有初始投票值以及初始辅助值的首轮共识消息;
8.根据其他共识节点广播的针对该待共识提议的首轮共识消息以及首轮共识策略,就所述优先投票值达成共识。
9.根据本技术实施例的第二个方面,一种可再投票的二元共识装置,其特征在于,应用于分布式系统中的任一共识节点,所述分布式系统至少包括n个共识节点,其中n≥3f 1,所述f为大于0的整数,所述装置包括:
10.处理模块,用于针对任一共识节点的待共识提议,确定对应于该待共识提议的初始投票值以及初始辅助值;其中投票值包括优先投票值以及其他投票值两种值;初始投票值为优先投票值或其他投票值;在所述初始投票值为其他投票值、且满足预设条件的情况下,重新将所述初始投票值确定为优先投票值;
11.通信模块,用于广播携带有初始投票值以及初始辅助值的首轮共识消息;
12.处理模块,还用于根据其他共识节点广播的针对该待共识提议的首轮共识消息以及首轮共识策略,就所述优先投票值达成共识。
13.采用本技术实施例中提供的共识方法,各个共识节点针对待共识提议在共识首轮通过广播投票值和辅助值,其中投票值中包括优先投票值,另外还允许各个共识节点在初
始投票值不为优先投票值的情况下,重新将初始投票值确定为优先投票值,使各个共识节点可以在共识首轮就优先投票值快速达成共识,提高了分布式系统中各个共识节点的共识效率,进而提高了分布式系统的处理能力。
附图说明
14.此处所说明的附图用来提供对本技术的进一步理解,构成本技术的一部分,本技术的示意性实施例及其说明用于解释本技术,并不构成对本技术的不当限定。在附图中:
15.图1为本说明书实施例的一种共识节点维护各个raba实例的示意图;
16.图2为本说明书实施例的一种可再投票的二元共识方法的流程示意图;
17.图3为本说明书实施例的一种广播共识消息的流程示意图;
18.图4为本说明书实施例的另一种可再投票的二元共识方法的流程示意图;
19.图5为本说明书实施例的一种可再投票的二元共识装置的结构示意图;
20.图6是用于配置本说明书实施例装置的一种设备的结构示意图。
具体实施方式
21.二元共识是拜占庭容错协议(拜占庭共识,bft)的主要组成部分,目前已知的异步拜占庭共识协议都直接或者间接依赖二元共识,其可以使区块链等分布式系统在异步环境下达成共识。同时,二元共识也可以用于构造状态机复制(state machine replication),进而使用状态机复制为分布式容错系统建立基础,另外,二元共识还可以应用在数据库等技术领域。
22.二元共识中,二元是指两个值,通常用0和1表示,分布式系统中各个节点可以就两个值中的某个值达成一致,而该值对于分布式系统来说往往具有重要的实际意义。以二元共识应用在区块链网络为例,区块链网络中各个节点的数据需要保持一致,如果利用二元共识方法确保区块链中各个节点的数据一致,那么当各个节点针对某批交易达成共识为1时,则各个节点都存储该数据,当各个节点针对某批交易达成共识为0时,则各个节点都不存储该数据,这样就保证了各个节点存储数据的一致性。可以理解的是,如果二元共识的执行效率越高,各个节点就能够快速就二元中的某个值达成共识,则分布式系统的性能也就越好,因此如何提高二元共识的效率是目前业界重要的研究方向。
23.针对上述问题,本技术实施例中提供了一种可再投票的二元共识方法,应用于分布式系统中的任一个共识节点,该节点广播包括投票值和辅助值的共识消息,投票值中包括优先投票值和其他投票值,并且在初始投票值为其他投票值时可以将初始投票值由其他投票值修改为优先投票值,在首轮共识中使各个节点能够就优先投票值快速达成共识,从而提升了系统中各个共识节点的共识效率。
24.本技术实施例中的方案可以采用各种计算机语言实现,例如,面向对象的程序设计语言java和直译式脚本语言javascript等。
25.为了使本技术实施例中的技术方案及优点更加清楚明白,以下结合附图对本技术的示例性实施例进行进一步详细的说明,显然,所描述的实施例仅是本技术的一部分实施例,而不是所有实施例的穷举。需要说明的是,在不冲突的情况下,本技术中的实施例及实施例中的特征可以相互组合。
26.在本说明书中,待共识提议可以理解为任一共识节点发出的数据,并希望其他共识节点共同参与对该数据的共识,而投票值则用于表示各个共识节点对该数据的共识意见,其中投票值包括优先投票值以及其他投票值两种值,即各个共识节点可以对待共识提议存在共两种共识意见,优先投票值以及其他投票值在一个实施例中,可以用1和0分别进行表示,在其他实施例中,还可以用其他形式和符号进行表示,本说明书对于优先投票值以及其他投票值的具体形式不行进行限定,只要能够用于区分优先投票值和其他投票值均可。辅助值则为本说明书提出的用于协助各个节点就待共识提议达成共识的一种辅助意见,其至少包括优先投票值以及其他投票值。
27.以区块链场景为例,待共识提议可以是任一共识节点从本地交易池中获取的一批交易,并希望其他共识节点可以接收并存储该批交易,而投票值用于表示各个共识节点是否同意存储该待共识提议。
28.在其他应用场景中,待共识提议以及投票值会具有其他不同的实际含义,本说明书对此不进行限定。
29.如图1所示,为分布式系统中的任一共识节点所要执行的二元共识实例的示意图,如分布式系统中共存在n个共识节点,为了方便说明将其中任一共识节点称为目标节点,分布式系统中的目标节点会针对每一个共识节点(包括其自身)分别利用本说明提出的可再投票的二元共识方法确定该节点提出的待共识提议的共识结果;如图中raba1‑
raba
n
,分别代表针对n个待共识提议进行可再投票的二元共识方法raba的示意图,raba1为目标节点针对共识节点1提出的待共识提议使用本说明书提出的可再投票二元共识方法进行处理的示意,raba2为目标节点针对共识节点2提出的待共识提议使用本说明书提出的可再投票二元共识方法进行处理的示意,以此类推。
30.从示意图中可以看出,目标节点在针对每个待共识提议进行共识时,会确定一个初始投票值(0或1),最终基于本说明提出的二元共识方法也会得到针对该待共识提议的共识结果(0或1)。
31.如图2所示,基于以上说明本说明书提出的一种可再投票的二元共识方法,应用于分布式系统中的任一共识节点,分布式系统至少包括n个共识节点,其中,共识节点是指参与共识过程的节点,可以理解的是,在分布式系统中通常还会存在其他不参与共识的节点,这些节点仅接收和存储共识节点的共识结果而不参与共识过程;另外,当系统中的恶意节点或称拜占庭节点过多时任何一种共识方法均无法确保系统中的共识节点达成共识,因此本说明书中规定该分布式系统包括n个共识节点,该n个共识节点中最多允许存在f个恶意节点,n≥3f 1,所述f和n均为大于0的整数,上述方法应用于多个共识节点中的任一正确节点,可以理解的是其他正确共识节点也在异步执行上述方法,当目标节点针对任一共识节点提出的待共识提议得到共识结果时,其他正确共识节点最终也会针对该待共识提议得到相同的共识结果。
32.该方法包括:
33.s201,针对任一共识节点的待共识提议,确定对应于该待共识提议的初始投票值以及初始辅助值;
34.根据上述图1、以及对于图1的说明可知,目标节点会针对每个共识节点的待共识提议分别确定共识结果,本图2所描述的即为目标节点针对每个待共识提议所要执行的共
识过程。
35.本步骤中,针对待共识提议确定初始投票值以及初始辅助值,辅助值,可以包括优先投票值、其他投票值以及空,初始辅助值可以默认为空,而初始投票值在不同应用场景中,可以根据不同的数据确定。例如,在区块链网络中,可以根据是否收到待共识提议的情况确定:如果目标节点接收到了该待共识提议(其他共识节点通过可靠广播rbc协议广播的),则确定该待共识提议的初始投票值为优先投票值,如果已经确定收到n

f个共识节点的待共识提议,则可以将还未收到的待共识提议的初始投票值置为其他投票值。在其他应用场景中,还可以根据不同的数据确定待共识提议的初始投票值。
36.s202,在所述初始投票值为其他投票值、且满足预设条件的情况下,重新将所述初始投票值确定为优先投票值;
37.s203,广播携带有初始投票值以及初始辅助值的首轮共识消息;
38.s204,根据其他共识节点广播的针对该待共识提议的首轮共识消息以及首轮共识策略,就所述优先投票值达成共识。
39.在上述s202中,目标节点在确定了初始投票值的情况下,不论初始投票值为优先投票值还是其他投票值,目标节点均可以执行s203,即广播该初始投票值以及初始辅助值,并接收其他共识节点广播的针对该待共识提议的初始投票值以及初始辅助值。
40.另外,本说明书提出为了使各个共识节点能够在首轮共识过程中就该优先投票值快速达成共识,因此允许目标节点在确定的初始投票值为其他投票值的情况下,若确定满足预设条件,则可以重新将所述初始投票值确定为优先投票值,并再次执行s203。
41.另外,在不满足预设条件的情况下,不允许目标节点修改初始投票值,在不同分布式系统应用场景中可以灵活的配置不同的预设条件,以具有n个共识节点的区块链网络应用场景为例,目标节点可以基于可靠广播rbc协议广播待共识提议,可以是在未接收到共识节点f1的待共识提议、但已经接收到了其他n

f个共识节点的待共识提议,且针对该n

f个待共识提议分别开始执行s203的情况下,就确定该共识节点f1的待共识提议的初始投票值为其他投票值0,(以1表示优先投票值,以0表示其他投票值为例),并执行s203,如果针对该f1的待共识提议还未得到共识结果,且目标节点接收到了该待共识提议,则可以针对该待共识提议再次确定初始投票值,即重新将所述初始投票值确定为优先投票值。即在区块链网络场景中,可以将预设条件配置为:在接收到该待共识提议的情况下,若已针对该待共识提议开始执行共识过程,且还未得到该待共识提议的共识结果。
42.可靠广播rbc协议可以保证目标节点在接收任一待共识提议时,仅会接收到一次,而非多次接收同一待共识提议,因此在针对某一待共识提议已经开始执行共识过程,而后才接收到该待共识提议,则说明该待共识提议的初始投票值为其他投票值0,进一步可以将该待共识提议的初始投票值修改为优先投票值1,并再次以优先投票值1为作为输入再次触发执行共识过程。
43.可以理解的是,上述仅以区块链网络应用场景为例进行说明,在其他的应用场景中,可以根据不同的场景需求配置不同的预设条件,本步骤中,允许目标节点再投票,即针对同一个待共识提议确定两次初始投票值,允许目标节点在某个待共识提议的初始投票值为其他投票值的情况下,将初始投票值修改为优先投票值,目的在于可以使各个共识节点可以快速就优先投票值达成共识。
44.上述s203中,目标节点具体可以是执行如图3所述的步骤:
45.s301,将初始投票值和初始辅助值携带在首轮第一类共识消息中进行广播;
46.本步骤中,可以采用上述方式确定初始投票值以及初始辅助值,这里不再进行详述。
47.目标节点可以将本地确定的初始投票值以及初始辅助值添加到首轮第一类共识消息中,并通过认证信道将首轮第一类共识消息传输至分布式系统中的其他共识节点,当然在没有认证信道时,为了保证数据传输的安全性,还可以通过数字签名或公钥技术设施等密码学工具保证共识消息传输的安全性,本说明书对此不进行限定。在一个实施例中,第一类共识消息可以是bval
r
格式的消息,目标节点可以广播形如bval
r
(est
r
,maj
r
)消息,其中est
r
为投票值,maj
r
为辅助值,投票值est
r
是一个二进制数(0或1),maj
r
∈{0,1,

},在首轮中,maj
r
设置为空,r为共识轮,首轮即第0轮,共识轮从0开始以1为步长递增。
48.s302,接收其他共识节点广播的首轮第一类共识消息;
49.可以理解的是,分布式系统中的全部正确节点都在执行目标节点所执行的步骤,即其他共识节点也会发送包括针对该待共识提议的初始投票值以及初始辅助值的首轮第一类共识消息;此时,目标节点会接收到来自其他共识节点发送的首轮第一类共识消息。
50.在一个实施例中,如果目标节点在首轮共识接收到f 1个首轮第一类共识消息,即超过恶意节点数量的首轮第一类共识消息,如果这f 1个首轮第一类共识消息中的投票值相同,且与本地广播的投票值不一致,目标节点则将本轮本地投票值修改为所述f 1个第一类共识消息中的投票值,并再次广播首轮第一类共识消息。例如,如果目标节点收到f 1个bval0(b,

)消息,且b与该目标节点的当前轮首次广播的投票值不相等,该目标节点将广播bval0(b,

)。
51.s303,基于所述初始投票值以及其他共识节点广播的首轮第一类共识消息,重新确定投票值以及辅助值,并将重新确定的投票值以及辅助值携带在首轮第二类共识消息中进行广播。
52.其中,各个共识节点每轮仅发送一次第二类共识消息,具体确定第二类共识消息中携带信息的方式可以如下:
53.在一个实施例中,可以是在本地首次通过第一类共识消息广播的初始投票值为优先投票值的情况下,将该初始投票值添加到第一集合中;并将所述第一集合中的投票值确定为首轮第二类共识消息中的投票值以及辅助值。
54.结合上述例子,目标节点广播bval0(est0,maj0)消息,其中est0为1(优先投票值),则可以直接将1存入bin_values0(首轮第一集合,r=0)并广播aux0(1,1)。其中aux
r
为第二类共识消息格式。
55.在一个实施例中,在目标节点首次通过第一类共识消息广播的初始投票值不为优先投票值的情况下,若接收到其他共识节点广播的f 1个首轮第一类共识消息,且所述f 1个第一类共识消息中的携带的投票值均为优先投票值,则将所述优先投票值添加到首轮第一集合中,并将所述首轮第一集合中的投票值确定为首轮第二类共识消息中的投票值以及辅助值。
56.例如,目标节点收到f 1个bval0(b,

)消息,其中,b=1,即为优先投票值,则将b存入bin_values0;若此时目标节点还没发送过aux0()消息,则广播aux0(1,1)。
57.在一个实施例中,在目标节点首次通过第一类共识消息广播的初始投票值不为优先投票值的情况下,若接收到其他共识节点广播的法定数量的首轮第一类共识消息,且所述法定数量的第一类共识消息中的携带的投票值均不为优先投票值即均为其他投票值,则将该其他投票值添加到首轮第一集合中,并将所述首轮第一集合中的投票值确定为首轮第二类共识消息中的投票值以及辅助值。其中,法定数量即为2f 1个共识节点(包括自身节点),如无特殊规定,下文中的法定数量均为2f 1。
58.例如,目标节点接收到了2f 1个bval0(b,

)消息,其中,b为0,即不为优先投票值,则目标节点将b添加到集合bin_values0中,如果此时目标节点还没发过aux0()消息,则广播aux0(0,0)。
59.上述方式中,在目标节点本地通过第一类共识消息发送优先投票值后,即可以直接通过第二类共识消息发的优先投票值,而无需参考其他共识节点的意见,目的也是在于可以使各个节点可以就优先投票值快速达成共识,同时也可以使再投票后,针对优先投票值进行的共识步骤可以超过针对其他投票值的共识步骤。
60.目标节点在接收到其他共识节点广播的首轮第二类共识消息后,即可以根据首轮共识策略,确定是否能够就所述优先投票值达成共识,其中,首轮共识策略为使各个共识节点在首轮能够就所述优先投票值快速达成共识的策略。
61.在一个实施例中,首轮共识策略具体可以是:
62.在接收到法定数量的首轮第二类共识消息后,将接收到的第二类共识消息中的投票值存入到首轮第二集合中,将辅助值存入到首轮第三集合中;将首轮公共抛币值置为所述优先投票值;
63.在首轮第二集合中仅包含一种投票值的情况下,若接收到了超过(n f 1)/2个携带优先投票值的第二类共识消息,则确定共识结果为所述优先投票值;若接收到了超过(n f 1)/2个携带其他投票值的第二类共识消息,则将次轮第一类共识消息中携带的投票值以及辅助值均设置为其他投票值。
64.例如,目标节点在收到n

f个aux0()消息(首轮第二类共识消息)后,目标节点将接收到的aux0()消息中的投票值和辅助值均存储在vals0(首轮第二集合)和avals0(首轮第三集合)中。如果,集合vals0中仅包含b,其中b为0或1,并且接收到了超过(n f 1)/2个相同b的aux0(b,*),*可以是0、1或空中的任意一个值,且b=1(优先投票值),则确定共识结果为1;如果b=0,目标节点则将est
r 1
(下一共识轮的投票值)与maj
r 1
(下一共识轮的辅助值)都设置为b。
65.另外,若未收到超过(n f 1)/2个携带相同投票值的第二类共识消息,则将次轮第一类共识消息中携带的投票值以及辅助值均设置为优先投票值。
66.结合上述例子,若目标节点未收到超过(n f 1)/2个携带相同投票值的第二类共识消息,则将est
r 1
与maj
r 1
都设置为1。
67.可见,采用上述首轮共识策略,可以使各个共识节点就优先投票值快速达成共识,提高了共识效率。
68.上述s201

s204为首轮共识的方式,下面介绍其他轮共识的方式:
69.除了首轮以外,其他轮的共识均是采用如图4所示的方法达成共识:
70.在首轮没有就优先投票值达成共识的情况下,则可以开始循环执行s401

s402,直
到得到针对该待共识提议的共识结果:
71.s401,广播本轮共识消息,所述共识消息中携带本轮投票值以及辅助值;
72.s402,基于接收到的其他共识节点广播的针对该待共识提议的投票值和辅助值,确定是否得到共识结果。
73.其中,在s401中具体可以是:
74.s401a,将投票值和辅助值携带在第一类共识消息中进行广播;
75.s401b,接收其他共识节点广播的第一类共识消息;
76.s401c,基于接收到的第一类共识消息重新确定投票值以及辅助值,并将重新确定的投票值以及辅助值携带在第二类共识消息中进行广播。
77.其中,s401a

s401b的过程可以参照上述s301

s302中的内容,这里不在进行详述,区别仅在于携带在第一类共识消息中广播的投票值以及辅助值不为初始投票值和初始辅助值,而是首轮共识之后,基于消息传输结果重新确定的投票值和辅助值,具体可以参照上述关于s204的部分,这里不再进行详述。
78.s401c中,可以是目标节点在接收到法定数量的第一类共识消息后,根据接收到的第一类共识消息重新确定投票值以及辅助值。
79.具体的,如果这2f 1个第一类共识消息中的投票值相同,目标节点则将该投票值添加到第一集合中。例如,如果目标节点收到2f 1个bval
r
(b,*)消息,b∈{0,1}。则目标节点将b添加到第一集合bin_values
r
中。此外,目标节点将上述2f 1个第一类共识消息中的辅助值,也添加到辅助值集合majs中。本步骤中,在接收到法定数量的相同投票值的情况下,则将该投票值存储到第一集合中,意味着系统中大多数节点可能达成了共识。目标节点可以将第一集合中的投票值,与上一轮的公共抛币值进行比较,并根据比较结果确定第二类共识消息中携带的投票值以及辅助值。其中,公共抛币值,只有0或1两种值,各个共识节点可以在某一轮中获得相同的公共抛币值,且除了首轮以外其他的每一轮的抛币值是随机的,获得公共抛币值的方法可以是采用门限签名算法等方式获得,具体内容可以参照相关技术,这里不进行限定。
80.具体的根据比较结果确定第二类共识消息中携带的投票值以及辅助值的方式可以如下:
81.一种情况是,如果第一集合中的投票值与上一轮的公共抛币值相等,并且目标节点接收过的第一类共识消息中携带的投票值均为该第一集合中的投票值,携带的辅助值均为该第一集合中的投票值或空,则将第二类共识消息中的投票值以及辅助值设置为该第一集合中的投票值并进行广播;如果还接收过携带其他投票值的第一类共识消息,则将第二类共识消息中的投票值设置为空,并且将第二类共识消息中的辅助值设置为该第一集合中的投票值。
82.延续上述的例子,如果第一集合中的投票值为b,上一轮的公共抛币值为s
r
‑1,如果b=s
r
‑1,并且目标节点仅接收过bval
r
(b,b)和bval
r
(b,

)消息,则直接广播aux
r
(b,b),如果还接收过携带其他投票值的第一类共识消息,则广播aux
r
(

,b)。
83.另一种情况是,如果第一集合中的投票值与上一轮的公共抛币值不相等,并且目标节点接收过的第一类共识消息中携带的投票值以及辅助值均为该第一集合中的投票值的情况下,则将第二类共识消息中的投票值以及辅助值设置为该第一集合中的投票值,并
进行广播;如果还接收过携带其他投票值或辅助值的第一类共识消息,则将第二类共识消息中的投票值设置为空,并且将第二类共识消息中的辅助值设置为该第一集合中的投票值。延续上述的例子,如果第一集合中的投票值为b,上一轮的公共抛币值为s
r
‑1,如果其中,由于抛币值只有两个值0或1,投票值也只有两个值0或1,因此在投票值b不等于抛币值s
r
‑1时,则等于1-s
r
‑1即在这种情况下,且目标节点仅接收过bval
r
(b,b)消息,则直接广播aux
r
(b,b),如果还接收过携带其他投票值或辅助值的第一类共识消息,则广播aux
r
(

,b)。
84.每个共识节点每轮只广播一次第二共识信息,上述方式为目标节点确定非首轮第二类共识消息中携带的投票值以及辅助值的方式。
85.目标节点在发送第二类共识消息时,由于其他共识节点也会异步的发送第二类共识消息,因此目标节点会接收到其他共识节点发的第二类共识消息。目标节点在接收到其他共识节点发送的共识消息后,可以先将一些明显非法的第二类共识消息删除,根据上述内容可知,由于正确的共识节点仅会广播形如aux
r
(b,b)以及aux
r
(

,b)的第二类共识消息,因此在接收到携带其他投票值或辅助值的消息时可以直接丢弃,由于第二类共识消息中的投票值是存储在第一集合中的,因此可以在接收到第二类共识消息后,利用第一集合确定合法和非法消息。
86.在上述s402中,目标共识节点基于接收到的投票值和辅助值确定是否得到共识结果,如果没有得到共识结果,则确定下一轮的投票值以及辅助值,并重新开始执行s401。
87.下面对目标共识节点基于接收到的投票值和辅助值确定共识结果,以及确定下一轮投票值和辅助值的方法进行详述:
88.目标节点在接收到法定数量的第二类共识消息后,可以将接收到的第二类共识消息中的投票值以及辅助值分别存入第二集合vals
r
以及第三集合avals
r
中,并获得本轮全部共识节点统一的公共抛币值。例如,目标节点在接收到2f 1个aux
r
()消息后,可以将接收到的aux
r
()消息中的投票值和辅助值分别存入集合vals
r
第二集合)和avals
r
(第三集合)中。目标节点可以根据接收到的第二类共识消息的情况,按照下述方式确定共识结果、或下一轮共识中第一类共识消息所携带的投票值以及辅助值:
89.(a)如果目标节点接收到的第二类共识消息中,存在超过法定数量的第二类共识消息是相同的,且这些第二类共识消息中投票值与辅助值相同,目标节点则将该第二类共识消息中的投票值与本轮公共抛币值进行比较,如果该投票值与本轮公共抛币值相同,则目标共识节点确定共识结果为该投票值;如果不相同,目标节点则将下一轮第一类共识消息中携带的投票值以及辅助值均设置为这些第二类共识消息中的投票值,并开始执行下一轮共识。
90.例如,如果目标节点收到法定数量条aux
r
(b,b)信息,目标节点将b与本轮公共抛币s
r
进行比较。如果b=s
r
,目标节点确定共识结果为b;否则,目标节点将est
r 1
与maj
r 1
都设置为b,并进入下一轮共识。
91.(b)如果目标节点只接收到过合法第二类共识消息,且所述第二集合中的投票值为一种投票值和空,并且至少有法定数量条第二类共识消息的辅助值为该种投票值,则将该种投票值与上一轮共识和本轮共识的公共抛币值分别进行比较。如果该种投票值与上一
轮和本轮的公共抛币值均相同,则目标节点确定共识结果该为该种投票值,如果该种投票值与上一轮公共抛币值和/或本轮抛币值不相同,目标共识节点则将下一轮第一类共识消息中的投票值以及辅助值均设置为该种投票值,并开始执行下一轮共识。
92.例如,如果目标节点只接收到了aux
r
(b,*)和aux
r
(

,*),并且至少有法定数量的第二类共识消息为aux
r
(*,b),则目标节点将b与两轮公共抛币s
r
‑1与s
r
进行比较。如果b=s
r
‑1且b=s
r
,目标节点确定共识结果为b,否则目标节点将est
r 1
与maj
r 1
都设置为b,并进入下一轮。
93.(c)如果目标节点接收到了法定数量的合法第二类共识消息,所述法定数量条第二类共识消息携带的辅助值不完全相同,第二集合中的投票值为一种投票值和空,且该种投票值与上一轮公共抛币值相同,则目标共识节点将下一轮共识中第一类共识消息中的投票值以及辅助值均设置为该种投票值,并开始执行下一轮共识。例如,如果目标节点接收了n

f条aux
r
(b,*)和aux
r
(

,*)消息,其中同时包含aux
r
(*,0)与aux
r
(*,1),且b=s
r
‑1,则目标节点将est
r 1
与maj
r 1
都设置为b,并进入下一轮共识。
94.(d)如果目标节点接收到的第二类共识消息的情况不属于上述三种情况,则目标节点可以将本轮公共抛币值作为下一轮第一类共识消息的投票值。另外,如果当前共识轮为首轮,目标节点则将下一轮的第一类共识消息中的辅助值也设置为本轮公共抛币值,如果当前共识轮不为首轮,目标节点则将下一轮的第一共消息中的辅助值设置为第二集合中的出现次数超过预设次数的值,并进入下一轮共识。
95.例如,如果目标节点接收到的第二类共识消息的情况不属于上述三种情况,目标节点将当轮公共抛币值作为下一轮输入(即将est
r 1
设置为s
r
)。此外,若轮数r=0,目标节点将maj
r 1
设置为s
r
;若r>0,目标节点将maj
r 1
设置为majority(vals
r
),其中,majority(vals
r
)=b,b∈{0,1},代表b在vals
r
中出现次数占大多数,即vals
r
中b的数量不小于若不存在这样的b,则令majority(vals
r
)=


96.可以理解的是,上述方式是共识节点中的任一正确节点所执行的方法,其他正确共识节点也在异步执行上述方法,采用上述方式,设于优先投票值,在首轮中各个共识节点大概率可以就优先投票值达成共识,可以使异步环境下的分布式系统中的各个共识节点快速就某个值达到共识状态,大大提升了异步环境下分布式系统的共识效率。
97.同时,采用上述共识方法可以保证分布式系统中的共识节点满足以下性质,即以下技术效果:
98.有效性:在所有正确节点广播的投票值均为v、且没有再次广播其他投票值的情况下,那么所有正确节点的共识结果均为该投票值v;
99.一致终止:在所有正确节点广播的投票值为相同值v、且没有再次广播其他投票值的情况下,那么所有正确节点均可以终止共识操作,即达成共识;共识性:如果任一个正确节点确定某一投票值v为共识结果,那么其他终止共识操作的正确节点也会确定该投票值v为共识结果;
100.有偏有效性:如果f 1个正确节点广播投票值v,那么正确节点在终止共识时,可以确定该投票值v为共识结果;
101.有偏终止:如果q是正确节点的集合,其中q1是广播了投票值1没有再次广播投票
值0的正确节点的集合,q2是广播了投票值0又再次广播了投票值1的正确节点的集合,如果以及q=q1∪q2,那么所有正确的节点都会达成共识;
102.完整性:正确的节点就一个提议只达成一次共识。
103.在针对全部共识节点提出的共识提议达成共识之后,各个正确的共识节点会得到相同的共识结果,结果为包含0和1的序列。进一步即可以基于该序列执行相应的事务处理,仍以区块链网络为例,在区块链网络中,0或1用于指示是否将相应的共识提议打包成块。例如共有四个共识节点,共识节点1提出的共识提议为p1,共识节点2提出的共识提议为p2,共识节点3提出的共识提议为p3,共识节点4提出的共识提议为p4,使用上述共识方法进行共识后得到一个01序列,例如得到的序列为(1,1,1,0),则达成的共识结果为所有节点将p1、p2以及p3打包成块存储在本地不存储p4,即各个共识节点根据共识结果对各共识提议进行了一致性处理,保证各个共识节点的数据一致性。
104.为了使本领域技术人员更为清楚的了解上述二元共识方法,下面以区块链场景为例,对目标节点接收其他共识节点的待共识提议,以及向其他共识节点发送待共识提议的过程进行说明:
105.目标节点可以是从本地交易池中随机获取预设数量的交易,或者按照交易存储的先后顺序,优先获取较早存储的预设数量的交易。可以理解的是,由于各个共识节点都会接收客户端请求的交易,因此各个共识节点都可以在本地维护自己的交易池。目标节点在获取了交易后,可以将获取的交易打包成为本次的待共识提议。目标节点在获取了本地待共识提议后,即可以基于可靠广播rbc协议,向其他共识节点广播本地待共识提议,同时也可以基于可靠广播rbc协议接收其他共识节点广播的待共识提议。下面以一种可靠广播rbc协议的具体实现方式进行举例说明:
106.目标节点可以将待共识提议采用纠删码处理,得到n个数据块;基于得到的n个数据块的哈希值构建默克尔树,得到根哈希以及对应于每个数据块的默克尔路径的默克尔证明;将所述n个数据块中的部分数据块保存在本地,将其他数据块、根哈希以及其他数据块对应的默克尔路径发送至其他共识节点,以使其他共识节点对所述数据块进行广播和验证。以共有4个共识节点(共识节点1

共识节点4)为例,目标节点为共识节点1,共识节点1将本地的待共识提议采用纠删码处理后拆分成4个数据块,分别为数据块1

数据块4,采用预设的hash算法对4个数据块进行hash运算,得到4个数据块的hash值,并基于4个数据块的哈希值构建默克尔树,数据块1的hash值为hash1,数据块2的hash值为hash2,数据块3的hash值为hash3,数据块4的hash值为hash4,对hash1和hash2进行计算得到hash12,对hash3和hash4进行计算得到hash34,对hash12和hash34进行计算得到根hash,从而得到默克尔树。可以理解的是,上述仅以4个节点为例,实际应用中可以根据不同数量的共识节点构建更为复杂的默克尔树。在构建了默克尔树之后,共识节点1可以将数据块1存储在本地,将数据块2、hash1、hash34以及根hash发送至共识节点2;将数据块3、hash4、hash12以及根hash发送至共识节点3;将数据块4、hash3、hash12以及根hash发送至共识节点4。以发送给共识节点2的内容为例,其中hash1、hash34即为数据块2对应的默克尔路径的默克尔证明。共识节点1可以将上述内容以rval消息格式发送到其他共识节点。其他共识节点在接收到共识节点1发送的上述内容后,可以将上述内容以echo消息格式广播至其他共识节点。其他共识节点在接收到echo消息后,即可以验证该消息是否合法,具体可以是在接收到消息后,针对该消
息中的数据块,利用该数据块对应的默克尔路径的默克尔证明、根哈希进行验证;如果验证通过,则确定该消息合法。
107.延续上述的例子,共识节点3在接收到echo消息后,确定该消息内容为:数据块4、hash3、hash12以及根hash,则可以对该数据块4进行计算得到hash4,将hash4与接收到的hash3计算得到hash34,将hash34与接收到的hash12进行计算得到根hash,如果该计算得到的根hash与接收到的根hash相同,则说明该echo消息合法,如果验证不通过,则可以直接丢弃该echo消息,以避免恶意节点对消息的篡改。
108.通过上述方式共识节点2

共识节点4可以接收到共识节点1(目标节点)发送的出所有数据块(在没有节点故意不发送数据块的情况下),任一节点可以在接收到n

f个echo消息后,且该n

f个echo消息均验证通过的情况下,选取其中任意n

2f个数据块还原待共识提议,并且可以重构默克尔树,比较重构得到的默克尔树的根hash与之前接收到的echo中的根hash是否一致,如果一致则广播ready消息。
109.可以理解的是,虽然上述是以目标节点1为例进行说明,但是在本说明书示出的共识方法中,各个共识节点没有主副之分,即任一个共识节点均为目标节点,任一共识节点均可以通过上述方式得到其他共识节点的待共识提议;任一共识节点也均是通过上述方式将本地的待共识提议发送至其他共识节点。
110.各个共识节点可以同时发出本地的待共识提议,因此目标节点可能会先后接收到不同共识节点发送的待共识提议。目标节点在接收到其他共识节点发的的待共识提议后,即可以确定待共识提议的初始投票值,并可以针对该待共识均提议执行图2

图4所示的方法,即可以根据待共识提议的接收情况确定各个待共识提议的初始投票值以触发执行本说明书提出的可再投票的二元共识方法,进而可以针对区块链网络中每个共识节点广播的待共识提议分别达成共识。
111.可以理解的是,上述仅为可靠广播rbc协议的一种具体实现方式,还可以通过其他方式实现可靠广播rbc协议的具体内容可以参照相关技术,本说明书对此不进行限定。另外,上述举的也是将本说明书提出的可再投票的二元共识方法应用在区块链网络中的例子,在其他应用场景中,还可以基于不同的数据确定任一待共识提议的初始投票值,并执行本说明书提出的可再投票的二元共识方法,以使各个共识节点达成共识。
112.下面从代码实现角度对本说明书的s201

s204进行说明:
113.伪代码如下:
[0114][0115][0116]
上述伪代码中,从语法上讲,每一个raba协议实例使用唯一的标识符sid进行标记。该实例由propose(sid,
·
),repropose(sid,
·
),和decide(sid,
·
)组成,其中输入变量空间是{0,1}。对于我们的目的,raba是“偏向1的”。在协议的开头每个副本都可以propose值v。每个副本只可以propose一次。提议0的正确副本被允许改变主意并repropose 1;但是一个提议1的副本不允许repropose 0。(即,按照协议运行的正确副本不会这样做)。每个副本最多repropose1一次。对每个sid指定的实例,副本在生成decide消息后终止该实例的运行。
[0117]
如图5所示,与前述一种可再投票的二元共识方法相对应,本说明书还提供了一种可再投票的二元共识装置,应用于分布式系统中的任一共识节点,所述分布式系统至少包
括n个共识节点,其中n≥3f 1,所述f为大于0的整数,所述装置包括:
[0118]
处理模块520,用于针对任一共识节点的待共识提议,确定对应于该待共识提议的初始投票值以及初始辅助值;其中投票值包括优先投票值以及其他投票值两种值;初始投票值为优先投票值或其他投票值;在所述初始投票值为其他投票值、且满足预设条件的情况下,重新将所述初始投票值确定为优先投票值;
[0119]
通信模块510,用于广播携带有初始投票值以及初始辅助值的首轮共识消息;
[0120]
处理模块520,还用于根据其他共识节点广播的针对该待共识提议的首轮共识消息以及首轮共识策略,就所述优先投票值达成共识。
[0121]
在一个实施例中,所述处理模块520,还用于在首轮未就所述优先投票值达成共识的情况下,循环执行以下步骤,直到得到针对该待共识提议的共识结果:调用通信模块510广播本轮共识消息,所述共识消息中携带本轮投票值以及辅助值;基于接收到的其他共识节点广播的投票值和辅助值,确定是否得到共识结果。
[0122]
在一个实施例中,所述处理模块520,具体用于调用通信模块510将初始投票值和初始辅助值携带在首轮第一类共识消息中进行广播,接收其他共识节点广播的首轮第一类共识消息;基于所述初始投票值以及其他共识节点广播的首轮第一类共识消息,重新确定投票值以及辅助值,并调用通信模块510将重新确定的投票值以及辅助值携带在首轮第二类共识消息中进行广播。
[0123]
在一个实施例中,所述处理模块520,具体用于在接收到f 1个首轮第一类共识消息的情况下,且所述f 1个第一类共识消息中的投票值相同、与本地广播的初始投票值不同,则将本地初始投票值修改为所述f 1个第一类共识消息中的投票值,并再次广播携带初始投票值以及初始辅助值的首轮第一类共识消息。
[0124]
在一个实施例中,所述处理模块520,具体用于在所述初始投票值为优先投票值的情况下,将所述初始投票值添加到首轮第一集合中,并将所述首轮第一集合中的投票值确定为首轮第二类共识消息中的投票值以及辅助值。
[0125]
在一个实施例中,所述处理模块520,具体用于在所述初始投票值不为优先投票值的情况下,若接收到其他共识节点广播的f 1个首轮第一类共识消息,所述f 1个第一类共识消息中的携带的投票值均为优先投票值,则将所述优先投票值添加到首轮第一集合中,并将所述首轮第一集合中的投票值确定为首轮第二类共识消息中的投票值以及辅助值。
[0126]
在一个实施例中,所述处理模块520,还用于在所述初始投票值不为优先投票值的情况下,若接收到其他共识节点广播的法定数量的首轮第一类共识消息,所述法定数量的第一类共识消息中携带的投票值均为其他投票值,则将该其他投票值添加到首轮第一集合中,并将所述首轮第一集合中的投票值确定为首轮第二类共识消息中的投票值以及辅助值。
[0127]
在一个实施例中,所述处理模块520,具体用于基于接收到的首轮第二类共识消息中的投票值、辅助值以及首轮共识策略就所述优先投票值达成共识。
[0128]
在一个实施例中,所述首轮共识策略包括:在接收到法定数量的首轮第二类共识消息后,将接收到的第二类共识消息中的投票值存入到首轮第二集合中,将辅助值存入到首轮第三集合中,将首轮公共抛币值置为所述优先投票值;在所述首轮第二集合中仅包含一种投票值的情况下,若接收到了超过(n f 1)/2个携带优先投票值的第二类共识消息,则
确定共识结果为所述优先投票值;若接收到了超过(n f 1)/2个携带其他投票值的第二类共识消息,则将次轮第一类共识消息中携带的投票值以及辅助值均设置为其他投票值;
[0129]
若未收到超过(n f 1)/2个携带相同投票值的第二类共识消息,则将次轮第一类共识消息中携带的投票值以及辅助值均设置为优先投票值。
[0130]
在一个实施例中,所述通信模块510,具体用于将投票值和辅助值携带在第一类共识消息中进行广播;接收其他共识节点广播的第一类共识消息;所述处理模块520,用于基于接收到的第一类共识消息重新确定投票值以及辅助值,所述通信模块510,具体用于将重新确定的投票值以及辅助值携带在第二类共识消息中进行广播。
[0131]
在一个实施例中,所述处理模块520,还用于若在当前共识轮接收到f 1个第一类共识消息,且所述f 1个第一类共识消息中的投票值相同、与本地本轮共识通过第一类共识消息广播的投票值不同,则将投票值修改为所述f 1个第一类共识消息中的投票值,并再次广播携带投票值以及辅助值的第一类共识消息。
[0132]
在一个实施例中,所述处理模块520,具体用于在接收到法定数量的第一类共识消息后,在所述法定数量的第一类共识消息所携带的投票值相同的情况下,将该投票值添加到本轮第一集合中;将所述本轮第一集合中的投票值与上一轮的公共抛币值进行比较,根据比较结果以及接收到的第一类共识消息重新确定投票值以及辅助值。
[0133]
在一个实施例中,所述处理模块520,具体用于在本轮第一集合中的投票值与上一轮的公共抛币值相等的情况下,若接收过的第一类共识消息中携带的投票值均为该第一集合中的投票值,携带的辅助值均为该第一集合中的投票值或空,则将投票值以及辅助值设置为该本轮第一集合中的投票值;否则,则将投票值设置为空,并且将辅助值设置为该本轮第一集合中的投票值。
[0134]
在一个实施例中,所述处理模块520,具体用于在本轮第一集合中的投票值与上一轮的公共抛币值不相等的情况下,若接收过的第一类共识消息中携带的投票值以及辅助值均为该本轮第一集合中的投票值,则将第二类共识消息中的投票值以及辅助值设置为该第一集合中的投票值;否则,则将投票值设置为空,并且将辅助值设置为该第一集合中的投票值。
[0135]
在一个实施例中,所述处理模块520,具体用于基于接收到的第二类共识消息中的投票值以及辅助值确定是否得到共识结果。
[0136]
在一个实施例中,所述处理模块520,具体用于若接收到的第二类共识消息中存在超过法定数量的第二类共识消息是相同的,且所述第二类共识消息中投票值与辅助值相同,则将该第二类共识消息中的投票值与本轮公共抛币值进行比较,如果该投票值与本轮公共抛币值相同,则目标共识节点确定共识结果为该投票值;如果不相同,则将下一轮第一类共识消息中携带的投票值以及辅助值均设置为所述第二类共识消息中的投票值。
[0137]
在一个实施例中,所述处理模块520,具体用于若只接收到过合法第二类共识消息,所述第二集合中的投票值为一种投票值和空,并且至少有法定数量条第二类共识消息的辅助值为该种投票值,则将该种投票值与上一轮共识和本轮共识的公共抛币值分别进行比较;若该种投票值与上一轮和本轮的公共抛币值均相同,则目标节点确定共识结果该为种投票值;若该种投票值与上一轮公共抛币值和/或本轮抛币值不相同,则将下一轮第一类共识消息中的投票值以及辅助值均设置为该种投票值。
[0138]
在一个实施例中,所述处理模块520,具体用于若接收到了法定数量的合法第二类共识消息,所述法定数量条第二类共识消息携带的辅助值不相同,所述第二集合中的投票值为一种投票值和空,且该种投票值与上一轮公共抛币值相同,则将下一轮共识中第一类共识消息中的投票值以及辅助值均设置为该种投票值。
[0139]
在一个实施例中,所述处理模块520,具体用于在接收到的第二类共识消息不满足上述实施例的情况下,将本轮公共抛币值作为下一轮第一类共识消息的投票值;若当前共识轮为首轮,则将下一轮的第一类共识消息中的辅助值设置为本轮公共抛币值;若当前共识轮不为首轮,则将下一轮的第一共消息中的辅助值设置为第二集合中的出现次数超过预设次数的值。
[0140]
上述装置中各个部件的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
[0141]
对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0142]
本说明书实施例还提供一种计算机设备,其至少包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其中,处理器执行所述程序时实现前述的方法。该方法至少包括上述图1所示的方法。
[0143]
图6示出了本说明书实施例所提供的一种更为具体的计算设备硬件结构示意图,该设备可以包括:处理器1010、存储器1020、输入/输出接口1030、通信接口1040和总线1050。其中处理器1010、存储器1020、输入/输出接口1030和通信接口1040通过总线1050实现彼此之间在设备内部的通信连接。
[0144]
处理器1010可以采用通用的cpu(central processing unit,中央处理器)、微处理器、应用专用集成电路(application specific integrated circuit,asic)、或者一个或多个集成电路等方式实现,用于执行相关程序,以实现本说明书实施例所提供的技术方案。
[0145]
存储器1020可以采用rom(read only memory,只读存储器)、ram(random access memory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器1020可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器1020中,并由处理器1010来调用执行。
[0146]
输入/输出接口1030用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
[0147]
通信接口1040用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如usb、网线等)实现通信,也可以通过无线方式(例如移动网络、wifi、蓝牙等)实现通信。
[0148]
总线1050包括一通路,在设备的各个组件(例如处理器1010、存储器1020、输入/输出接口1030和通信接口1040)之间传输信息。
[0149]
需要说明的是,尽管上述设备仅示出了处理器1010、存储器1020、输入/输出接口1030、通信接口1040以及总线1050,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
[0150]
本说明书实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述的方法。该方法至少包括上述图1所示的方法。
[0151]
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd

rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
[0152]
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本说明书实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本说明书实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本说明书实施例各个实施例或者实施例的某些部分所述的方法。
[0153]
上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
[0154]
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本说明书实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
[0155]
以上所述仅是本说明书实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本说明书实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本说明书实施例的保护范围。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献