一种基于pbft的委托权益证明区块链共识算法

文档序号:7634 发布日期:2021-09-17 浏览:25次 英文

一种基于PBFT的委托权益证明区块链共识算法

技术领域

本发明属于区块链共识算法

技术领域

,具体涉及一种基于PBFT的委托权益证明区块链共识算法。

背景技术

随着比特币等数字货币的快速兴起,越来越多的研究者和金融科技公司开始投入到其底层技术——区块链的研究之中。共识机制是区块链系统的核心技术之一,直接决定了系统的各方面性能指标和应用面向的场景。

区块链平台整体上可划分为网络层,共识层,数据层,智能合约层和应用层五个层次。区块链技术的伟大之处就是它的共识机制,在去中心化的思想上解决了节点间互相信任的问题。区块链拥有众多节点,各节点能不依靠中心化的权威,大规模的高效协作依然能够完成就是因为共识机制。

共识算法最初是用于解决分布式系统的一致性问题,即怎样让分布式系统中对等节点的本地数据完全一致并且对某个共同决策实现共识。工作量证明算法PoW是首先应用于区块链系统的共识算法,利用挖矿节点互相竞争计算新区块的哈希值使之满足一定的难度值来获得区块记账权。PoW需要消耗高额的计算机算力来遍历哈希值,故存在很大的资源浪费且交易吞吐量太低。PPcoin采用PoS共识算法的思想,把挖矿的难度与节点所持虚拟货币的币龄关联起来,使得一个节点挖矿时所提交的币龄越大,其挖矿的难度就越低。虽然还是需要计算哈希值来获得记账的权利,但是能耗相对于PoW已经大大降低了。PoS的缺点是容易造成马太效应,导致数字货币最终集中在少数人的手里。为了解决PoS的货币富集问题,Larimer在PoS的基础上提出了委托权益证明算法DPoS,并在BitShare项目中最先实现了它。在DPoS里面,不是所有节点都参与挖矿过程,普通节点会投票选择自己信任的节点作为见证人节点来验证交易和记账。选出来的见证节点不需要竞争,而是轮流产生区块。但是,DPoS算法也存在许多需要改进的地方,比如:在选举代理人节点的过程中,会出现少数节点联合将选票投给某个候选节点,而其他普通节点投票不积极,影响区块链网络的去中心化特性,导致出现一定的安全性问题;如果被选出的代理人节点集合出现恶意节点,DPoS算法将跳到下一节点继续生产区块,该恶意节点要么生产区块失败,要么产生一个区块链分叉,不能得到及时处理,从而影响区块的打包和验证,导致区块链系统处理交易数据的吞吐量下降和出现安全性问题;在生产区块和验证的过程中,代理人节点生产区块后,还要接受后续代理人节点的验证,当区块获得超过()比例的代理人节点验证后,该区块才能添加进区块链并广播给其他节点。这就导致了原本一个代理人节点生产的区块需要几十甚至上百个代理人节点的验证,这大大拖长了区块的验证时延,影响系统的交易吞吐量。

PBFT算法早期作为分布式计算领域的容错技术,主要用于解决分布式网络一致性问题,也可用于区块链系统中,但仅限制于私有链和联盟链中,而在公有链系统中,主要的共识算法是POW、POS和DPoS。这三种共识机制各有优劣,比如POW具有完整的数学证明,理论上来说最安全、实现相对简单,但它在能源消耗、出块时间、交易容量都有很大不足,而POS则有安全风险更大、选举节点时候网络流量压力很大以及“富者愈富,贫者愈贫”等问题,而DPOS缩小了选举节点数量减少了网络压力,但存在持有代币多的节点由操控网络的影响以及恶意节点需再次投票剔除的不便。

委托权益证明共识算法虽然在各方面性能表现上比较均衡,但要满足公有链不断发展的应用需求,必须在安全性、高效、验证时延等方面加以改进。因此,需要引入并创建多种机制,设计一种基于PBFT的委托权益证明算法来解决这些问题。

发明内容

本发明要解决的技术问题是提供一种基于PBFT的委托权益证明区块链共识算法,以解决区块链网络中普通节点投票不积极,容易被少数节点联合将选票投给某个候选节点,恶意节点未能得到及时处理影响区块的打包和验证导致一定的安全性隐患,以及区块验证时延过长等问题。

