DNBFT共识——一种可动态调节网络节点数的PBFT优化方案
2021-05-29

摘要

区块链类比于一种分布式存储系统,
这种存储系统有可持续增长,不可篡改的特点。
区块链中的共识是多个节点对某一个状态达成一致的过程。
PBFT是一种快速的共识机制。
但有无法动态调整网络的缺陷。
对此缺陷,江苏大学的储劲松提出了DNBFT共识,这里来学习一下。

PBFT共识

PBFT流程简述

PBFT共识过程分为四个阶段,分别是pre-prepare、Prepare、Commit、Reply。

pre-prepare: 所有普通节点向leader节点发送transaction交易信息,leader收集交易信息,并对transactions进行选择和排序,整理出来要写入新区块的交易集合,并广播这个transactions集合。
Prepare: 各节点收到transactions集合之后,在本地对transactions进行演算,更新节点状态。更新后,根据transactions计算的结果生成一个校验值,并将自己生成的校验值广播出去。
commit:当节点收到2f个不同节点发来的校验值,和自己的校验值比较相等之后,向全网广播一个commit消息。
Relay: 当leader节点收到2f个不同节点发来的commit消息之后,将提交新区块到本地的链上,并提交新区块。至此,新的区块上链。
PBFT
详细共识流程和原理PBFT机制原理

PBFT节点进出机制

PBFT共识协议本身没有动态机制

PBFT本身不能动态共识,每一轮的节点数是固定的。这个特性在现实环境中有很多不利影响。例如,想新节点无法加入到网络中;恶意节点无法从网络中剔除。

例如,想用高吞吐、快速的PBFT共识来做一个学生学分的区块链系统,增强学分系统的公信度。但是因为PBFT总节点数不能动态改变,导致新入学的同学无法加入网络,被开除的同学无法退出网络。

PBFT的动态共识机制改良

DNBFT共识设定

DNBFT共识,即在PBFT基础上添加了JOIN协议4个子协议,来满足节点添加和删除的功能。
四个子协议为: JOIN EXIT PCLEAR CLEAR
节点加入 节点退出 主节点被动退出 备份节点被动退出
同时维护节点状态表
节点状态表
NodeID从小到大寻找良性状态节点,来胜任leader节点。
刚进入网络的节点状态设为 Benign
离开网络的节点状态设为 Absent
有恶意行为的节点状态设为 Malicious

DNBFT 动态添加节点过程

DNBFT过程
阶段一
新节点 首先到 CA_Node 注册,CA_Node检查其身份合法之后,在节点表后面添加新记录,例如这个新节点是节点g。
CA_Node将 g 的加入申请消息<JOIN,g,IP,PK>sig_ca广播,发给所有备用节点。
所有节点(例如节点i)收到消息<JOIN,g,IP,PK>sig_ca后,验证消息签名sig_ca。然后将收到的消息和CA_Node提供的节点状态表进行比对。
比对通过后,节点i开始JOIN协议。

