掌桥专利:专业的专利平台
掌桥专利
首页

区块链共识方法、装置及系统

文献发布时间:2023-06-19 12:13:22


区块链共识方法、装置及系统

技术领域

本申请涉及区块链技术领域,具体而言,涉及一种区块链共识方法、装置 及系统。

背景技术

实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)算法,可以 在系统中作恶节点少于三分之一的情况下,保证系统的正确性(如,避免分叉)。 在区块链网络或系统中应用实用拜占庭容错算法时,系统中每产生一个区块, 都要经历一轮共识,每一轮共识对应一个视图(view),每个视图包括一个主 节点(primary)和多个从节点(backup),主节点和多个从节点在该视图上对 某个区块进行共识。其中,从第一个区块开始,对每轮共识进行编号,该编号 即为视图序号(view number)。

上述的主节点又可以称作区块发起者,从节点又可以称作区块验证者。在 区块链系统中,开始拜占庭共识之前,首先需要指定一个区块验证者集合,对 集合中的区块验证者排序并分配序号,然后展示给系统中所有的参与者。在确 定区块验证者集合后,需要从区块验证者集合中选择一个区块发起者,由区块 发起者生成区块,并在系统中进行广播,以进行后续共识流程。

但是,现有的实用拜占庭容错算法中,每轮共识中选择的区块发起者(即 主节点),很容易被预测到,导致被攻击的风险非常大。

发明内容

本申请实施例提供了一种区块链共识方法、装置及系统,用于解决将PBFT 算法应用于区块链系统时,一轮共识的主节点容易被攻击者预测到所导致的被 攻击风险高的问题。

根据本申请实施例的第一个方面,提供了一种区块链共识方法,应用于区 块链系统中的副本节点,该方法包括:

在所述区块链系统中广播第一预准备消息,并接收所述区块链系统中的其 他副本节点广播的第二预准备消息,其中,所述区块链系统中的任一副本节点 广播的预准备消息包括该副本节点生成的候选区块和随机数;

从所述第一预准备消息和所述第二预准备消息各自包括的随机数中确定 一目标随机数,将所述区块链系统中生成所述目标随机数的副本节点确定为当 前视图的主节点;

若确定所述区块链系统对所述主节点生成的候选区块达成共识,则将所述 主节点生成的候选区块写入本地区块链。

根据本申请实施例的第二个方面,提供了一种区块链共识装置,应用于区 块链系统中的副本节点,所述装置包括:

收发模块,用于在所述区块链系统中广播第一预准备消息,并接收所述区 块链系统中的其他副本节点广播的第二预准备消息,其中,所述区块链系统中 的任一副本节点广播的预准备消息包括该副本节点生成的候选区块和随机数;

主节点选择模块,用于从所述第一预准备消息和所述第二预准备消息各自 包括的随机数中确定一目标随机数,将所述区块链系统中生成所述目标随机数 的副本节点确定为当前视图的主节点;

共识模块,用于在确定所述区块链系统对所述主节点生成的候选区块达成 共识的情况下,将所述主节点生成的候选区块写入本地区块链。

根据本申请实施例的第三个方面,提供了一种区块链系统,包括多个副本 节点,所述区块链系统中的至少2f+1个副本节点通过本申请实施例的第一个 方面提供的方法进行共识处理,f表示所述区块链系统的各副本节点中拜占庭 节点的数量,f为大于0的整数。

根据本申请实施例的第四个方面,提供了一种计算机可读存储介质,其上 存储有机器可执行指令,该机器可执行指令被执行时实现本申请实施例的第一 个方面提供的方法。

本申请实施例提供的方案中,区块链系统中的副本节点在一轮共识开始后 生成候选区块和随机数,并携带在预准备消息中广播出去,使得其他副本节点 可以基于接收的预准备消息中的随机数选举出主节点,进而对主节点生成的候 选区块进行后续共识流程。如此,提供了一种安全随机地选举主节点的方式, 由于一轮共识的主节点是基于各副本节点生成的随机数选择出的,相较于现有 PBFT算法中的主节点确定方式,降低了视图中主节点被攻击者预测到的几率, 进而降低了被攻击的风险。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分, 本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限 定。在附图中:

图1为相关技术中的实用拜占庭容错算法的共识过程示意图;

图2为本申请实施例提供的一种区块链系统的架构示意图;

图3为本申请实施例提供的一种区块链共识方法的流程示意图;

图4为本申请实施例提供的区块链共识方法的又一流程示意图;

图5为本申请实施例提供的区块链共识方法的又一流程示意图;

图6为图3所示步骤S140的一种子步骤示意图;

图7为图6所示步骤S142的一种子步骤示意图;

图8为图7所示步骤S142-2的一种子步骤示意图;

图9为为图3所示步骤S140的另一种子步骤示意图;

图10为图6所示步骤S144的一种子步骤示意图;

图11为本申请实施例提供的一种字典树的结构示意图;

图12为图3所示步骤S160的子步骤示意图;

图13为本申请实施例提供的区块链系统的共识过程示意图;

图14为本申请实施例提供的一种区块链共识装置的框图;

图15为本申请实施例提供的一种副本节点的框架示意图。

具体实施方式

拜占庭将军问题提出后,有很多的算法被提出用以解决该问题。这类算法 统称为拜占庭容错算法(Byzantine Fault Tolerance,BFT),PBFT算法是这类 算法应用较为广泛的一种。