为解决上述技术问题,本发明的实施例提供一种基于PBFT的委托权益证明区块链共识算法,包括如下步骤:

S1、区块链系统在运行过程中,以一个小时为运行周期,在系统运行前,初始化网络中的所有节点的信用评级、信用系数并记录区块生产轮次

S2、区块链网络中的节点根据自己权益的多少并参考候选节点的信用评级投出赞成票和反对票,其中反对票在一个选举周期内最多只能投一次;当节点投票完成之后,会选出具有更改网络参数的代表节点,以及进行投票结果的统计优化工作;选择有效得票数最多的前个节点,其中前个节点作为代理人节点集合,第的节点作为验证节点集合,第的节点作为备选代理人节点集合

S3、代理人节点根据shuffle算法产生一个序列,然后根据该序列轮流生产区块,生成的区块利用PBFT算法来对其进行验证并对当前代理人节点没有在相应的时间片内生产区块的情况作出相应的处理措施,直到一个序列的所有代理人节点完成区块生产;

S4、当按代理人节点集合的随机序列完成一轮区块生产后,代理人节点通过shuffle算法形成新的出块序列,继续进行步骤S2;如果本次运行周期结束,则继续进行步骤S1。

其中,步骤S1包括如下具体步骤:

S11、信用系数代表了网络中节点生产有效区块的可信程度,信用系数越高的节点越有可能被选入代理人节点集合,反之则不容易被其他节点信任和投票;信用系数主要通过信用消耗和信用奖励机制来起作用,在区块共识的过程中,网络节点的初始信用系数设为默认值,比如说60;节点具有多个信用评级,不同的信用评级标志了代理人节点生产区块的情况,因此涉及节点的信用评级的转换;初始状态下,被选为代理人节点的信用评级为NORMAL级别,表示节点运行正常;

S12、区块生产轮次初始化为0。

其中,步骤S2包括如下具体步骤:

S21、在节点投票选举的过程中,普通节点根据其他节点的信用评级以及信用系数的多少投赞成票或反对票,每个节点在时间间隔内最多只能投出一个反对票;普通节点倾向于给信用评级为GOOD的节点投赞成票,而向信用评级为EXCEPTION的节点投反对票;当投票完成之后,根据公式(1)计算每个节点的有效得票数。

(1),

其中,代表有效得票数,用于选取代理人节点集合,表示候选节点信用系数折算为选票的折算比例,为系统自定义值,表示赞成票和反对票各自的加权,满足,一般可以取

S22、选择有效得票数最多的前个节点,其中前个节点作为代理人节点集合,第的节点作为验证节点集合,第的节点作为备选代理人节点集合;数量的取值是通过至少有50%投票的普通节点认为该数量足够确保区块链系统去中心化来确定的;另外,在得到代理人节点集合后,根据投反对票的情况进行信用奖励,每个节点也会计算各自的信用消耗以及进行信用稳定和投票时间的重置。

其中,步骤S3包括如下具体步骤:

S31、通过shuffle算法,将代理人节点集合随机排序,产生一个随机序列

S32、按照该序列,代理人节点生产区块并将打包的区块通过PBFT算法进行区块的验证,具体的过程描述为:

S321、代理人节点将区块链网络中的交易打包成block,然后采用点对点协议将block发送给验证集合中的所有验证节点,当节点收到足够数量的有效验证回复时即验证通过,并将该区块加入到区块链中,下一节点依次轮流执行当前的区块生产流程;

S322、如果代理人节点生产了无效区块,则其信用评级会由Normal级别降为EXCEPTION级别;如果生产区块失败的次数超过,该代理人节点的信用评级继续降为ERROR级别,表示该节点为恶意节点,需要用集合中的备选代理人节点进行替换;如果节点累计生产的有效区块数超过阈值,则节点的信用评级转为GOOD级别。

其中,步骤S4包括如下具体步骤:

S41、代理人节点序列中的最后一个节点即在规定的时间片内打包完区块时,第一轮区块生产完成,产块轮次加1,并进行步骤S3;

S42、当本次运行周期结束时,执行步骤S2。

本发明的上述技术方案的有益效果如下:

