胡继圆, 于 瓅
(安徽理工大学计算机科学与工程学院,安徽 淮南 232001)
随着区块链的迅速发展,作为区块链的核心技术—共识算法,逐渐掀起研究的热潮,应用最广泛的共识算法之一为实用拜占庭容错算法(PBFT),它很大程度上解决了恶意节点的问题,具有较高的共识效率。但当前PBFT算法也存在一些不足,如节点不能动态加入或退出,当作恶节点出现时,无法踢出该节点等。针对此类问题,国内外学者从不同方面对PBFT做出了改进。胡振宇[1]提出设计一种信誉机制,结合环签名方式对PBFT共识过程进行改进。Xu[2]等人对PBFT算法流程进行划分,提高算法容错性。Tang[3]等人利用节点分级的方式赋予节点不同权限,提高了PBFT算法的共识效率。这些方案从不同角度对PBFT进行了改进,也取得一定效果,但其目前仍存在通信次数多,算法效率低以及恶意节点当选主节点等问题。针对上述问题,提出一种基于双重信誉机制实用拜占庭容错算法,选择部分高质量节点参与共识,减少了节点通信次数,增加惩罚机制以遏制低质量节点作恶行为,提高共识效率。
区块链中有许多种类的共识算法,PBFT作为区块链中最常用的投票类算法之一,以其算法复杂度较低、适用异步环境等特点被广泛应用。该算法由Castro和Liskov为解决拜占庭将军问题而设计出的,目的是解决区块链网络中存在恶意节点问题,其三段式共识协议保障了网络的安全运行,即当系统存在3f+1个节点时,允许不超过f个节点出错,PBFT算法赋予参与节点很大伸缩性,也使区块链安全更有保障。
PBFT算法规定一次共识的所有节点都在一个视图里,节点分为主节点和从节点,主节点只有一个,由从节点轮流当选。客户端发送请求后,由主节点接收客户端发来的请求将其进行排序编号,之后将消息发送给所有从节点,由从节点对消息进行验证和广播,将结果返回给客户端。PBFT的共识过程主要分为:Pre-prepare,prepare和commit三个阶段,流程如图1。
针对PBFT算法中节点通信次数较多以及恶意节点当选主节点的问题,这里提出一种基于双重信誉机制的实用拜占庭容错算法(DB-PBFT),通过考虑节点自身和在共识过程中的表现,计算出每个节点的静态和动态信誉值作为其总的信誉积分,以此标记节点的状态并对节点进行划分,再从中选择信誉值高的节点作为主节点和共识节点,减少恶意节点作恶的几率。此外,DB-PBFT算法还设计了对节点的奖惩机制,对积极参与共识响应系统消息的节点提高其信誉度并给予定奖金作为奖励,对出现故意占用资源和延迟响应消息的行为的节点,没收其押金并降低信誉度,该算法提高了系统的效率,确保共识的安全。
图1 PBFT共识流程
2.2.1 节点静态信誉积分
节点第一次加入区块链网络时,应考虑到其CPU利用率、投入固定成本和内存等自身因素,假设区块链网络中有n个参与节点(n≥4)。
(1)CPU利用率
当存在n个节点时,对于参与的每个节点i,一段时间t内其CPU利用率为用户状态和内核状态下CPU的使用占总体的比值,用公式(1)计算:
CPU(t)=
(1)
(2)投入固定成本
节点i加入区块链网络时需要提交一定的押金Mi作为信任度的凭证,假设所有节点押金之和为Mn,节点投入固定成本对节点信任度的影响量为式(2):
(2)
(3)内存利用率
设节点的总内存为MEMTotal,一段时间内闲置内存为MEMFree,节点的内存利用率计算方式为式(3):
(3)
通过上述公式的计算,可得出节点i静态信誉值的计算方式为式(4):
(4)
2.2.2 节点动态信誉积分
影响节点动态信誉值的因素主要从节点通信积极度、节点共识影响度和共识表现行为等方面考虑。
(1)节点通信积极度
即节点在Δt时间内请求通信消息次数MES(Δt)占总通信次数M的比例为式(5):
(5)
(2)节点共识影响度
设节点i在Δt时间内成功参与共识次数为Gi,该段时间网络内总成功共识次数为G,节点未完成共识次数为Fi,共识失败总次数为F,表示为式(6):
(6)
(3)共识表现行为
设θ为共识影响指数,S为网络中总的共识次数,e为节点i最近一次参与共识的轮次数,则共识表现行为表示为式(7):
(7)
计算节点i动态信誉积分为式(8):
Di=β1Vi+β2INFi+β3Ui(β1,β2,β3为权重值)
(8)
节点总信誉值为式(9):
Ri=u1Qi+u2Di(μ1,μ2为权重值)
(9)
节点更新自身信誉值需要耗费一定时间和算力,而长时间不更新信誉值会造成对节点状态判断的不准确。因此设定每五次共识为一个周期,每一个周期开始前,节点都会更新自身状态值以此作为节点划分标准。
为解决PBFT通信次数较多的问题,通过信誉值对节点进行划分,选择部分节点参与共识。假设区块链网络中有3f+1个节点,经过k轮共识后,划分规则及不同节点的权限为:
(4)信誉值低于Kn的节点为Low节点。
表1 节点权限
节点每成功完成一次共识,系统将其信誉值增加0.1,同时系统会发放一定奖金以激励其正确行为,当节点发生故障时会扣除其0.5的信誉值,并没收押金作为惩罚。当低等节点信誉值不断增加大于Kn时,其节点状态会变为Normal节点,随着信誉值增加到Kt,该节点状态将转变为Trust节点,当信誉值达到Kg时,其节点状态会变为Superior节点,可以优先成为主节点。若共识节点被判定为出现节点故障时,会降低其信誉值,直到低于阈值Kn,将被踢出共识群组。节点状态转移过程如图2。
图2 节点状态转换
为证明DB-PBFT算法的优越性,这里基于go语言来进行算法的代码编写,实验硬件为8GB内存和Windows10的操作系统,通过Hyperledger Fabric 2.0搭建平台,由于共识需要的节点较多,故使用docker容器来仿真节点,对比实验为PBFT和CLBFT[7]。
图3 时延对比
这里考虑拜占庭节点对系统的破坏为占用资源导致延迟响应,当网络中的节点为8,10,12,14,16和18时,分别对其做100次重复实验,取最后的平均值为测试结果。
从图3中可以看出,随着节点数增多时,DB-PBFT共识时延明显低于其他两种算法。表现出较高的共识效率。
当区块链网络中有N个节点时,传统PBFT算法的通信次数C为式(10):
C=2N2-2N
(10)
CLBFT算法的通信次数C'为式(11):
C′=(P+2)N(N-1)+(N-1) (P∈(0,1))
(11)
(12)
图4为三种算法在给定节点的情况下的通信次数对比图,这里使用的对比算法CLBFT通信次数与概率P有关,当P为0时取得最小通信次数。
图4 通信次数对比
从图4中可以看出DB-PBFT算法的通信次数明显低于其他两种算法,当节点增多时这种效果更加明显,有效减少系统的通信开销。
吞吐量的大小体现的是节点处理交易数据和响应请求的能力,这里工作的节点设定为64,恶意节点是随机产生的,但不超过21个,三种算法的吞吐量测试为图5所示。
图5 吞吐量对比
从图5中可以看出,三种算法的吞吐量随着共识次数增多都逐渐减小,这是由于节点自身工作性能影响导致的,但DB-PBFT算法实验结果明显高于另外两种算法的吞吐量,有效提升了系统的工作效率。
通过对联盟链中的PBFT共识算法进行研究,发现其存在主节点选择随意、通信复杂度较高以及恶意节点无法排除等缺点,提出了一种基于双重信誉机制的拜占庭容错算法,根据节点信誉值选取部分高质量节点参与共识,减少了主节点出错的概率的同时降低了通信次数。通过实验比对两种算法可以看出,相较于PBFT和CLBFT算法,DB-PBFT更加节约资源,系统吞吐量以及工作效率都显著提高。