一个例子中,拜占庭系统包括节点0、节点1、节点2和节点3,其中,节 点3为拜占庭节点(即,恶意或故障节点),节点0、1、2为非拜占庭节点。 所述拜占庭系统中的每个节点可以称为replica(副本节点),用于提供副本复 制服务。所述该拜占庭系统中每轮共识对应一个视图,每个视图包括主节点和 多个从节点。一轮共识包括request(请求)、pre-prepare(预准备)、prepare(准 备)、commit(确认)、reply(响应)共5个阶段。下面结合图1,对上述系统 的一轮共识过程进行介绍。

1、在一轮共识开始前,系统中的所有节点均为从节点,开始一轮共识后, 从各从节点中选择一个作为主节点,选择的规则是:使用当前视图序号(view number)与副本节点的数量(backup number)做模运算,并将得到的结果作为 从节点的索引,换言之,将具有该索引的从节点确定为本轮共识(当前视图) 的主节点。其中,视图的序号是随着共识的轮次而递增的。值得说明的是,图 1示出的是节点0为主节点,而节点1、2、3均为从节点的情况。还值得说明 的是,当主节点故障或者从节点怀疑主节点有问题时,将会触发视图更换(view change),从而重新选择主节点,并进入新的视图。

2、主节点0接收客户端(client)发送的请求,根据该请求广播pre-prepare (预准备)消息。

3、从节点1、2和3接收主节点0发送的pre-prepare消息,其中,非拜占 庭节点1和2验证pre-prepare消息的正确性后,广播prepare(准备)消息, 然后进入prepared(准备)状态,等待并收集额定数量的prepare消息。

4、非拜占庭节点0、1和2收到额定数量的prepare消息后,广播commit (确认)消息,然后进入committed(确认)状态。

5、非拜占庭节点0、1和2收到额定数量的commit消息后,确定达成本 轮共识,向客户端返回reply(响应)。

值得说明的是,当在区块链系统中应用上述PBFT算法时,client角色可 以被删除,在此情况下,区块链节点既充当副本节点,又充当client。相应地, 上述5个阶段中的request阶段和reply阶段也可以省略,而是采用打包区块指 进行替代。换言之,主节点可以在每轮共识后,定时产生打包区块指令,从而 自动开启一轮共识。

在实现本申请的过程中,发明人发现,每轮共识的主节点是在该轮共识开 始之前,基于副本节点数量以及当前视图的序号按照固定计算方式确定的,副 本节点数量是一个常数,而视图的序号是从零开始依次递增的整数,且每次递 增的量不能大于某个常数,通常为1。在此情况下,攻击者非常容易根据前一 视图的序号提前预测出当前视图的序号,并提前预测出当前视图的主节点,从 而频繁且有针对性地攻击主节点,导致共识一直处于视图更换(view change) 超时状态,进而使系统瘫痪或性能严重降低。

针对上述问题,本申请实施例提供了一种区块链共识方法、装置及系统, 区块链系统中的副本节点生成候选区块和随机数,并通过预准备消息将候选区 块和随机数广播出去。这样,区块链系统中的每个副本节点都可以根据接收的 预准备消息中的随机数来选举主节点。由于每个副本节点生成的随机数的预测 存在难度,而主节点是基于各副本节点提供的随机数来选举出的,可以增加主 节点被预测的难度,因而,相较于现有PBFT算法中的主节点确定方式,本申 请的方案降低了视图中主节点被预测到的几率,进而降低了被攻击者的风险。

值得说明的是,针对以上方法所存在的缺陷,均是发明人在经过实践并仔 细研究后得出的结果,因此,上述问题的发现过程以及下文中本申请针对上述 问题所提出的解决方案,都应该是发明人在发明过程中对本申请做出的贡献。

为了使本申请实施例中的技术方案及优点更加清楚明白,以下结合附图对 本申请的示例性实施例进一步的说明,显然,所描述的实施例仅是本申请的一 部分实施例,而不是所有实施例的穷举。需要说明的是,在不冲突的情况下, 本申请中的实施例及实施例中的特征可以相互组合。

图2是本申请实施例提供的一种区块链系统10的架构示意图,其中包括 多个副本节点,例如副本节点100、101、102以及103。区块链系统10中的副 本节点的数量为3f+1,其中f表示的是区块链系统10中的拜占庭节点的数量, 即恶意或故障节点的数量。换句话说,区块链系统10中至少存在2f+1个非拜 占庭节点,这些节点可以按照本申请实施例提供的区块链共识方法进行每轮共 识处理。区块链系统10中的副本节点均为对等节点,两两之间可以通信。可 以理解,本申请实施例中提及的副本节点,例如可以是终端设备(如,平板电脑、笔记本电脑、个人计算机)或服务器,这里的服务器例如可以是独立的物 理服务器,也可以是多个物理服务器构成的服务器集群,还可以是提供云计算、 大数据等基础云计算服务的云服务器。本申请实施例对此没有限制。

可选地,本实施例中,区块链系统10例如可以是供应链金融系统,比如, 可以是在银行、上游龙头企业与中小企业之间建立的区块链网络。在此场景下, 中小企业可以通过区块链向银行提供抵押或具有偿还能力的证明,该证明例如 可以是中小企业与上下游企业的货单信息、合同信息等。中小企业在提供证明 时,需要上下游企业为其提供真实性证明。基于此,银行可以利用中小企业通 过区块链提供的证明,评估是否为其贷款。此外,本实施例提供的区块链系统 10还可以用于跨境贸易支付和结算、防伪溯源等参与方数量有限的场景。