阶段二
当进入JOIN协议之后,节点i停止收发常规PBFT的四个子协议(pre-prepare,prepare,commit,reply)。
节点i广播一个<JOIN,v+1,h,C,P,g,i>sig_i消息
其中
v : pbft的视图编号
h : 当前区块高度(论文里写的是序列号...这里我是不是理解的有问题
C : 来自2f+1个不同节点的消息(这个C用来证明当前高度确实是h
P : 高度大于h的消息集合pm,其中必须有一个pre-prepare消息和2f+1个prepare消息(这是干啥的呢
g:待添加的节点id
i:本节点id
sig_i: 本节点签名

阶段三
当主节点p收到2f+1个有效的JOIN消息后,向全网广播<NEWVIEW,v+1,V,O,g>sig_p消息
其中
V:来自2f+1个节点的JOIN有效消息
O:从V中选择高度最低的prepare消息,其高度计作min;选择高度最高的prepare消息,其高度计作max;对于V中所有发出高度是min的消息的节点,生成一个该节点的prepare消息(可以伪造?),这些消息组成了O。
g:待加入的节点
sig_p:主节点的签名

阶段四
当所有节点收到来自主节点p的NEWVIEW消息之后,进行核对,核对正确后。将本地的节点状态表进行更新,添加节点g。
至此,节点g正式加入网络。

DNBFT 主动离开

退出网络有两种情况,主动离开和被动离开。主动离开就是因为节点自身原因主动离开网络,被动离开就是节点因为作恶或者不作为被强行清除出网络。

阶段一
想要退出的节点记为节点i。
节点i向CA_Node请求退出网络。
节点i向网络广播<EXIT-REQ,i,IP,PK>sig_i消息,
CA_Node收到节点i广播的EXIT消息之后,记录节点i到CLR列表。
CA_Node广播CLR消息,将节点i的状态改为absent。

阶段二
普通节点i在收到EXIT-REQ后,将消息记录下来。
等接到CLR消息后,查找CLR列表中未过期的地址。
比对地址和本地的EXIT-REQ记录,
将相同的地址从本地节点的节点状态表中删除。

阶段三
普通节点j在将节点i状态置为absent之后,
向全网广播<EXIT,v+1,h,C,P,E,i>sig_j,
当新leader节点收到2f+1个EXIT消息之后,
向全网广播<NEW-View,v+1,V,O,E>sig_leader

阶段四
到此位置,所有节点将节点i的状态置为absent
然后每一个节点向要退出的节点i发送<EXIT-REPLY,v+i,j,i>sig_j
当节点i收到f+1个EXIT-REPLY之后,即认为自己已经退出网络。

DNBFT 主节点被动离开

DNBFT和PBFT一样,允许f个故障节点。
对于恶意节点,PBFT共识只能容忍。
而DNBFT共识在容忍恶意节点作恶的同时能够动态的剔除恶意节点。
通过剔除恶意节点并且阻止恶意节点再次进入网络,来降低恶意节点出现的概率。
被动退出协议
阶段一
恶意主节点 记为 节点z
有 普通节点 节点i
新主节点 节点j
节点i向全网广播 <PCLEAR,v+1,h,C,P,z,i>sig_i
C和P依旧是消息集合
当新主节点收到PCLEAR消息2f+1个时,
向除了节点z的全网广播 <NEW-VIEW,v+1,V,O,z>sig_j
普通节点检查NEW-VIEW消息的签名 合法性

阶段二
此时全网对 恶意节点z 的排挤动作已完成
所有节点已将恶意节点z的节点状态置为 malicious
所有节点向 恶意节点z 和 NodeCA 发送消息<PCLEAR-REPLY,v+1,z,i>sig_i
当NodeCA收到了f+1个PCLEAR-REPLY之后,将节点z在NodeCA的节点状态置为 malicious
从此,节点z将再也无法加入网络

DNBFT 普通节点被动离开

普通节点主观判断主节点是否为恶意节点,是简单的。

普通节点难以判断一个普通节点是否为恶意节点。
DNBFT引入两个术语

  • 参与度(PD) 当一个普通节点Node_i参加了一次完整的共识,Node_i.PD +=1,相反则PD -= 1,PB初始值为3,0 <= PD <=3,PD 为整数。PD==0时,则节点为恶意节点
  • 成功完成共识后,如果节点j 与 2f+1个节点提交的信息一样,则记为完成一次完整的共识。

阶段一
普通节点i要驱逐恶意普通节点z
普通节点i向全网广播<CLEAR,v+1,h,C,P,z,i>sig_i

阶段二
当主节点leader收到2f+1个CLEAR消息后
向全网广播<NEW-VIEW,v+1,V,O,Z>sig_leader
普通节点收到NEW-VIEW之后,进行签名验证。
将Z中包含的恶意节点进行驱逐
将状态置为malicious

阶段三
普通节点i向恶意节点和NodeCA发送<CLEAR-REPLY,v+1,Z,i>sig_i消息
当NodeCA收到消息之后,将恶意节点Z们的状态置为Malicious
至此驱逐过程结束

思考

这个DNBFT共识有NodeCA这个非常中心化的设定。
共识中似乎有一些异常状态会导致共识的失败,这个我在研究研究。

引用,国内外对BFT共识的研究

[1]张迪.另一种BFT共识算法在区块链中的应用[J].传播力研究,2019,3(28):272.

[2]戴鹏. 基于实用拜占庭共识算法(PBFT)的区块链模型的评估与改进[D].北京邮电大学,2019.

[3]王永革 PBFT 拜占庭协议安全性分析:不适合联盟链或公链 https://www.theblockbeats.com/news/6208

[4] Andrew Miller. The Honey Badger of BFT Protocols https://eprint.iacr.org/2016/199.pdf

[5]杨磊,黄浩,李仁发,李肯立.P2P存储系统拜占庭容错机制研究[J].计算机应用研究,2009,26(01):4-8+40.

[6]储劲松. 基于PBFT算法的动态共识机制研究[D].江苏大学,2019.