区块链类比于一种分布式存储系统,
这种存储系统有可持续增长,不可篡改的特点。
区块链中的共识是多个节点对某一个状态达成一致的过程。
PBFT是一种快速的共识机制。
但有无法动态调整网络的缺陷。
对此缺陷,江苏大学的储劲松提出了DNBFT共识,这里来学习一下。
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总节点数不能动态改变,导致新入学的同学无法加入网络,被开除的同学无法退出网络。
DNBFT共识,即在PBFT基础上添加了JOIN协议4个子协议,来满足节点添加和删除的功能。
四个子协议为: JOIN EXIT PCLEAR CLEAR
节点加入 节点退出 主节点被动退出 备份节点被动退出
同时维护节点状态表
NodeID从小到大寻找良性状态节点,来胜任leader节点。
刚进入网络的节点状态设为 Benign
离开网络的节点状态设为 Absent
有恶意行为的节点状态设为 Malicious
阶段一
新节点 首先到 CA_Node 注册,CA_Node检查其身份合法之后,在节点表后面添加新记录,例如这个新节点是节点g。
CA_Node将 g 的加入申请消息
广播,发给所有备用节点。
所有节点(例如节点i)收到消息
后,验证消息签名sig_ca。然后将收到的消息和CA_Node提供的节点状态表进行比对。
比对通过后,节点i开始JOIN协议。
阶段二
当进入JOIN协议之后,节点i停止收发常规PBFT的四个子协议(pre-prepare,prepare,commit,reply)。
节点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消息后,向全网广播
消息
其中
V:来自2f+1个节点的JOIN有效消息
O:从V中选择高度最低的prepare消息,其高度计作min;选择高度最高的prepare消息,其高度计作max;对于V中所有发出高度是min的消息的节点,生成一个该节点的prepare消息(可以伪造?),这些消息组成了O。
g:待加入的节点
sig_p:主节点的签名
阶段四
当所有节点收到来自主节点p的NEWVIEW消息之后,进行核对,核对正确后。将本地的节点状态表进行更新,添加节点g。
至此,节点g正式加入网络。
退出网络有两种情况,主动离开和被动离开。主动离开就是因为节点自身原因主动离开网络,被动离开就是节点因为作恶或者不作为被强行清除出网络。
阶段一
想要退出的节点记为节点i。
节点i向CA_Node请求退出网络。
节点i向网络广播
消息,
CA_Node收到节点i广播的EXIT消息之后,记录节点i到CLR列表。
CA_Node广播CLR消息,将节点i的状态改为absent。
阶段二
普通节点i在收到EXIT-REQ后,将消息记录下来。
等接到CLR消息后,查找CLR列表中未过期的地址。
比对地址和本地的EXIT-REQ记录,
将相同的地址从本地节点的节点状态表中删除。
阶段三
普通节点j在将节点i状态置为absent之后,
向全网广播
,
当新leader节点收到2f+1个EXIT消息之后,
向全网广播
阶段四
到此位置,所有节点将节点i的状态置为absent
然后每一个节点向要退出的节点i发送
当节点i收到f+1个EXIT-REPLY之后,即认为自己已经退出网络。
DNBFT和PBFT一样,允许f个故障节点。
对于恶意节点,PBFT共识只能容忍。
而DNBFT共识在容忍恶意节点作恶的同时能够动态的剔除恶意节点。
通过剔除恶意节点并且阻止恶意节点再次进入网络,来降低恶意节点出现的概率。
阶段一
恶意主节点 记为 节点z
有 普通节点 节点i
新主节点 节点j
节点i向全网广播
C和P依旧是消息集合
当新主节点收到PCLEAR消息2f+1个时,
向除了节点z的全网广播
,
普通节点检查NEW-VIEW消息的签名 合法性
阶段二
此时全网对 恶意节点z 的排挤动作已完成
所有节点已将恶意节点z的节点状态置为 malicious
所有节点向 恶意节点z 和 NodeCA 发送消息
当NodeCA收到了f+1个PCLEAR-REPLY之后,将节点z在NodeCA的节点状态置为 malicious
从此,节点z将再也无法加入网络
普通节点主观判断主节点是否为恶意节点,是简单的。
但
普通节点难以判断一个普通节点是否为恶意节点。
DNBFT引入两个术语
阶段一
普通节点i要驱逐恶意普通节点z
普通节点i向全网广播
阶段二
当主节点leader收到2f+1个CLEAR消息后
向全网广播
普通节点收到NEW-VIEW之后,进行签名验证。
将Z中包含的恶意节点进行驱逐
将状态置为malicious
阶段三
普通节点i向恶意节点和NodeCA发送
消息
当NodeCA收到消息之后,将恶意节点Z们的状态置为Malicious
至此驱逐过程结束
这个DNBFT共识有NodeCA这个非常中心化的设定。
共识中似乎有一些异常状态会导致共识的失败,这个我在研究研究。
[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.