图3为本申请实施例提供的一种区块链共识方法的流程示意图,可以应用 于图2所示的区块链系统10中的任一副本节点。为了便于理解,本实施例将 以副本节点100为例对所述方法包括的步骤进行阐述。参照图3,所述方法具 体可以包括如下步骤。

S120,在区块链系统中广播第一预准备消息,并接收其他副本节点广播的 第二预准备消息,任一副本节点广播的预准备消息包括该副本节点生成的候选 区块和随机数。

其中,第一预准备消息是指副本节点广播出去的预准备消息,而第二预准 备消息是指副本节点接收到的预准备消息。以副本节点100为例,副本节点100 自身生成并广播出去一个预准备消息pre-prepare0,接收到两个预准备消息(如, pre-prepare1和pre-prepare2),则pre-prepare0对于副本节点100而言是第一预 准备消息,pre-prepare1和pre-prepare2对于副本节点100而言是第二预准备消 息。可以理解,如果副本节点100广播出去的预准备消息pre-prepare0被其他 任意一个副本节点(如101、102或103)接收到,预准备消息pre-prepare0对 于其他任意一个副本节点而言是第二预准备消息。

其中,区块链系统10中的副本节点100可以在完成一轮共识后,定时自 动生成一请求,用于触发开始新一轮的共识。本实施例中,在一轮共识开始后, 副本节点100直接进行预准备消息的广播。具体地,副本节点100可以将本节 点获得的交易信息进行区块打包,生成候选区块;此外,还会生成一随机数, 将候选区块和随机数一并携带在预准备消息中广播给其他副本节点。可以理解, 本实施例是以副本节点100是非拜占庭节点为例进行阐述的。当副本节点100 是拜占庭节点时,副本节点100有可能不会按照本申请实施例所提供的共识方 法进行处理,而是会执行其他操作,以阻止区块链系统10达成本轮共识,或 达成错误的共识。

类似地,区块链系统10中的其他副本节点也可以按照步骤S120进行处理。 这样,区块链系统10中的每个副本节点都可以接收到多个其他副本节点发送 的第二预准备消息,而所接收的每个第二预准备消息都携带有一随机数。

S140,从所述第一预准备消息和所述第二预准备消息各自包括的随机数中 确定一目标随机数,将所述区块链系统中生成所述目标随机数的副本节点确定 为当前视图的主节点。

副本节点100在接收到多个第二预准备消息后,可以将各第二预准备消息 中的随机数以及本节点生成的第一预准备消息中的随机数确定为候选随机数, 并基于预设条件,从各候选随机数中选择符合所述预设条件的随机数作为目标 随机数。示例性地,这里的目标随机数可以是各候选随机数中值最小的一者。 在确定目标随机数之后,可以将目标随机数所在的预准备消息的发送者确定为 主节点。可以理解,这里的目标随机数有可能是第一预准备消息中的随机数, 这种情况下,副本节点100即为主节点。目标随机数也可以是第二预准备消息 中的随机数,这样主节点是副本节点100之外的其他副本节点。

S160,若确定所述区块链系统对所述主节点生成的候选区块达成共识,则 将所述主节点生成的候选区块写入本地区块链。

本实施例中,区块链系统10中的其他副本节点均可以按照S140进行主节 点选取。每个副本节点在确定当前视图的主节点之后,均可以对本节点确定的 主节点所生成的候选区块进行后续共识处理流程,并基于所述后续共识流程确 定区块链系统10是否对主节点所生成的候选区块是否达成共识。

本实施例中,以副本节点100为例,如果副本节点100确定区块链系统10 对主节点生成的候选区块达成了共识,可以将该候选区块追加到本地区块链中。 对应地,该候选区块将成为本地区块链的最新区块。

通过图3所示的区块链共识方法,区块链系统中的副本节点可以将随机数 携带在预准备消息中广播出去,从而使得其他副本节点可以基于自身生成的随 机数以及接收到的预准备消息中的随机数中选举出主节点,随机数由于其随机 性,存在一定的预测难度,相应地,基于随机数选举出的主节点也存在一定的 预测难度。换言之,本实施例提供的方案降低了一轮共识中的主节点被预测到 的几率,从而降低了被攻击的风险。

进一步地,参照上述图1所示的PBFT算法的共识过程,PBFT算法是在 进行主节点选举之后,再由主节点打包区块。然而,从主节点的产生到打包区 块是有时间差的,这个时间差会给攻击者攻击的机会。而本申请实施例的方案 是各个备份节点分别进行区块打包之后,再进行主节点的选举,在选举出主节 点时,当前视图内主节点打包的区块同时也确定了,即主节点确定以及由主节 点打包的区块的获得基本是同时实现的,两者之间基本没有时间差,即没有给 攻击者在该时间差内进行攻击的机会,从而进一步减小了主节点被攻击的风险。

请一并参照图3和图4,下面结合图4对图3所示的步骤的详细实现过程 进行阐述。

发明人进一步研究发现,实数范围内的随机数生成算法,其值域通常是固 定的,比如是1-100。这种情况下,在选择条件给定的情况下,比如当选择条 件是值最小,那么可以明确地从该值域内选择出最小值1。相应地,为了成为 主节点,副本节点有可能会直接声明它的随机数是1,而不需要真的去生成一 个随机数。另外,主节点选举过程对于区块链系统100中的各副本节点应当是 公平的,换句话说,区块链系统10中的每个副本节点被选举为主节点的概率 应当是基本相同的。基于此,本申请实施例中,副本节点可以通过哈希算法对 本节点的相关信息进行处理,以获得本节点的用于参与主节点选举的随机数。 可选地,在本申请实施例的一个例子中,在执行上述的步骤S120之前,本申 请实施例提供的方法还可以包括图4所示步骤。