1、本发明基于信用奖惩的代理人节点选举模型,针对DPoS共识算法节点投票不积极和恶意节点仍可能当选代理人节点的问题,本发明定义了相关的代理人信用评级、信用系数等核心要素,引入了基于信用奖惩的代理人节点选举模型。在这种选举模型下,网络节点通过投反对票大大减少了异常节点成为代理人的比例。同时由于信用稳定和时间重置机制,普通节点需要尽量参与到选举投票中去,有效提高了选举的积极性。

2、本发明中,备选代理人节点替换机制,针对DPoS共识算法无法在一轮选举周期内及时处理恶意节点的问题,本发明通过选举出代理人节点和备选代理人节点集合,其中备选代理人节点集合用于替换代理人节点集合中由于多次出块失败转变为ERROR状态的节点,于是有效处理了恶意节点。

3、本发明基于PBFT算法的区块验证方案,针对DPoS算法验证时延远远大于区块生产时延,影响出块效率的问题,本发明引入PBFT算法来快速验证区块。同样,根据选举模型选出验证代理人节点集合,然后在该集合上运行PBFT算法,达到及时验证区块的目的。如果验证代理人节点集合的主节点出现故障引起视图更换,也需要用备选代理人节点集合中的正常节点来替换,这避免了验证代理人节点集合频繁进行视图更换,提高了算法的安全性。

附图说明

图1为本发明的节点评级转换示意图。

图2为本发明的奖惩方案流程图。

图3为本发明的信用奖惩架构图。

图4为本发明的PBFT算法验证结构图。

图5为本发明的区块验证过程图。

图6为本发明的备选节点替换结构图。

具体实施方式

为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。

本发明提供一种基于PBFT的委托权益证明区块链共识算法即PDPoS算法,针对DPoS节点投票不积极和恶意节点仍可能当选代理人节点的问题,定义了信用评级、信用系数等概念,引入了基于信用奖惩的代理人节点选举模型。在这个选举模型下,网络节点通过投反对票大大减少了异常节点成为代理人的比例。同时由于信用稳定和时间重置机制,普通节点需要尽量参与到选举投票中去,有效提高了选举的积极性;针对DPoS共识算法在一轮选举周期内不能及时处理恶意节点的问题,选举出代理人和备选代理人节点集合,其中备选代理人节点集合用于及时替换代理人节点集合中多次出块失败的节点,于是有效处理了恶意节点。另一方面,针对DPoS算法验证时延远大于区块生产时延,进而影响出块效率的问题,算法选举出验证节点集合,然后引入PBFT算法来快速验证区块。

本发明具体包括以下步骤:

步骤1:在每个运行周期初始阶段,获取区块链网络中各个节点的信用系数、信用评级和初始化代理人节点在当前运行周期生产区块的轮次

在每一个运行周期内,节点具有多个信用评级,不同的信用评级标志了代理人节点生产区块的情况,因此涉及节点的信用评级的转换。初始状态下,被选为代理人节点的信用评级为NORMAL级别,表示节点运行正常。按照时间片轮转的原则,当轮到该节点生产区块时,如果节点产生了无效区块,则其信用评级变为EXCEPTION状态,否则继续保持NORMAL状态。随着多轮区块生产,代理人节点连续生产了多个区块并超过了阈值M,则节点的信用评级变为GOOD,处于GOOD信用评级的代理人节点在下一场节点选举时会被普通节点优先投票。同样地,处于EXCEPTION信用评级的代理人节点会在下一场投票选举中处于不利地位,甚至被投反对票。如果处于EXCEPTION信用评级的代理人节点区块生产失败的次数达到m,则会降为ERROR级别而停止生产区块,为了维持一定数量的代理人节点,保证系统的安全性,会采用备选节点替换机制替换ERROR节点。如图1所示为信用评级之间的转换示意图。

步骤2:代理人节点集合、验证节点集合、备选替换节点集合选举在每个运行周期的第一轮生产区块之前都会进行节点选举,节点的选举规则如下:在节点投票选举的过程中,普通节点根据其他节点的信用评级以及信用系数的多少投赞成票或反对票,每个节点在时间T间隔内最多只能投出一个反对票。一般来说普通节点倾向于给信用评级为GOOD的节点投赞成票,而向信用评级为EXCEPTION的节点投反对票。当节点投票完成之后,会选出具有更改网络参数的代表节点,以及进行投票结果的统计优化工作。利用式(1)计算每个候选节点的有效得票数并进行排序,选择有效得票数最多的前个节点,其中前个节点作为代理人节点集合,第的节点作为验证节点集合,第的节点作为备选代理人节点集合。数量的取值是通过至少有50%投票的普通节点认为该数量足够确保区块链系统去中心化来确定的。另外,在得到代理人节点集合后,根据投反对票的情况进行信用奖励,每个节点也会计算各自的信用消耗以及进行信用稳定和投票时间的重置。

