一种拜占庭容错共识方法及系统转让专利

申请号 : CN201910585248.1

文献号 : CN112187490B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 林开辉付伟

申请人 : 深圳法大大网络科技有限公司

摘要 :

申请属于区块链技术领域,提供了一种拜占庭容错共识方法及系统,该方法包括:通过主节点打包交易生成区块并广播至所述区块链中的共识节点;通过共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;通过共识节点统计所述新生成区块的投票,判断投票通过的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;通过共识节点统计所述新生成区块的提交信息。本申请实施例提高拜占庭容错共识方法的容错率,并且实现网络分区的可容忍,解决了网络分区导致区块链中共识节点状态不能达成一致的问题。

权利要求 :

1.一种拜占庭容错共识方法,其特征在于,包括:

在提案开始时,从区块链中关系对等的各共识节点中选取出主节点;

通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号;

通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;

通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;

通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;

通过所述主节点提交所述当前提案;

其中,所述通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点,包括:所述共识节点中已有区块时,通过所述共识节点对比所述已有区块与所述新生成区块的区块高度;

若区块高度一致,则通过所述共识节点对所述新生成区块进行验证;

若验证通过,则释放所述已有区块,生成通过所述当前提案的投票并广播至其它共识节点;

若验证未通过,则保留所述已有区块,生成无赋值的投票并广播至其它共识节点。

2.如权利要求1所述的拜占庭容错共识方法,其特征在于,在所述共识节点中已有区块时,通过所述共识节点对比所述已有区块与所述新生成区块的区块高度之后,还包括:若所述新生成区块的区块高度大于所述已有区块的区块高度,通过所述共识节点向所述区块链中其它共识节点要求同步区块并写入账本;

通过所述共识节点释放所述已有区块中剩余的区块并对所述新生成区块进行验证;

若验证通过,则生成通过所述当前提案的投票并广播至其它共识节点;

若验证未通过,则生成无赋值的投票并广播至其它共识节点。

3.如权利要求1所述的拜占庭容错共识方法,其特征在于,所述通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点,还包括:所述共识节点超时未接收到所述新生成区块时,通过所述共识节点生成无赋值的投票并广播至其它共识节点。

4.如权利要求1所述的拜占庭容错共识方法,其特征在于,若所述共识节点判断投票通过所述当前提案的票数在总票数中的占比超出预设阈值,则提交所述新生成区块,生成提交信息并广播至其它共识节点,还包括:所述共识节点未接收到所述新生成区块时,向所述区块链中其它共识节点要求同步所述新生成区块;

提交所述新生成区块,生成提交信息并广播至其它共识节点。

5.如权利要求1所述的拜占庭容错共识方法,其特征在于,所述在提案开始时,从区块链中关系对等的各共识节点中选取出主节点,包括:计算所述轮数编号与所述区块链中共识节点的总数量作除法运算后的余数;

选取编号为所述余数的共识节点为主节点。

6.如权利要求1所述的拜占庭容错共识方法,其特征在于,所述通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点,包括:所述主节点中已有一个未提交区块时,通过所述主节点释放原有区块并根据更新后的轮数编号重新打包原有交易生成区块;

将所述新生成区块广播至所述区块链中的共识节点。

7.如权利要求6所述的拜占庭容错共识方法,其特征在于,所述通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点,还包括:所述区块高度增加后,通过所述主节点打包新的交易生成区块并广播至所述区块链中的共识节点。

8.如权利要求1‑7所述的拜占庭容错共识方法,其特征在于,所述区块链中共识节点的总数量为奇数;所述预设阈值为1/2。

9.一种拜占庭容错共识系统,其特征在于,包括:

在提案开始时,从区块链中关系对等的各共识节点中选取出主节点;

主节点,用于打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号;

共识节点,用于对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;

所述共识节点还用于统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;

所述共识节点还用于统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;

所述主节点还用于提交所述当前提案;

其中,所述通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点,包括:所述共识节点中已有区块时,通过所述共识节点对比所述已有区块与所述新生成区块的区块高度;

若区块高度一致,则通过所述共识节点对所述新生成区块进行验证;

若验证通过,则释放所述已有区块,生成通过所述当前提案的投票并广播至其它共识节点;

若验证未通过,则保留所述已有区块,生成无赋值的投票并广播至其它共识节点。

说明书 :

一种拜占庭容错共识方法及系统

技术领域