S111,生成本节点的候选区块。

S112,获取本地区块链的最新区块的哈希值和当前视图的序号。

S113,对所述本地区块链的最新区块的哈希值以及当前视图的序号进行哈 希处理,得到本节点的随机数。

S114,生成包括本节点的候选区块和本节点的随机数的预准备消息,并将 该预准备消息确定为所述第一预准备消息。

以副本节点100为例对上述流程进行介绍。副本节点100可以根据本节点 获得的交易信息进行区块打包。这里的最新区块是指副本节点100在上一轮共 识中写入本地区块链的区块,其通常是上一轮共识中主节点生成的区块,并且 该区块得到了区块链系统10中副本节点的共识。当前视图是指本轮共识对应 的视图。

副本节点100在获得本地区块链的最新区块的哈希值以及当前视图的序号 之后,可以通过预设的哈希函数对该哈希值和序号进行哈希处理,该预设的哈 希函数输出的结果即为副本节点100的随机数。然后,副本节点100可以将上 述生成的候选区块以及随机数组装成预准备消息,该预准备消息即为副本节点 100需要广播出去的第一预准备消息。

值得说明的是,区块链系统10中的其他副本节点可以按照图4所示流程 生成各自的第一预准备消息并广播出去。

示例性地,上述流程中生成随机数的过程可以表示为random=hash(seed), 这里的random表示随机数,hash表示所采用的预设哈希函数,而seed表示副 本节点获得的本地区块链的最新区块哈希值以及当前视图的序号。这种情况下, 所采用的seed不同,输出的随机数也是不同的,因而可以通过seed来实现对 随机数的验证。并且,哈希函数的值在其值域内是均匀分布的,因而,通过图 4所示流程,可以确保各个副本节点提供的随机数可被验证,并且可以保证各 个副本节点被选举为主节点的概率基本相同。

发明人在实践过程中进一步研究发现,为了实现对随机数的验证,需要将 seed公开。然而,seed一旦被公开,则任何副本节点都可以使用这个seed生 成相同的随机数,导致无法确定一个随机数的最先生成者。

基于此,本申请实施例中,区块链系统10的任一副本节点广播的预准备 消息还可以包括该预准备消息的随机数的零知识证明。换言之,S120中的第一 预准备消息和第二预准备消息各自还包括一零知识证明。这样,可以选择只将 用于生成随机数的部分信息公开出去,即可实现对随机数的验证。

对应地,请参照图5,其中示例性地示出了本申请实施例的另一个例子中, 在执行S120之前,本申请实施例提供的方法还可以包括图5所示步骤。详细 描述如下。

S111,生成本节点的候选区块。

S112,获取本地区块链的最新区块的哈希值和当前视图的序号。

其中,步骤S111和S112的详细实现过程可以参照上文的相关描述。

S115,获取本节点的非对称密钥对中的私钥。

S116,通过可验证随机函数(VerifiableRandomFunction,VRF)对所述私 钥和所述哈希值进行处理,得到本节点的随机数和针对该随机数的零知识证明。

本实施例中,可验证随机函数对于特定的密钥和输入x,可以产生唯一的 输出,同时该输入可以验证。可验证随机函数主要由三个多项式时间算法组成, 分别是函数生成器G、函数评估器F以及函数验证器V。

其中,G是概率性的算法,其用于接收一个安全参数k(即一个字符串) 作为输入,输出为两个二进制字符串,即上述的非对称密钥对,包括公钥PK 和私钥SK。本申请实施例中,该算法G例如可以是椭圆曲线算法。