在原始的委托权益证明算法中,普通节点只能通过投赞成票的方式给信任的节点投票,而不能对不信任的网络节点投反对票来进一步降低其被选为代理人节点的概率,因此本发明设置了一个投反对票机制。另外需要用信用奖励和消耗的方式来进一步提高网络节点投票的积极性,维持系统的高效、安全运转,因此设置了多种奖惩措施。两者在选举投票阶段相互协作,其运行流程如图2所示。

此步骤中的信用奖惩措施主要包含信用消耗、信用稳定、投票时间重置以及信用奖励四个模块。前三个模块是针对节点投票情况进行的被动信用惩罚,主要用来提高节点投票的积极性,而信用奖励模块主要是奖励投反对票从而主动降低异常节点当选代理人节点的概率。整个机制是建立在节点信用系数基础之上的,信用系数代表节点的正常生产区块的可信程度。节点的信用奖惩架构如图3所示。

信用消耗模块表示信用系数会随着投票时间缓慢降低,其满足的规则在本实施例中定义为:

(2);

其中,代表分布式网络中各个节点的信用系数,代表两次投票的实际时间间隔,表示一个固定的自定义时间间隔,本实施例定义为1个小时。如果节点参与投票的实际间隔时间超过则说明节点投票不积极,因此信用系数会缓慢下降,否则不改变。表示信用消耗速率,可根据实际的应用需求进行调整。

信用稳定和投票时间重置模块:每经过一轮投票,节点都会根据式(2)来计算自己当前信用值。如果节点投票成功则投票累计时间变为0,反之会不断增加,直至超过固定时间间隔,导致信用系数的下降。因此有效节点会积极参与到投票环节中来以保持信用稳定。

信用奖励模块:这里的信用奖励主要是针对节点投反对票并且成功时的奖励。每隔时间T,普通节点只能投一个反对票以防止故意破坏选举过程。一般来说,普通节点有可能针对异常节点来投反对票,如果异常节点没有当选代理人节点,则会获得一定的信用奖励,如式(3)所示:

(3)。

节点投票完成后需要针对每个节点的得票情况进行统计排序。每个节点动态维护一张节点信息表,如表1所示。

表1

节点公钥 信用评级 信用系数(C) 赞成票(V) 反对票(NV)
NORMAL 60 10 1

根据节点的信用系数、赞成票数以及反对票数来计算有效得票数。相关的计算公式如式(1)所示。

步骤3:代理人节点区块生产通过步骤2得到代理人节点节点集合,通过代理人节点采用时间片轮转的方式轮流生产区块,本实施例中每隔3秒生产一个区块,然后将区块交由后序的代理人节点依次验证。如果某个代理人节点在相应的时间片内生产区块失败,则跳过该节点由下个代理人节点生产区块。委托权益证明算法没有针对该节点的行为立即做出处理,而是寄希望于下一次投票选举中将该生产区块失败的节点投出代理人节点集合。生产区块失败的节点仍可能在本轮选举周期内生产无效区块,从而影响区块生成效率以及系统的安全性。因此,本实施例在委托权益证明算法的基础上引入了奖惩机制。如果代理人节点生产了无效区块,则其信用评级会由Normal级别降为EXCEPTION级别;如果生产区块失败的次数超过m,该代理人节点的信用评级继续降为ERROR级别,表示该节点为恶意节点,需要用集合中的备选代理人节点进行替换。代理人节点的出块算法具体步骤的伪代码如表2所示:

表2

Algorithm: GenerateBlock()

Input: R1={x[0],x[1],…x[n-1]},Transactions

Output: block

1 R1 shuffle(R1) //打乱排序

2 slot = global_time_offset/block_time

3 pos = slot mod |R1| //选取初始记账代理节点位置

4 WHILE true:

5 (block,error) PackagingBlock(R1[pos],Transactions) //打包区块

6 IF error.flag = false THEN