[0001] 本发明涉及区块链技术领域,尤其涉及一种拜占庭容错共识方法及系统。

背景技术

[0002] 联盟区块链中的节点都是对等关系,存在于分布式的P2P网络中,而在P2P网络中,节点状态不可控,如节点宕机、网络延时甚至遭受攻击而作恶等,这些问题被模型化为拜占庭将军问题。拜占庭容错算法必须处理这些失效,并且这些算法还要满足所要解决问题的要求规范。
[0003] 当前实现拜占庭容错的算法有很多,具有代表性且应用于联盟区块链的有PBFT(实用拜占庭容错算法)、Tendermint以及Istanbul算法等。拜占庭容错算法需要在一致性以及可用性之间寻求平衡,目前这些算法的容错节点数是只能少于1/3节点,其中Tendermint和Istanbul都是针对区块链应用而做的算法设计,Tendermint算法设计了PoLC这样复杂的逻辑流程,虽解决了节点的可用性问题,但会进行很多的空轮,影响通信成本和性能,而Istanbul虽逻辑流程清晰简洁,但并没有解决1/3节点被锁的可用性问题。而且这两种算法都没有解决网络分区的问题,一旦网络发生分区,就有可能没有足够的节点来完成区块的提交,导致无法在真正的在容错基础上实现一致性与可用性的平衡。

发明内容

[0004] 有鉴于此,本发明实施例提供了一种拜占庭容错共识方法及系统,以解决拜占庭容错算法中网络分区导致区块链中节点状态不能达成一致和节点可用性的问题。
[0005] 本发明实施例的第一方面提供了一种拜占庭容错共识方法,包括:
[0006] 在提案开始时,从区块链中关系对等的各共识节点中选取出主节点;
[0007] 通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号;
[0008] 通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;
[0009] 通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;
[0010] 通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;
[0011] 通过所述主节点提交所述当前提案。
[0012] 在一个实施示例中,所述通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点,包括:
[0013] 所述共识节点中已有区块时,通过所述共识节点对比所述已有区块与所述新生成区块的区块高度;
[0014] 若区块高度一致,则通过所述共识节点对所述新生成区块进行验证;
[0015] 若验证通过,则释放所述已有区块,生成通过所述当前提案的投票并广播至其它共识节点;
[0016] 若验证未通过,则保留所述已有区块,生成无赋值的投票并广播至其它共识节点。
[0017] 在一个实施示例中,在所述共识节点中已有区块时,通过所述共识节点对比所述已有区块与所述新生成区块的区块高度之后,还包括:
[0018] 若所述新生成区块的区块高度大于所述已有区块的区块高度,通过所述共识节点向所述区块链中其它共识节点要求同步区块并写入账本;
[0019] 通过所述共识节点释放所述已有区块中剩余的区块并对所述新生成区块进行验证;
[0020] 若验证通过,则生成通过所述当前提案的投票并广播至其它共识节点;
[0021] 若验证未通过,则生成无赋值的投票并广播至其它共识节点。
[0022] 在一个实施示例中,所述通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点,还包括:
[0023] 所述共识节点超时未接收到所述新生成区块时,通过所述共识节点生成无赋值的投票并广播至其它共识节点。
[0024] 在一个实施示例中,若所述共识节点判断投票通过所述当前提案的票数在总票数中的占比超出预设数值,则提交所述新生成区块,生成提交信息并广播至其它共识节点,还包括:
[0025] 所述共识节点未接收到所述新生成区块时,向所述区块链中其它共识节点要求同步所述新生成区块;
[0026] 提交所述新生成区块,生成提交信息并广播至其它共识节点。
[0027] 在一个实施示例中,所述在提案开始时,从区块链中关系对等的各共识节点中选取出主节点,包括:
[0028] 计算所述轮数编号与所述区块链中共识节点的总数量作除法运算后的余数;
[0029] 选取编号为所述余数的共识节点为主节点。
[0030] 在一个实施示例中,所述通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点,包括:
[0031] 所述主节点中已有一个未提交区块时,通过所述主节点释放原有区块并根据更新后的轮数编号重新打包原有交易生成区块;
[0032] 将所述新生成区块广播至所述区块链中的共识节点。
[0033] 在一个实施示例中,所述通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点,还包括:
[0034] 所述区块高度增加后,通过所述主节点打包新的交易生成区块并广播至所述区块链中的共识节点。
[0035] 在一个实施示例中,所述区块链中共识节点的总数量为奇数;所述预设阈值为1/2。
[0036] 本发明实施例的第二方面提供了一种拜占庭容错共识系统,包括:
[0037] 在提案开始时,从区块链中关系对等的各共识节点中选取出主节点;
[0038] 主节点,用于打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号;
[0039] 共识节点,用于对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;
[0040] 所述共识节点还用于统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;
[0041] 所述共识节点还用于统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;
[0042] 所述主节点还用于提交所述当前提案。
[0043] 本发明实施例提供的一种拜占庭容错共识及系统,提案开始时从区块链中关系对等的各共识节点中选取出主节点;通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点;通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;通过所述主节点提交所述当前提案。本拜占庭容错共识流程步骤简单,逻辑清晰,拜占庭容错共识方法的容错率提高,解决了网络分区导致区块链中共识节点状态不能达成一致的问题。