函数评估器F是确定性算法,F=(F

S117,销毁本节点的私钥。

由于随机数和零知识证明的生成过程利用了副本节点的私钥,可以在获得 随机数和零知识证明之后,将本节点的私钥销毁。如此,可以防止攻击者利用 主节点选举结束,而共识还没有达到准备(prepare)阶段的时间间隙攻击主节 点,并利用主节点的私钥重新打包区块。这样,本实施例中每个副本节点使用 的私钥实际上是临时私钥,进一步提升了数据安全。

S118,生成包括本节点的候选区块、本节点的随机数以及该随机数的零知 识证明的预准备消息,并将该预准备消息确定为所述第一预准备消息。

在获得随机数和零知识证明后,可以将随机数、零知识证明以及候选区块 组装成预准备消息,并将其确定为第一预准备消息。如此,随机数及其零知识 证明经会携带在第一预准备消息中广播出去,其他副本节点则可以其中的零知 识证明来验证该随机数。基于此,图3所示的步骤S140中从所述第一预准备 消息和接收的所述第二预准备消息各自包括的随机数中确定一目标随机数的 步骤,可以通过图6所示步骤S142和S144实现。

S142,根据所述第二预准备消息中的零知识证明,验证所述第二预准备消 息中的随机数。

其中,步骤S142可以通过图7所示的子步骤实现。

S142-1,获取本节点的所述非对称密钥对中的公钥。

本实施例中,以副本节点100为例,副本节点100可以在获得本节点的非 对称密钥之后,将公钥及自身节点标识广播出去,以使其他副本节点知晓。类 似地区块链系统10中的其他副本节点也可以通过类似方式将公钥公开给其他 副本节点知晓。

S142-2,基于所述公钥和所述第二预准备消息中的零知识证明,验证所述 第二预准备消息中的随机数。

具体地,步骤S142-2可以包括图8所示流程。

S801,从所述第二预准备消息包括的零知识证明中恢复出一随机数。

S802,若恢复出的随机数与所述第二预准备消息包括的随机数相同,则将 当前视图的序号、从广播所述第二预准备消息的其他副本节点获得的最新区块 的哈希值以及所述第二预准备消息中的随机数和零知识证明输入所述函数验 证器。

S803,若所述函数验证器的输出结果为真,则确定所述第二预准备消息中 的随机数验证通过。

本实施例中,对于随机数的验证可以借助可验证随机函数的函数验证器V 实现。函数验证器V也是概率性的,其以公钥PK、上述输入x、随机数value 以及零知识证明proof为输入,输出TRUE或FALSE,TRUE表示验证通过, FALSE表示验证不通过。

以副本节点100是本实施例所提供方法的当前执行主体为例,假如副本节 点100接收到副本节点101发送的第二预准备消息pre-prepare1,则副本节点 100可以从所接收预准备消息pre-prepare1中获取零知识证明,并可以利用函 数VRF_P2H从零知识证明中恢复出一个随机数,如果恢复出的随机数和 pre-prepare1中携带的随机数相等,则可以进一步从副本节点101处获得其本 地区块链的最新区块的哈希值,并可以将获取的零知识证明、哈希值、 pre-prepare1中的随机数以及零知识证明作为函数验证器的输入,然后基于得 到的输出确定随机数验证是否通过。具体地,如果输出的是TRUE,则表示随 机数验证通过。如果输出的是FALSE,则表示随机数验证失败。

S144,从验证通过的随机数以及所述第一预准备消息包括的随机数中确定 所述目标随机数。

本实施例中,可以将验证通过的随机数以及第一预准备消息包括的随机数 作为候选随机数,并将其中符合预设条件的一者确定为目标随机数。例如,将 其中最小的一个确定为目标随机数。

参照上文中副本节点100对第二预准备消息pre-prepare1中随机数进行验 证的例子,在完成随机数验证后,副本节点100可以从自身生成的随机数以及 验证通过的所有随机数中选择一个作为目标随机数,具体可以选择值最小的一 个作为目标随机数。而目标随机数所在的预准备消息的发送者即为主节点。在 此情况下,副本节点100可以选择对主节点发送的预准备消息中的候选区块执 行后续共识流程。

本实施例中,可选地,任一副本节点发送的预准备消息中还可以携带有签 名信息,所述签名信息是基于该副本节点的非对称密钥对中的私钥对该副本节 点生成的随机数和零知识证明进行签名得到的。相应地,如图9所示,在执行 S142之前,本实施例提供的方法还可以包括如下步骤:

S141,基于本节点的非对称密钥对中的公钥,验证所述第二预准备消息中 的签名信息,若所述第二预准备消息中的签名信息验证通过,则触发执行S142。

其中,对于第二预准备消息中签名信息的验证可以通过签名验证算法实现。 示例性地,为了便于描述,将第二预准备消息中的随机数和零知识证明统一描 述为第一消息,在此情况下,可以根据本节点的非对称密钥对中的公钥以及对 所述第二预准备消息中的签名信息得到第二消息,并比较所述第一消息和所述 第二消息是否相同。若所述第一消息和所述第二消息相同,则确定所述第二预 准备消息中的签名信息验证通过。

可选地,本实施例中,由于随机数是哈希值,其是长度固定为32位、由 十六进制字符组成的字符串,在使用传统的排序算法来比较随机数大小时,存 在诸多不足,比如,两个字符串比较大小时需要遍历字符串,逐个字节比较, 性能较差;又比如,堆排序等传统算法最佳的时间复杂度为O(logN),时间复 杂度比较大。基于此,本申请实施例中,采用字典树来确定最小随机数。详细 地,步骤S144可以通过图10所示流程实现。具体描述如下。

S144-1,分别将验证通过的随机数以及所述第一预准备消息包括的随机数 存储至字典树中,所述字典树中的各叶子节点与所述字典树中存储的随机数一 一对应,每个叶子节点以本节点所对应随机数为键、以生成本节点所对应随机 数的副本节点的索引为值,构成一键值对。

S144-2,通过遍历所述字典树查找最小的随机数,并将查找到的最小的随 机数数作为目标随机数。

字典树,即Trie树,又可以称为单词查找树或前缀树,是一种用于快速检 索的多叉树结构。本实施例中,验证通过的随机数均存储于字典树中。如图11 所示,字典树中的每个随机数就是根节点出发一直到某个叶子节点的路径,路 径中的每条边对应的是一个十六进制字符,路径中的每一条边对应的字符依次 连起来就是一个随机数,某个随机数对应的叶子节点可以存储有生成该随机数 的副本节点的索引。本实施例中,用于存储随机数的字典树深度为32。通过该 字典树进行最小随机数的查找,每次确定最小随机数只需进行32次查询,时 间复杂度为O(1),大大提升了效率。

当任一副本节点通过后续共识流程确定区块链系统10对主节点生成的候 选区块达成共识,则可以在本地区块链中追加主节点生成的候选区块,并按照 定时进入下一轮共识。

请参照图12,其中示出了步骤S160的详细实现流程,下面以副本节点100 为例进行介绍。

S161,若主节点生成的候选区块通过本节点的验证,则向各所述其他副本 节点广播第一准备消息。

这里值得说明的是,当副本节点100就是被选出的主节点时,可以直接广 播第一准备消息。这里的第一准备消息例如可以包括当前视图序号、区块的序 号、候选区块的摘要以及副本节点的身份标识(如100)。

S162,接收所述其他副本节点广播的第二准备消息。

S163,若接收的第二准备消息达到预设数量,并且确定第一准备消息与接 收的所述预设数量个第二准备消息一致,则向各所述其他副本节点广播第一确 认消息。

如上所述,区块链系统10中的各副本节点均可以按照副本节点100的处 理流程,选举出一个主节点,从而可以针对该主节点生成的候选区块执行后续 共识流程。因而,区块链系统10中的每个副本节点在确定主节点并且确定主 节点生成的候选区块验证通过时,均可以对外广播第一准备消息。相应地,副 本节点100还可以接收到其他副本节点广播的第二准备消息。

本实施例中,预设数量可以为2f,在区块链系统10中,例如可以是2。 详细地,当目标节点(副本节点100)接收到2个第二准备消息,并且这2个 第二准备消息和副本节点100自己广播出去的第一准备消息是一致的,就可以 生成第一确认消息,并广播该第一确认消息。

S164,接收所述其他副本节点广播的第二确认消息。

S165,在接收的第二确认消息达到预设数量个,并且确定第一确认消息与 接收的所述预设数量个第二确认消息一致时,确定所述区块链系统对所述主节 点生成的候选区块达成共识。

详细地,区块链系统10中的每个副本节点均可以向外广播第一确认消息, 对应地,副本节点100可以接收到其他副本节点广播的第二确认消息。并且, 当接收到2个第二确认消息,并且这2个第二确认消息与副本节点100自己生 成的第一确认消息一致时,可以确定对主节点生成的候选区块达成共识。

通过本实施例提供的区块链共识方法及区块链系统,可以降低视图中主节 点被预测到的概率,从而降低主节点被攻击者攻击的风险。

请一并参照图13,图13示出了在区块链系统10中应用本申请实施例提供 的区块链共识方法的共识过程示意图。下面结合该共识过程示意图,以区块链 系统10中的副本节点103是拜占庭节点为例,进行举例说明。

1、副本节点100生成预准备消息pre-prepare0,并在区块链系统10中广 播pre-prepare0。

其中,副本节点100通过椭圆曲线算法生成临时非对称密钥对,包括临时 公钥PK-0和临时私钥SK-0,并获取本地区块链的最新区块的哈希值,将临时 私钥SK-0和该哈希值输入可验证随机函数,得到随机数V-0及其零知识证明 Proof-0。副本节点100还利用临时私钥SK-0对随机数V-0和零知识证明Proof-0 进行签名得到签名信息Sig-0,然后将临时私钥SK-0销毁。副本节点100将获 得的交易信息打包成候选区块block-0,将候选区块block-0、签名信息Sig-0 (Sig-0的数据结构定义中包含临时公钥PK-0)、随机数V-0以及零知识证明 Proof-0组装成预准备消息pre-prepare0,并在区块链系统10中广播pre-prepare0。

其中,pre-prepare0对于副本节点100而言是第一预准备消息。

2、副本节点101生成预准备消息pre-prepare1,并在区块链系统10中广 播pre-prepare1,pre-prepare1包括副本节点101生成的候选区块block-1、随机 数V-1以及随机数V-1的零知识证明Proof-1。

其中,pre-prepare1对于副本节点101而言是第一预准备消息。

3、副本节点102生成预准备消息pre-prepare2,并在区块链系统10中广 播pre-prepare2,pre-prepare2包括副本节点102生成的候选区块block-2、随机 数V-2以及随机数V-2的零知识证明Proof-2。

其中,pre-prepare2对于副本节点102而言,是第一预准备消息。

副本节点103由于是拜占庭节点,将不会进行预准备消息的广播。

其中,S2、S3的详细实现流程与S1类似,并且S1、S2、S3之间没有严 格的执行顺序的限制。

4、副本节点100接收到预准备消息pre-prepare1、pre-prepare2,分别对 pre-prepare1中的随机数V-1以及pre-prepare2中的随机数V-2进行验证。

其中,pre-prepare1、pre-prepare2对于副本节点100而言是第二预准备消 息。

副本节点100首先利用副本节点101的临时公钥PK-1对pre-prepare1中的 签名信息Sig-1进行验证,若验证通过,即可利用零知识证明Proof-1恢复出一 随机数V-1’,如果V-1’和V-1一致,则可以从副本节点101处获得其本地区块 链中最新区块的哈希值,并将该哈希值、随机数V-1、零知识证明Proof-1以及 临时公钥PK-1输入可验证随机函数的函数验证器中,从而可以得到一验证结 果,若验证结果为TRUE,则表示随机数V-1验证通过。类似地,其他每个副 本节点对任一随机数的验证过程与上述流程类似,在此不再赘述。

假如副本节点100确定pre-prepare1中的随机数V-1以及pre-prepare2中的 随机数V-2均通过验证,则可以将自身的随机数以及通过验证的随机数V-1、 V-2存储于一字典树中,并通过遍历字典树确定最小的随机数,例如为V-0, 则V-0为目标随机数,相应地,副本节点100确定自己是当前视图的主节点。

5、副本节点101接收到预准备消息pre-prepare0、pre-prepare2。其中, pre-prepare0、pre-prepare2对于副本节点101而言是第二预准备消息。

类似地,副本节点101将自身生成的随机数V-1以及通过验证的随机数V-0和V-2存储于字典树中,并通过遍历字典树确定最小的随机数是V-0,并 确定生成目标随机数V-0的副本节点100是当前视图的主节点。

6、副本节点102接收到预准备消息pre-prepare0、pre-prepare1。其中, pre-prepare0、pre-prepare1对于副本节点102是第二预准备消息。

类似地,副本节点102也会将副本节点100确定为当前视图的主节点。

7、副本节点103接收到预准备消息pre-prepare0、pre-prepare1、pre-prepare2。pre-prepare0、pre-prepare1、pre-prepare2对于副本节点103而言是第二预准备 消息。

副本节点103是拜占庭节点,其不会将副本节点100确定为主节点。

8、副本节点100作为主节点,直接基于候选区块block-0生成准备消息 prepare0,并在区块链系统10中广播prepare0。其中,prepare0对于副本节点 100而言是第一准备消息,对于其他副本节点而言是第二准备消息。

9、副本节点101对主节点100生成的候选区块block-0进行验证,并在验 证通过时生成准备消息prepare1,并在区块链系统10中广播prepare1。其中, prepare1对于副本节点101而言是第一准备消息,对于其他副本节点而言是第 二准备消息。

10、副本节点102对主节点100生成的候选区块block-0进行验证,并在 验证通过时生成准备消息prepare2,并将其广播出去。其中,prepare2对于副 本节点102是第一准备消息,对于其他副本节点而言是第二准备消息。

副本节点103是拜占庭节点,不会进行准备消息的广播。

11、副本节点100(主节点)接收到准备消息prepare1、prepare2,将其与 自身生成的准备消息prepare0比较,确定三者是匹配的,因此生成确认消息 commit0,并在区块链系统10中广播commit0。其中,commit0对于副本节点 100是第一确认消息,对于其他副本节点而言是第二确认消息。

12、副本节点101接收到准备消息prepare0、prepare2,将它们与自身生成 的准备消息prepare1比较,确定三者匹配,则生成确认消息commit1,并将commit1广播出去。commit1对于副本节点101而言是第一确认消息,对于其 他副本节点而言是第二确认消息。

13、副本节点102接收到准备消息prepare0、prepare1,将它们与自身生成 的准备消息prepare2比较,确定三者匹配,则生成确认消息commit2,并将 commit2广播出去。commit2对于副本节点102而言是第一确认消息,对于其 他副本节点而言是第二确认消息。

14、副本节点100(主节点)接收到确认消息commit1、commit2,将它们 与自身生成的commit0比较,确认三者匹配,则确定区块链系统10中的节点 对候选区块block-0达成了共识,则将block-0追加到本地区块链中。

15、副本节点101接收到确认消息commit0、commit2,将它们与自身生 成的commit1比较,确认三者匹配,则确定区块链系统10中的节点对候选区 块block-0达成了共识,则将block-0追加到本地区块链。

16、副本节点102接收到确认消息commit0、commit1,将它们与自身生 成的commit2比较,确认三者匹配,则确定区块链系统10中的节点对候选区 块block-0达成共识,则将block-0追加到本地区块链。

副本节点103由于拜占庭节点,不会对block-0达成共识。

17、结束本轮共识。

通过本申请实施例提供的区块链共识方法及区块链系统,可以降低每轮共 识中的主节点被预测到的几率,从而降低主节点被攻击的风险。

请参照图14,其中示出了本申请实施例提供的一种区块链共识装置1400, 所述区块链共识装置1400可以应用于图2所示的区块链系统10中的副本节点, 如100、101、102或103。所述区块链共识装置1400可以包括收发模块1410、 主节点选择模块1420以及共识模块1430。

收发模块1410用于在所述区块链系统中广播第一预准备消息,并接收所 述区块链系统中的其他副本节点广播的第二预准备消息,其中,所述区块链系 统中的任一副本节点广播的预准备消息包括该副本节点生成的候选区块和随 机数。

主节点选择模块1420用于从所述第一预准备消息和所述第二预准备消息 各自包括的随机数中确定一目标随机数,将所述区块链系统中生成所述目标随 机数的副本节点确定为当前视图的主节点。

共识模块1430用于在确定所述区块链系统对所述主节点生成的候选区块 达成共识的情况下,将所述主节点生成的候选区块写入本地区块链。

可选地,所述区块链共识装置1400还可以包括消息生成模块。

所述消息生成模块用于生成本节点的候选区块;对所述本地区块链的最新 区块的哈希值以及当前视图的序号进行哈希处理,得到本节点的随机数;生成 包括本节点的候选区块和本节点的随机数的预准备消息,并将该预准备消息确 定为所述第一预准备消息。

可选地,所述区块链系统10中的任一副本节点广播的预准备消息还包括 该预准备消息中的随机数的零知识证明。在此情况下,所述消息生成模块还可 以用于:

在所述区块链系统中广播第一预准备消息之前,所述方法还包括:生成本 节点的候选区块;获取所述本地区块链的最新区块的哈希值和当前视图的序号; 获取本节点的非对称密钥对中的私钥;通过可验证随机函数对所述私钥和所述 哈希值进行处理,得到本节点的随机数和针对该随机数的零知识证明;生成包 括本节点的候选区块、本节点的随机数以及该随机数的零知识证明的预准备消 息,并将该预准备消息确定为所述第一预准备消息。

可选地,所述主节点选择模块1420具体用于根据所述第二预准备消息中 的零知识证明,验证所述第二预准备消息中的随机数;从验证通过的随机数以 及所述第一预准备消息包括的随机数中确定所述目标随机数。

可选地,所述主节点选择模块1420具体还用于获取本节点的所述非对称 密钥对中的公钥;基于所述公钥和所述第二预准备消息中的零知识证明,验证 所述第二预准备消息中的随机数。

可选地,所述可验证随机函数包括函数验证器。在此情况下,所述主节点 选择模块1420基于所述公钥和所述第二预准备消息中的零知识证明,验证所 述第二预准备消息中的随机数的方式可以为:从所述第二预准备消息包括的零 知识证明中恢复出一随机数;若恢复出的随机数与所述第二预准备消息包括的 随机数相同,则将当前视图的序号、从广播所述第二预准备消息的其他副本节 点获得的最新区块的哈希值以及所述第二预准备消息中的随机数和零知识证 明输入所述函数验证器;若所述函数验证器的输出结果为真,则确定所述第二 预准备消息中的随机数验证通过。

可选地,所述区块链系统中的任一副本节点广播的预准备消息还包括签名 信息,所述签名信息是基于该副本节点的非对称密钥对中的私钥对该副本节点 生成的随机数和零知识证明进行签名得到的。所述区块链共识装置1400还可 以包括验证模块。

所述验证模块用于在根据所述第二预准备消息中的零知识证明,验证所述 第二预准备消息中的随机数之前,基于本节点的非对称密钥对中的公钥,验证 所述第二预准备消息中的签名信息;若所述第二预准备消息中的签名信息验证 通过,则触发执行所述根据所述第二预准备消息中的零知识证明,验证所述第 二预准备消息中的随机数的步骤。

可选地,所述第二预准备消息中的随机数和零知识证明为第一消息。在此 情况下,所述主节点选择模块1420基于本节点的非对称密钥对中的公钥,验 证所述第二预准备消息中的签名信息的方式为:根据本节点的非对称密钥对中 的公钥以及所述第二预准备消息中的签名信息,得到第二消息;比较所述第一 消息和所述第二消息是否相同;若所述第一消息和所述第二消息相同,则确定 所述第二预准备消息中的签名信息验证通过。

可选地,所述主节点选择模块1420还可以用于在得到本节点的随机数和 针对该随机数的零知识证明之后,销毁本节点的私钥。

可选地,所述主节点选择模块1420从验证通过的随机数以及所述第一预 准备消息包括的随机数中确定所述目标随机数的方式可以为:从验证通过的随 机数以及所述第一预准备消息包括的随机数中,将最小的随机数确定为所述目 标随机数。

可选地,所述主节点选择模块1420从验证通过的随机数以及所述第一预 准备消息包括的随机数中,将最小的随机数确定为所述目标随机数的方式可以 为:分别将验证通过的随机数以及所述第一预准备消息包括的随机数存储至字 典树中,所述字典树中的各叶子节点与所述字典树中存储的随机数一一对应, 每个叶子节点以本节点所对应随机数为键、以生成本节点所对应随机数的副本 节点的索引为值,构成一键值对;通过遍历所述字典树查找最小的随机数,并 将查找到的最小的随机数作为所述目标随机数。

可选地,所述共识模块1430还可以用于在所述主节点生成的候选区块通 过本节点的验证的情况下,向各所述其他副本节点广播第一准备消息;接收所 述其他副本节点广播的第二准备消息;在接收的所述第二准备消息达到预设数 量,并且确定所述第一准备消息与接收的所述预设数量个第二准备消息一致的 情况下,向各所述其他副本节点广播第一确认消息;接收所述其他副本节点广 播的第二确认消息;在接收的所述第二确认消息达到预设数量个,并且确定所 述第一确认消息与接收的所述预设数量个第二确认消息一致的情况下,确定所 述区块链系统对所述主节点生成的候选区块达成共识。

请参照图15,其中以副本节点100为例示出了本申请实施例提供的一种副 本节点的硬件架构示意图。副本节点100可以包括上述的区块链共识装置1400、 处理器110以及计算机可读存储介质120。

处理器110和计算机可读存储介质120可以通过系统总线130进行通信。 区块链共识装置1400包括的软件功能模块可以以机器可执行指令的形式存储 于机器可读存储介质120中。处理器110通过调用并读取计算机可读存储介质 120中的机器可执行指令,可以实现本申请实施例提供的区块链共识方法。

值得说明的是,图15所示的架构仅为示意。本申请实施例提供的副本节 点还可以包括比图15所示更多或更少的组件,比如,还可以包括通信单元, 或者具有与图15所示完全不同的匹配值,本实施例对此没有限制。此外,图 15所示组件可以通过硬件、软件或其组合来实现。

本领域内的技术人员应明白,本申请的实施例可提供为方法、装置、或计 算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结 合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包 含有机器可执行指令的机器可读存储介质(包括但不限于磁盘存储器、 CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、装置(系统)、和计算机程序产 品的流程图和/或方框图来描述的。应理解可由机器可执行指令实现流程图和 /或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/ 或方框的结合。可提供这些机器可执行指令到通用计算机、专用计算机、嵌入 式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算 机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一 个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些机器可执行指令也可存储在能引导计算机或其他可编程数据处理设 备以特定方式工作的机器可读存储介质中,使得存储在该机器可读存储介质中 的指令产生包括指令装置(如,上述的自动控制装置800)的制造品,该指令 装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中 指定的功能。

这些机器可执行指令也可装载到计算机或其他可编程数据处理设备上,使 得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处 理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个 流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

在本申请的描述中,需要理解的是,术语“第一”、“第二”仅用于描述目的, 而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。 由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多个 该特征。在本申请的描述中,“多个”的含义是至少两个,例如两个,三个等, 除非另有明确具体的限定。

尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基 本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要 求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申 请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及 其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

技术分类

06120113212603