7 verify(block,R2) //验证区块

8 IF R1[pos].num >= M THEN R1[pos].CreditRating = GOOD

9 ELSE //区块生产失败

10 IF error.num < m THEN

11 R1[pos].CreditRating = EXCEPTION

12 ELSE

13 R1[pos].CreditRating = ERROR

14 R1[pos] substitute(R1[pos],R3) //备选节点替换

15 END IF

16 END IF

17 pos pos+1

18 IF isElectionBegin() = true //如果新的选举周期开始,则结束本轮区块生产

19 Break;

20 END IF

21 END WHILE

步骤4:区块验证及恶意节点替换

如图4所示,代理人节点1收集网络中的交易并打包成区块1,然后采用点对点协议发送给验证集合中的主节点。发送的格式为,其中表示封装的区块,表示时间戳,表示代理人节点序号,表示区块的摘要,表示代理人节点的签名。代理人节点1在规定的时间片内生产完区块后,便交由代理人节点2进行下一区块的生产,同时等待接收个该区块的带有效签名的回复,本实施例假定验证集合中的恶意节点个数为,总节点个数为,因此有。回复的格式一般为,其中代表当前的视图序号,代表相应请求的时间戳,为生产该区块的代理人节点序号,集合中的验证节点序号,代表节点的对该回复的签名,表示该区块的摘要。

主节点在接受到区块消息后进入预准备(pre-prepare)阶段,同时将区块封装为预准备消息并保存在本地日志上,然后将该消息广播给其余的验证代理人节点。由于区块是按照代理节点的顺序生产的,因此不涉及区块排序的问题,不需要为该区块分配序列号。封装签名后的预准备消息格式为-,其中代表该消息被发送时所处的视图号,代表区块的摘要即代表主节点对该消息的签名。主节点的选取跟PBFT算法的选取方式一样为:

(4)。

每个验证节点在接受主节点发送来的预准备消息前,需要检查如下条件:

消息中的签名是正确的并且;验证节点的视图号与消息中的视图号相同;没有接受过视图下摘要相同的预准备消息,即没有重复接受消息。

如果验证节点接受了预准备消息-,就进入了准备(prepare)阶段,同时向其他验证节点(包括主节点)广播一条准备消息,格式为,其中为验证节点的签名。验证节点会在本地日志中保留这两条消息以备检查。其他验证节点(包括主节点)在收到准备消息后仍会检查签名是否正确、视图号是否一致、有没有重复接受消息等条件,如果通过则将收到的准备消息保留在本地日志上。

当验证节点本地日志上保存有验证通过的1条预准备消息以及个相应的来自不同验证节点的准备消息时,验证节点进入提交(commit)阶段并给其他验证节点广播一条提交消息,格式为。其他验证节点在接受提交消息之前同样也会按照上面的条件进行有效性检查,然后将该提交消息保存在本地日志上面。当验证节点收到了个关于的有效提交消息后,的验证完成然后各自向代理人节点1发送回复消息。代理人节点在接受到区块1的个来自不同验证节点的有效回复时,便将区块添加进区块链,同时向其他节点广播该验证通过后的区块。

如果代理人节点没有及时收到区块的回复消息,就会给所有验证节点广播这个区块验证请求。已经处理过该区块的验证节点会简单地重新回复消息,否则将这个区块请求转发给主节点。如果主节点没有对这个区块请求做出响应,它就会被足够多的验证节点怀疑从而导致视图更改,更换新的主节点。正常情况下的区块验证过程如图5所示。

如果代理人节点没有在相应的时间片内打包区块、或者代理人节点打包的区块验证出错,则说明代理人节点生产区块失败。会根据代理人节点出块算法对该节点的信用评级进行调整。

如图6所示,代理人节点1在生产区块1的时候,可能会出现区块验证无效从而导致区块生产失败,或者主节点故意延迟导致代理人节点不能及时收到个有效回复。这时,代理人节点1由于没有在既定的时间片内生产区块而由节点2继续进行区块的打包工作,其本身则被一个良好的备选代理人节点替换;另外一方面,验证节点集合会进行视图更改,产生一个新的主节点,原来的主节点则同样被某个备选代理节点替换。

以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

完整详细技术资料下载
上一篇:石墨接头机器人自动装卡簧、装栓机
下一篇:一种分布式数据源异构同步的方法

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!