附图说明

[0044] 为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0045] 图1是本发明实施例一提供的拜占庭容错共识方法的流程示意图;
[0046] 图2是本发明实施例一提供的拜占庭容错共识方法的共识流程示意图;
[0047] 图3是本发明实施例二提供的拜占庭容错共识方法的流程示意图;
[0048] 图4是本发明实施例三提供的服务器的结构示意图;
[0049] 图5是本发明实施例四提供的拜占庭容错共识系统的示意图。

具体实施方式

[0050] 为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
[0051] 本发明的说明书和权利要求书及上述附图中的术语“包括”以及它们任何变形,意图在于覆盖不排他的包含。例如包含一系列步骤或单元的过程、方法或系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。此外,术语“第一”、“第二”和“第三”等是用于区别不同对象,而非用于描述特定顺序。
[0052] 实施例一
[0053] 如图1所示,是本发明实施例一提供的拜占庭容错共识方法的流程示意图。本实施例可适用于联盟区块链的共识机制,联盟区块链中的节点都是对等关系,存在于分布式的P2P网络中。该方法可以由联盟区块链中相互通信连接的各共识节点服务器执行,在本发明实施例中以该服务器作为执行主体进行说明,该方法具体包括如下步骤:
[0054] S110、在提案开始时,从区块链中关系对等的各共识节点中选取出主节点。
[0055] 在联盟区块链中各共识节点开启新一轮共识过程时,进入提案(propose)状态,需从区块链的各共识节点(Validator节点)中选取出一个主节点(proposer)对交易进行打包生成区块。
[0056] 在一个实施示例中,联盟区块链中各共识节点均具有对应的编号,可根据联盟区块链中共识节点的总数量和共识轮数选取出主节点,具体为:计算所述轮数编号与所述区块链中共识节点的总数量作除法运算后的余数;选取编号为所述余数的共识节点为主节点。
[0057] 具体地,在每个共识节点中均记录有区块高度(Height)和共识过程的轮数编号(Round);其中,通过区块高度可对区块进行区分,区块高度的记录规则为每当一个区块在共识过程中被共识节点写入账本中则对记录的区块累计一次;可设置初始区块高度为1,初始轮数编号为1。由于在共识过程中可能出现节点宕机或掉线、提出的区块是无效块、投票数量不满足可容错数等问题,使得一个区块的提交可能需要经过多轮共识过程,通过共识轮数编号可记录共识过程的轮数,共识过程每结束一次对记录的轮数编号累计一次,并且可用R代表轮数编号。新一轮共识过程开始时,主节点的选取可通过公式V=R mod N计算得到;其中,V为共识节点的编号;N为联盟区块链中共识节点的总数量;R为当前轮数编号。mod为求余计算,通过上述公式可计算轮数编号R与所述区块链中共识节点的总数量N作除法运算后的余数,从而选取编号为上述公式计算后获得的余数的共识节点为主节点。
[0058] S120、通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号。
[0059] 在选取出主节点后,通过主节点从交易池中取出交易并对其进行打包生成区块并将新生成区块广播至主节点所在的联盟区块链中的其他共识节点。生成的区块包括两个部分,区块头和区块体;其中,区块头用于刻录当前区块的元信息,该元信息用于描述信息的结构、语义、用途和用法等,具体可包含上一区块的哈希,自身区块哈希,交易Merkel树根等信息;区块体包含交易的实际数据;并且生成的区块中还包含有时间戳以及主节点记录的此轮共识过程对应的区块高度(Height)和轮数编号(Round)。
[0060] 本实施例的一个实施示例中,在通过主节点从交易池中取出交易并对其进行打包生成区块之前,主节点检测自身内部是否存在有未提交的区块。主节点中已有一个未提交区块时,通过所述主节点释放原有区块并根据更新后的轮数编号重新打包原有交易生成区块;将所述新生成区块广播至所述区块链中的共识节点。
[0061] 具体地,当主节点中已有一个未提交区块时,说明在此轮共识过程中对比上一轮共识过程区块高度未发生变化,为防止主节点被原有的区块锁住,主节点释放原有区块,再根据主节点中记录的更新后的轮数编号重新打包当前区块高度对应的交易生成区块,并将新生成区块广播至所在的联盟区块链中的其它共识节点,从而实现共识节点的可用性。
[0062] 本实施例的另一个实施示例中,在通过主节点从交易池中取出交易并对其进行打包生成区块之前,若主节点中记录的区块高度增加,说明在此轮共识过程中对比上一轮共识过程区块高度增加。主节点的区块高度增加后,通过所述主节点打包新的交易生成区块并广播至所述区块链中的共识节点。
[0063] 具体地,若主节点中没有未提交区块并且主节点中记录的更新后的区块高度增加,说明在此轮共识过程为新区块的共识过程。因此在主节点的区块高度增加后,通过主节点从交易池中取出新交易后,打包新的交易生成区块并广播至所在联盟区块链中的其它共识节点。
[0064] S130、通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点。
[0065] 如图2所示,是本发明实施例一提供的拜占庭容错共识方法的共识流程示意图。通过主节点向联盟区块链中其它共识节点广播新生成区块后,联盟区块链中所有的共识节点进入投票(Vote)状态,除主节点以外的其它共识节点接收到主节点广播的新生成区块后,共识节点包括主节点对新生成区块进行验证。由于新生成区块可包括时间戳、前一个区块的哈希、区块头和交易信息等,通过区块链中每一共识节点可根据新生成区块中时间戳、前一个区块的哈希、区块头和交易信息等信息对新生成区块的真实性、可靠性及合法性进行验证。当共识节点判断新生成区块验证通过时,该共识节点生成通过当前提案的投票(Commit)并将该投票广播给所在的联盟区块链中的其它共识节点,该共识节点保存新生成区块对应的投票结果。当共识节点判断新生成区块验证未通过时,该共识节点生成无赋值的投票(nil)并将该投票广播给所在的联盟区块链中的其它共识节点,该共识节点保存新生成区块对应的投票结果。
[0066] S140、通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点。
[0067] 联盟区块链中共识节点对新生成区块投票后进入提交(Commit)状态,区块链中各共识节点对所接收到的新生成区块的投票和自身生成的投票进行统计,通过各共识节点判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值。
[0068] 可预设阈值作为拜占庭容错中的节点容错阈值。在一个实施示例中,预设阈值可设为1/2,即共识节点判断投票通过所述当前提案的票数在总票数中的占比是否超出一半。若共识节点判断投票通过所述当前提案的票数在总票数中的占比超出一半,则该共识节点提交新生成区块,此时该共识节点获得账本写入权,执行将新生成区块写入账本操作;生成对应的提交(commit block)信息并将该提交信息广播给所在的联盟区块链中的其它共识节点,该共识节点同时保存该新生成区块对应的提交信息。
[0069] 若共识节点判断投票通过所述当前提案的票数在总票数中的占比未超出一半,则该共识节点生成无赋值的提交(commit nil)信息并将该提交信息广播给所在的联盟区块链中的其它共识节点,该共识节点同时保存该新生成区块对应的提交信息。
[0070] 由于P2P网络中的节点状态不可控,如节点宕机、网络延时或者作恶等,使用该拜占庭容错共识能够解决联盟区块链中共识节点的容错,只要共识节点数的故障率小于1/2(假设拜占庭节点数为F,则本拜占庭容错共识方法要求总共识节点数为2F+1,即区块链中共识节点的总数量为奇数),联盟区块链就能达到最终状态一致,从而安全稳定高效地运行下去。在现有技术中实现拜占庭容错的算法的容错节点数是只能少于1/3节点,通过设置预设阈值为1/2提高拜占庭容错共识方法的容错率,解决了网络分区导致区块链中节点状态不能达成一致的问题,节约通信成本和服务器性能。
[0071] S150、通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一。
[0072] 联盟区块链中各共识节点根据新生成区块的投票结果广播提交信息后进入预准备(Committed)状态,区块链中各共识节点对所接收到的新生成区块的提交信息和自身生成的提交信息进行统计,通过各共识节点判断提交信息总数中真实的提交信息的数量占比是否超出预设阈值。
[0073] 可预设阈值作为拜占庭容错中的节点容错阈值。在一个实施示例中,预设阈值可设为1/2,即共识节点判断提交信息总数中真实的提交信息(commit block)的数量占比是否超出一半。若共识节点判断提交信息总数中真实的提交信息(commit block)的数量占比超出一半,则该共识节点分别对记录的区块高度和轮数编号累计加一。
[0074] 若共识节点判断提交信息总数中真实的提交信息(commit block)的数量占比未超出一半,即提交信息总数中无赋值的提交信息(commit nil)的数量占比超出一半,则该共识节点对记录的轮数编号累计加一,记录的区块高度保持不变。说明新生成区块在此轮共识过程提交失败需进行下一轮共识过程。
[0075] S160、通过所述主节点提交所述当前提案。
[0076] 联盟区块链中各共识节点根据新生成区块的提交信息的统计判断结果更新区块高度和轮数编号后,结束此轮共识过程即提交当前提案。通过主节点提交当前提案,以开启下一轮提案(共识过程)。
[0077] 本发明实施例提供的一种拜占庭容错共识方法,提案开始时从区块链中关系对等的各共识节点中选取出主节点;通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点;通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;通过所述主节点提交所述当前提案。本拜占庭容错共识流程步骤简单,逻辑清晰,拜占庭容错共识方法的容错率提高,解决了网络分区导致区块链中共识节点状态不能达成一致的问题。
[0078] 实施例二
[0079] 如图3所示,是本发明实施例二提供的拜占庭容错共识方法的流程示意图。在实施例一的基础上,本实施例还提供了共识过程中共识节点区块进行同步和区块释放的过程,从而解决节点可用性的问题。
[0080] S210、在提案开始时,从区块链中关系对等的各共识节点中选取出主节点;
[0081] S220、通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号;
[0082] S230、所述共识节点中已有区块时,通过所述共识节点对比所述已有区块与所述新生成区块的区块高度。
[0083] 通过主节点向联盟区块链中其它共识节点广播新生成区块后,联盟区块链中所有的共识节点进入投票(Vote)状态,除主节点以外的其它共识节点接收到主节点广播的新生成区块后,共识节点包括主节点对新生成区块进行验证。
[0084] 在验证过程中,当某一共识节点中已有区块时,由于区块包括区块高度,该共识节点可通过对比已有区块的区块高度和接收到的新生成区块的区块高度,判断已有区块是否与当前提案相关。
[0085] S240、若区块高度一致,则通过所述共识节点对所述新生成区块进行验证;若验证通过,则释放所述已有区块,生成通过所述当前提案的投票并广播至其它共识节点;若验证未通过,则保留所述已有区块,生成无赋值的投票并广播至其它共识节点。
[0086] 当共识节点判断自身已有区块的区块高度与新生成区块的区块高度一致时,说明已有区块和新生成区块中包含的交易信息相同,只是区块中的轮数编号不一致,当前提案为该交易对应的区块的新一轮共识过程。则该共识节点依旧对新生成区块进行验证。
[0087] 当该共识节点判断新生成区块验证通过时,该共识节点生成通过当前提案的投票(Commit)并将该投票广播给所在的联盟区块链中的其它共识节点,该共识节点保存新生成区块对应的投票结果。并且为防止该共识节点被已有区块锁住,而不能对新生成区块进行投票的情况,该共识节点释放已有区块。
[0088] 当共识节点判断新生成区块验证未通过时,该共识节点生成无赋值的投票(nil)并将该投票广播给所在的联盟区块链中的其它共识节点,该共识节点保存新生成区块对应的投票结果。由于新生成区块未通过验证为无效区块,该共识节点保留已有区块。
[0089] S250、若所述新生成区块的区块高度大于所述已有区块的区块高度,通过所述共识节点向所述区块链中其它共识节点要求同步区块并写入账本;通过所述共识节点释放所述已有区块中剩余的区块并对所述新生成区块进行验证;若验证通过,则生成通过所述当前提案的投票并广播至其它共识节点;若验证未通过,则生成无赋值的投票并广播至其它共识节点;
[0090] 当共识节点判断新生成区块的区块高度大于自身已有区块的区块高度时,说明已有区块和新生成区块中包含的交易信息不相同,该共识节点在接收到新生成区块之前可能存在长时间宕机或掉线的情况。则在该共识节点对新生成区块进行验证之前,需通过该共识节点向所在的联盟区块链中其它共识节点要求同步区块并将同步获得的区块写入账本,确保联盟区块链中各共识节点的一致性。
[0091] 在该共识节点向其它共识节点要求同步区块并将同步获得的区块写入账本后,该共识节点内已有区块中可能还剩余有无效区块或投票数不满足容错数的原有区块等,该共识节点将已有区块中剩余的区块释放,以防止该共识节点被已有区块锁住。之后,该共识节点依旧对新生成区块进行验证。
[0092] 当该共识节点判断新生成区块验证通过时,该共识节点生成通过当前提案的投票(Commit)并将该投票广播给所在的联盟区块链中的其它共识节点,该共识节点保存新生成区块对应的投票结果。当共识节点判断新生成区块验证未通过时,该共识节点生成无赋值的投票(nil)并将该投票广播给所在的联盟区块链中的其它共识节点,该共识节点保存新生成区块对应的投票结果。
[0093] S260、所述共识节点超时未接收到所述新生成区块时,通过所述共识节点生成无赋值的投票并广播至其它共识节点。
[0094] 通过主节点向联盟区块链中其它共识节点广播新生成区块后,联盟区块链中所有的共识节点进入投票(Vote)状态,除主节点以外的其它共识节点接收到主节点广播的新生成区块后,共识节点包括主节点对新生成区块进行验证。为避免共识节点在投票状态中因未接收到新生成区块而持续等待,无法进入共识过程的下一状态。限定各共识节点在一定时间内对新生成区块进行投票,当共识节点超时未接收到新生成区块时,通过该共识节点生成无赋值的投票并广播至区块链中其它共识节点。
[0095] S270、通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若否,则生成无赋值的提交信息并广播至其它共识节点;若是,所述共识节点未接收到所述新生成区块时,向所述区块链中其它共识节点要求同步所述新生成区块;提交所述新生成区块,生成提交信息并广播至其它共识节点。
[0096] 联盟区块链中共识节点对新生成区块投票后进入提交(Commit)状态,区块链中各共识节点对所接收到的新生成区块的投票和自身生成的投票进行统计,通过各共识节点判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值。
[0097] 可预设阈值作为拜占庭容错中的节点容错阈值。在一个实施示例中,预设阈值可设为1/2,即共识节点判断投票通过所述当前提案的票数在总票数中的占比是否超出一半。若共识节点判断投票通过所述当前提案的票数在总票数中的占比超出一半,而该共识节点未接收到新生成区块时,需向所在联盟区块链中其它共识节点要求同步新生成区块;从而在获得新生成区块后提交新生成区块,此时该共识节点获得账本写入权,执行将新生成区块写入账本操作;生成对应的提交(commit block)信息并将该提交信息广播给所在的联盟区块链中的其它共识节点,该共识节点同时保存该新生成区块对应的提交信息。
[0098] S280、通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一。
[0099] S290、通过所述主节点提交所述当前提案。
[0100] 在联盟区块链各共识节点对新生成区块验证时,通过设置区块释放条件让已有区块的共识节点对已有区块进行释放或保留,避免共识节点被已有区块锁住的情况,解决了节点可用性的问题。并且通过区块同步确保联盟区块链中各共识节点的一致性。
[0101] 实施例三
[0102] 图4是本发明实施例三提供的服务器的结构示意图。在实施例一或实施例二的基础上,本发明实施例还提供了一种服务器4。在提案开始时,从区块链中关系对等的各共识节点中选取出主节点后,该服务器包括:
[0103] 区块生成模块401,用于通过所述主节点用于打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号;
[0104] 共识节点投票模块402,用于通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;
[0105] 在一个实施示例中,共识节点投票模块402通过所述共识节点对接收的新生成区块进行验证还包括:
[0106] 所述共识节点中已有区块时,区块高度对比单元,用于通过所述共识节点对比所述已有区块与所述新生成区块的区块高度;
[0107] 共识节点对比所述已有区块与所述新生成区块的区块高度一致时,第一验证单元,用于通过所述共识节点对所述新生成区块进行验证;
[0108] 新生成区块验证通过时,区块释放和投票单元,用于释放所述已有区块,生成通过所述当前提案的投票并广播至其它共识节点;
[0109] 新生成区块验证未通过,区块保留单元,用于保留所述已有区块,生成无赋值的投票并广播至其它共识节点。
[0110] 所述新生成区块的区块高度大于所述已有区块的区块高度时,区块同步单元,用于通过所述共识节点向所述区块链中其它共识节点要求同步区块并写入账本;
[0111] 第二验证单元,用于通过所述共识节点释放所述已有区块中剩余的区块并对所述新生成区块进行验证;
[0112] 新生成区块验证通过,第一投票单元,用于生成通过所述当前提案的投票并广播至其它共识节点;
[0113] 新生成区块验证未通过,第二投票单元,用于生成无赋值的投票并广播至其它共识节点;
[0114] 所述共识节点超时未接收到所述新生成区块时,第三投票单元,用于通过所述共识节点生成无赋值的投票并广播至其它共识节点。
[0115] 投票结果判断模块403,用于通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设数值;
[0116] 在一个实施示例中,投票结果判断模块403通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设数值时还包括:
[0117] 判断投票通过所述当前提案的票数在总票数中的占比超出预设数值时,区块提交单元,用于提交所述新生成区块,生成提交信息并广播至其它共识节点;
[0118] 判断投票通过所述当前提案的票数在总票数中的占比超出预设数值且共识节点未接收到所述新生成区块时,区块同步和提交单元,用于向所述区块链中其它共识节点要求同步所述新生成区块;提交所述新生成区块,生成提交信息并广播至其它共识节点;
[0119] 判断投票通过所述当前提案的票数在总票数中的占比未超出预设数值时,提交信息生成单元,用于生成无赋值的提交信息并广播至其它共识节点。
[0120] 提交信息判断模块404,用于通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;
[0121] 若判断所述提交信息总数中真实的提交信息的数量占比超出所述预设阈值,第一记录单元,用于对记录的区块高度和所述轮数编号累计加一;
[0122] 若判断所述提交信息总数中真实的提交信息的数量占比未超出所述预设阈值,第二记录单元,用于对记录的所述轮数编号累计加一;
[0123] 提案结束模块405,用于通过所述主节点提交所述当前提案。
[0124] 本发明实施例提供的一种服务器,提案开始时从区块链中关系对等的各共识节点中选取出主节点;通过所述主节点打包交易生成区块并广播至所述区块链中的共识节点;通过所述共识节点对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;通过所述共识节点统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;通过所述共识节点统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;通过所述主节点提交所述当前提案。本拜占庭容错共识流程步骤简单,逻辑清晰,提高拜占庭容错共识方法的容错率,解决了网络分区的问题。
[0125] 实施例四
[0126] 图5是本发明实施例四提供的拜占庭容错共识系统的示意图。该系统包括:
[0127] 在提案开始时,从区块链中关系对等的各共识节点中选取出主节点;
[0128] 主节点,用于打包交易生成区块并广播至所述区块链中的共识节点;其中,所述区块包括区块高度和轮数编号;
[0129] 共识节点,用于对接收的新生成区块进行验证,根据验证结果对当前提案进行投票并广播至其它共识节点;
[0130] 所述共识节点还用于统计所述新生成区块的投票,判断投票通过所述当前提案的票数在总票数中的占比是否超出预设阈值;若是,则提交所述新生成区块,生成提交信息并广播至其它共识节点;若否,则生成无赋值的提交信息并广播至其它共识节点;
[0131] 所述共识节点还用于统计所述新生成区块的提交信息,判断所述提交信息总数中真实的提交信息的数量占比是否超出所述预设阈值;若是,则对记录的所述区块高度和所述轮数编号累计加一;若否,则对记录的所述轮数编号累计加一;
[0132] 所述主节点还用于提交所述当前提案。
[0133] 通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现。所述的程序可以存储于可读取存储介质中,所述的存储介质,如随机存储器、闪存、只读存储器、可编程只读存储器、电可擦写可编程存储器、寄存器等。该存储介质位于存储器,处理器读取存储器中的信息,结合其硬件执行本发明各个实施例所述的方法。
[0134] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
[0135] 所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0136] 在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
[0137] 本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
[0138] 在本发明所提供的实施例中,应该理解到,所揭露的装置/终端设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/终端设备实施例仅仅是示意性的,例如,所述模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
[0139] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0140] 另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
[0141] 所述集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read‑Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
[0142] 以上所述实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。