一种基于信誉与投票机制的改进PBFT共识方法
技术领域
本发明属于区块链技术领域,提出了一种基于信誉与投票机制的改进实用拜占庭容错(Practical Byzantine Fault Tolerance,PBFT)共识方法。
背景技术
目前区块链技术已为各行各业提供去中心化解决方案,形成分布式数据存储、密码学、网络协议、共识机制等计算机技术组成的新型应用模式。共识机制是区块链技术的核心,通过节点共识过程保证了节点中最新交易集生成区块的一致,从而保障分布式网络正常运行。
目前,区块链中共识算法主要有:工作量证明(Proof of Work,PoW)、股权证明(Proof of Stack,PoS)、授权股权证明(Delegated Proof of Stack,DPoS)和PBFT。PoW算法中,各个节点通过算力解决密码学问题,可获得记账的权利,并得到一定的收益,保障了比特币的安全性和公平性,但浪费了巨大的计算和能量资源。PoS算法是为了解决PoW的资源浪费提出的替代性方案,一定程度上减少了资源的使用,提高了区块生成速度,但实际开发成本仍然很高。DPoS算法通过赋予每个持股人一定的投票权,由他们投票产生“挖矿”代表,降低了计算成本,是一种高效的共识算法。然而,DPoS中的奖励分布不均匀,容易产生较大的贫富差距,且恶意节点的防御能力弱,所以系统安全性较低。PBFT算法主要为解决分布式系统中存在拜占庭错误节点的一致性问题,在拜占庭协议的基础上,将算法复杂度从指数级降到了多项式级。
PBFT算法中的节点分为主节点和备份节点,每个节点按顺序从0到N-1分配一个编号,其中N为节点个数。主节点的编号记为p,主要职责为接收客户端提交的请求,并将请求消息广播给备份节点。该算法中每一次共识中所有的数据集群称为一个视图(view),为方便管理视图,将视图记作v,同时从0开始对其进行编号,主节点p满足p=v mod N。PBFT共识过程的核心三阶段,包括预准备阶段(pre-prepare),准备阶段(prepare)和确认阶段(commit),下面对三个阶段进行简要描述。
(1)预准备阶段,主节点广播预准备消息给备份节点。
(2)准备阶段,备份节点收到预准备消息后会对消息内容进行验证,节点验证、检查并接受预准备消息后,则该节点进入准备阶段,并向其他节点广播准备消息,然后将预准备消息写入日志。
(3)确认阶段,节点验证准备消息为真后,会向其他节点广播确认消息,当收到2f+1(f是最大可容忍的拜占庭节点数)个确认消息后,代表大多数节点已经进入确认状态,达成共识,于是节点会执行请求消息的内容。
上述过程中,如果备份节点认为主节点故障或作恶时,会向其他节点广播视图切换(view-change)消息。当收到2f个其他节点有效的view-change消息时,证明主节点异常,此时视图编号加1,下一个编号的节点成为主节点,主节点会继续执行上个视图未处理完的请求。
将PBFT算法作于区块链的共识算法,在保证系统运行效率的前提上,具有较高可靠性和安全性,目前已广泛应用于部分去中心化,由多个组织共同管理区块链网络的联盟链中。然而,PBFT算法中仍然存在部分问题:
(1)异常节点担任主节点。PBFT算法中对于主节点的选取采用顺序制,无法保证主节点的可靠性,容易产生异常节点担任主节点的情况。虽然视图切换协议保证了系统的安全性和活性,但是频繁更换视图,极大的降低了系统运行效率。
(2)共识过程通信开销大。共识过程中包含三次广播,预准备阶段,一次单节点广播,准备阶段和确认阶段,两次全节点广播,非常消耗网络带宽,浪费通信资源。
(3)视图切换效率低。当备份节点认为主节点异常时会向其他节点广播view-change消息,而主节点出现异常的情况多种多样,每次异常都进行广播会浪费通信资源。
发明内容
为了降低现有PBFT共识方法中异常节点担任主节点的概率,并节省节点间通信产生的资源损耗,从而提高系统的运行效率和安全性,本发明提出一种基于信誉与投票机制的改进PBFT共识方法,包括以下步骤:
对节点进行状态划分,并根据节点在共识过程的表现进行节点状态的转换;
根据节点的状态进行权限分配,具有参选权限的节点可参与主节点选举,并根据投票计算选举出主节点;
主节点接收客户端发送的请求,广播该请求给备份节点,开始共识过程;
共识过程中,如果主节点故障或作恶,根据主节点异常情况进行视图切换。
进一步的,对节点进行状态划分包括根据节点的信誉值从高到低将节点分为可信节点、正常节点、异常节点、不可信节点以及无效节点5个状态,另外设置一个与信誉值无关的状态为审查节点。
进一步的,节点状态的转换包括:
若可信节点未产生有效区块,其状态转换为审查节点;
若正常节点多次产生有效节点,且其信誉值达到可信节点的区间,则该正常节点转换为可信节点;
若正常节点未产生有效区块,则状态转换为审查节点;
若异常节点多次产生有效区块且信誉值达到正常节点的阈值,则转换为正常节点;
若异常节点故障或作恶,其状态转换为不可信节点;
若不可信节点多次产生有效区块且其信誉值达到异常节点的阈值,则状态转换为异常节点;
若不可信节点故障或作恶,则状态转换为无效节点;
若审查节点故障,且其信誉值处于可信节点的区间,则状态装换为异常节点;
若审查节点作恶,或者审查节点故障且其信誉值未处于信誉节点的区间,则其状态转换为异常节点。
进一步的,将节点信誉值设置为[0,K),系统刚运行时所有节点的初始信誉值均为K1,如果节点成功产生有效区块,系统会奖励k点信誉值;可信节点的信誉值为[K2-150),正常节点的信誉值为[K1-K2),异常节点的信誉值为[K3-K1),不可信节点的信誉值为[K4-K3),无效节点的信誉值为0;K2、K1、K3、K4分别为可信节点、正常节点、异常节点、不可信节点的阈值。
进一步的,可信节点、正常节点具有参与主节点选举的权限;可信节点、正常节点、异常节点具有参与选举主角点时投票的权限;可信节点、正常节点、异常节点、不可信节点具有参与共识过程的权限。
进一步的,根据投票计算选举出主节点的过程包括:
其中,Scoren为参与选举的节点的得分;creditn是参选节点n的信誉值,creditk是投票节点k的信誉值,votek是k节点投票的投票情况,支持、反对和弃权分别对应1、-1和0;K是信誉值的最大值N是参与投票的节点数量;λ和μ为权重比例,λ+μ=1。
进一步的,当可信节点参加选举主节点时,λ为0.65、μ为0.35;当正常节点参加选举主节点时,λ为0.45、μ为0.55。
进一步的,开始共识过程包括:
主节点广播一致性提案消息;
备份节点接收一致性提案消息,判断主节点是否故障或者作恶,若主节点故障或作恶,则根据主节点异常情况进行视图切换;
否则备份节点广播一致性确认消息;
若主节点在规定时间内收到备份节点广播的2f个有效的一致性确认消息,则达成共识,其他节点执行主节点的请求消息,发布区块;否则执行视图切换过程。
进一步的,进行视图切换的过程包括:
当主节点响应超时,重新选择主节点,新的主节点向备份节点广播new-view消息,并且视图编号加1,新的主节点执行上一个视图未完成的操作;
当主节点响应未超时,若备份节点认为主节点作恶,该备份节点向其他备份节点广播view-change事件,若收到2f个不同备份节点的视图编号为v+1的view-change事件则选择新的主节点,新的主节点向备份节点广播new-view消息,并且视图编号加1,新的主节点执行上一个视图未完成的操作。
本发明优化了PBFT的主节点确认机制,减少了异常节点担任主节点的情况;优化了PBFT的共识过程,节省了节点共识过程中产生的通信资源损耗;优化了PBFT的视图切换协议,提高了视图切换效率。本发明与传统PBFT相比,增加了平均吞吐量,降低了时延,提高了系统的运行效率和安全性。
附图说明
图1为本发明一种基于信誉与投票机制的改进PBFT共识方法的节点状态转化图;
图2为本发明一种基于信誉与投票机制的改进PBFT共识方法的共识过程图;
图3为本发明一种基于信誉与投票机制的改进PBFT共识方法的视图切换过程图;
图4为本发明一种基于信誉与投票机制的改进PBFT共识方法的流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供一种基于信誉与投票机制的改进PBFT共识方法,具体包括以下步骤:
对节点进行状态划分,并根据节点在共识过程的表现进行节点状态的转换;
根据节点的状态进行权限分配,具有参选权限的节点可参与主节点选举,并根据投票计算选举出主节点;
主节点接收客户端发送的请求,广播该请求给备份节点,开始共识过程;
共识过程中,如果主节点故障或作恶,根据主节点异常情况进行视图切换。
在本实施例中,对节点进行状态划分包括根据节点的信誉值从高到低将节点分为可信节点、正常节点、异常节点、不可信节点以及无效节点5个状态,另外设置一个与信誉值无关的状态为审查节点。
进一步的,将节点信誉值设置为[0,K),系统刚运行时所有节点的初始信誉值均为K1,如果节点成功产生有效区块,系统会奖励k点信誉值;可信节点的信誉值为[K2-150),正常节点的信誉值为[K1-K2),异常节点的信誉值为[K3-K1),不可信节点的信誉值为[K4-K3),无效节点的信誉值为0;K2、K1、K3、K4分别为可信节点、正常节点、异常节点、不可信节点的阈值。
在本实施例中,如表1所示,将K设置为150,节点信誉值为100至149时为可信节点(Credible);节点信誉值为60至99时为普通节点(Normal);节点信誉值为30至59时为异常节点(Excepted),节点信誉值为10至29时为不可信节点(Untrusted);节点信誉值为10至29时为无效节点(Invalid);审查节点(Check)为一种特殊的节点状态,无信誉值。另外,设置信誉值100为good信誉阈值,信誉值60为normal信誉阈值,信誉值30为excepted信誉阈值,信誉值10为untrusted信誉阈值。普通节点(Normal)若出现故障或作恶行为则降级为Untrusted,信誉值降为10。
表1
节点状态转换如图2所示。系统刚运行时节点均为Normal状态,当节点多次产生有效区块且信誉值达到可信节点信誉阈值时可升级为Credible状态。处于Credible状态或Normal状态的节点共识过程中未产生有效区块,则该节点状态变为Check状态。此时系统会对节点出错行为和信誉值进行审查,若节点信誉值高于good阈值且节点故障,即节点因为系统繁忙、宕机或网络问题等异常情况导致出块失败,节点将变为Excepted状态;若节点为作恶节点,即节点在共识过程中故意发送错误信息或不同信息给其他节点,使整个集群中的节点无法达成共识,节点将变为Untrusted状态。Excepted状态的节点如果出现故障或作恶情况,将降级为Untrusted状态;Untrusted状态的节点如果出现故障或作恶情况,则节点状态转换为Invalid;另外,节点产生有效区块后信誉值达到一定的阈值,节点状态也会进行相应的升级。
进一步的,本发明对处于不同状态的节点的权限进行限定,如表2所示,Credible和Normal节点拥有参选、投票和共识的所有权限,其中参选即参与主节点选举,投票即为参选的节点投票,共识即参与共识过程;Excepted节点具有投票和共识的权限,但无参选权限,所以不能参与主节点选举;Untrusted节点只能参与共识过程,无参选和投票权限;Invalid节点无法任何权限;Check节点为一种特殊节点,在审查完成之前,也不具备任何权限。
表2
在本实施例中,具有参选权限的节点可以参与主节点选举,本发明提出一种新的投票计算公式,参选节点的最终得分为:
其中,Scoren为参与选举的节点的得分;creditn是参选节点n的信誉值,creditk是投票节点k的信誉值,votek是k节点投票的投票情况,支持、反对和弃权分别对应1、-1和0;K是信誉值的最大值,N是参与投票的节点数量;λ和μ为权重比例,λ+μ=1;本发明中节点的总得分主要分为两部分,基础分和投票分。基础分为参选节点信誉值与参数λ的乘积,投票分为投票节点的信誉值与总信誉值占比,投票情况和参数μ三者计算得到。creditn是参选节点n的信誉值,creditk是投票节点k的信誉值,votek是k节点投票的投票情况,支持、反对和弃权分别对应1、-1和0。另外,引进两个参数λ和μ(λ+μ=1),参与主节点选举的Credible节点和Normal节点具有不同的λ和μ,两个参数在一定程度上可以影响参选节点总得分。节点处于Credible状态时,信誉度较高,成为主节点所需票数应少于Normal节点。然而,λ值越小成为主节点所需票数越多,所以Credible节点的λ值应大于0.5,对应Normal节点的λ值则应小于0.5。通过多次实验测试得出,Credible节点的λ值为0.65,Normal节点的λ值为0.45时,投票选举最公平。所以Credible节点的λ和μ分别为0.65和0.35,Normal节点的λ和μ分别为0.45和0.55。
对于主节点选取,PBFT算法依据公式p=v mod N按顺序确定主节点编号,异常节点很有可能担任主节点,影响系统的运行效率。IPBFT算法中,引入信用模型与投票机制优化主节点确认机制,信誉度高的节点通过选举成为主节点的概率较大,有效降低异常担任主节点的可能性,提高了系统安全性和运行效率。算法伪代码如下:
Master()为主节点确认函数,返回主节点编号,Scores数组存放的是按参选节点总得分排序后的节点编号,当change-view(视图切换信号)为真,则进行视图切换操作,视图编号加1,并选取排序节点中的下一个节点作为主节点。
本发明改进的PBFT的共识过程如图2所示。PBFT算法主要实现参与共识的节点达成一致,主节点广播请求消息给备份节点,备份节点只需要对接收的请求信息在准备阶段进行验证,当准备阶段完成后说明已经有足够数量的备份节点验证并通过了主节点发送的请求,即达成共识。而确认阶段只是对准备阶段中通过的信息进行确认,确保合法数量的节点完成对请求消息的验证。因此可将PBFT核心三阶段共识过程优化为两个阶段,即一致性提案(consistency-proposal)和一致性确认(consistency-confirm)。
如图3所示为IPBFT的视图切换过程。如果主节点失效,通过视图切换协议可以保证共识系统持续运行,并且不会产生错误的结果。PBFT算法中,当备份节点检测到主节点故障或作恶时,会向其他节点广播view-change消息,进入视图切换流程。本发明改进的PBFT的视图切换流程中在客户端设置超时机制,如果主节点超时,则主节点可能因为系统繁忙、宕机或者网络问题等其它异常情况导致的无响应,也可能故意不响应客户端发送的请求,此时可以明确当前主节点异常。然而,视图切换流程中的view-change阶段和view-change-ack(视图切换确认信号)阶段,主要通过投票方式确定主节点是否异常。所以本发明改进的PBFT的视图切换流程中,若主节点超时,则直接开始视图切换流程中的new-view(新视图)阶段,并通过主节点确认机制中的Master()算法确定新的主节点。新的主节点向其他节点广播new-view消息,并在新的view(视图)中继续执行上个视图未处理完的请求;如果备份节点认为主节点为作恶节点时,会向其他节点广播view-change消息,正常进行view-change,view-change-ack和new-view三阶段视图切换流程。本发明改进的PBFT算法在PBFT算法中的视图切换协议的基础上,对主节点异常情况进行分类讨论,节省了主节点超时异常时节点之间的通信时间,提高了系统运行效率。
本发明改进的PBFT算法流程如图4所示。本发明改进的PBFT算法优化了PBFT算法的主节点确认机制、共识过程和视图切换协议,改进的PBFT的详细算法流程如下:
(1)将视图编号设置为0,根据主节点确认函数Master()确认主节点编号。
(2)主节点向备份节点广播consistency-proposal消息,其消息格式为<<ConsistencyProposal,h,v,p,md>,m>,其中h为区块高度,v为当前视图编号,p为主节点编号,md为m消息的摘要,m为请求消息的原文。
(3)备份节点收到consistency-proposal消息时,需要对consistency-proposal消息进行签名验证,如果确定消息为真,则向其他节点广播consistency-confirm消息。其消息格式为<ConsistencyConfirm,h,v,i,md>,<md>σi>,其中i为节点编号,<md>σi为节点i转发自主节点p的消息摘要,表示对主节点发送的consistency-proposal消息的认可。
(4)若参与共识的任意节点收到2f个有效的consistency-confirm消息后,共识达成,节点执行主节点发送的请求,并发布区块。
(5)其他节点在收到区块后,认为该轮共识过程结束,将包含的交易从内存中删除,将视图编号重置为0,开始下一轮共识。
(6)上述过程中,如果主节点故障或作恶,或者节点在一定时间内未收到2f个有效的consistency-confirm消息,则进入图3中的视图切换协议。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。