论文笔记 - DBFT: Efficient Byzantine Consensus with a Weak Coordinator

PBFT算法流程:

PBFT算法前提,采用密码学算法保证节点之间的消息传送是不可篡改的。

PBFT容忍无效或者恶意节点数:f,为了保障整个系统可以正常运转,需要有2f+1个正常节点,系统的总节点数为:|R| = 3f + 1。也就是说,PBFT算法可以容忍小于1/3个无效或者恶意节点,该部分的原理证明请参考PBFT论文,下文有链接地址。

PBFT是一种状态机副本复制算法,所有的副本在一个视图(view)轮换的过程中操作,主节点通过视图编号以及节点数集合来确定,即:主节点 p = v mod |R|。v:视图编号,|R|节点个数,p:主节点编号。

PBFT算法主体实现流程图如下:

 

以下详细说明,每个主体流程内容:

1. REQUEST

客户端c向主节点p发送<REQUEST, o, t, c>请求。o: 请求的具体操作,t: 请求时客户端追加的时间戳,c:客户端标识。REQUEST: 包含消息内容m,以及消息摘要d(m)。客户端对请求进行签名。

2. PRE-PREPARE

主节点收到客户端的请求,需要进行以下交验:

a. 客户端请求消息签名是否正确。

非法请求丢弃。正确请求,分配一个编号n,编号n主要用于对客户端的请求进行排序。然后广播一条<<PRE-PREPARE, v, n, d>,  m>消息给其他副本节点。v:视图编号,d客户端消息摘要,m消息内容。<PRE-PREPARE, v, n, d>进行主节点签名。n是要在某一个范围区间内的[h, H],具体原因参见垃圾回收章节。

3. PREPARE

副本节点i收到主节点的PRE-PREPARE消息,需要进行以下交验:

a. 主节点PRE-PREPARE消息签名是否正确。

b. 当前副本节点是否已经收到了一条在同一v下并且编号也是n,但是签名不同的PRE-PREPARE信息。

c. d与m的摘要是否一致。

d. n是否在区间[h, H]内。

非法请求丢弃。正确请求,副本节点i向其他节点包括主节点发送一条<PREPARE, v, n, d, i>消息, v, n, d, m与上述PRE-PREPARE消息内容相同,i是当前副本节点编号。<PREPARE, v, n, d, i>进行副本节点i的签名。记录PRE-PREPARE和PREPARE消息到log中,用于View Change过程中恢复未完成的请求操作。

4. COMMIT

主节点和副本节点收到PREPARE消息,需要进行以下交验:

a. 副本节点PREPARE消息签名是否正确。

b. 当前副本节点是否已经收到了同一视图v下的n。

c. n是否在区间[h, H]内。

d. d是否和当前已收到PRE-PPREPARE中的d相同

非法请求丢弃。如果副本节点i收到了2f+1个验证通过的PREPARE消息,则向其他节点包括主节点发送一条<COMMIT, v, n, d, i>消息,v, n, d,  i与上述PREPARE消息内容相同。<COMMIT, v, n, d, i>进行副本节点i的签名。记录COMMIT消息到日志中,用于View Change过程中恢复未完成的请求操作。记录其他副本节点发送的PREPARE消息到log中。

5. REPLY

主节点和副本节点收到COMMIT消息,需要进行以下交验:

a. 副本节点COMMIT消息签名是否正确。

b. 当前副本节点是否已经收到了同一视图v下的n。

c. d与m的摘要是否一致。

d. n是否在区间[h, H]内。

非法请求丢弃。如果副本节点i收到了2f+1个验证通过的COMMIT消息,说明当前网络中的大部分节点已经达成共识,运行客户端的请求操作o,并返回<REPLY, v, t, c, i, r>给客户端,r:是请求操作结果,客户端如果收到f+1个相同的REPLY消息,说明客户端发起的请求已经达成全网共识,否则客户端需要判断是否重新发送请求给主节点。记录其他副本节点发送的COMMIT消息到log中。

垃圾回收:

在上述算法流程中,为了确保在View Change的过程中,能够恢复先前的请求,每一个副本节点都记录一些消息到本地的log中,当执行请求后副本节点需要把之前该请求的记录消息清除掉。最简单的做法是在Reply消息后,再执行一次当前状态的共识同步,这样做的成本比较高,因此可以在执行完多条请求K(例如:100条)后执行一次状态同步。这个状态同步消息就是CheckPoint消息。

副本节点i发送<CheckPoint, n, d, i>给其他节点,n是当前节点所保留的最后一个视图请求编号,d是对当前状态的一个摘要,该CheckPoint消息记录到log中。如果副本节点i收到了2f+1个验证过的CheckPoint消息,则清除先前日志中的消息,并以n作为当前一个stable checkpoint。

这是理想情况,实际上当副本节点i向其他节点发出CheckPoint消息后,其他节点还没有完成K条请求,所以不会立即对i的请求作出响应,它还会按照自己的节奏,向前行进,但此时发出的CheckPoint并未形成stable,为了防止i的处理请求过快,设置一个上文提到的高低水位区间[h, H]来解决这个问题。低水位h等于上一个stable checkpoint的编号,高水位H = h + L,其中L是我们指定的数值,等于checkpoint周期处理请求数K的整数倍,可以设置为L = 2K。当副本节点i处理请求超过高水位H时,此时就会停止脚步,等待stable checkpoint发生变化,再继续前进。

View Change

如果主节点作恶,它可能会给不同的请求编上相同的序号,或者不去分配序号,或者让相邻的序号不连续。备份节点应当有职责来主动检查这些序号的合法性。如果主节点掉线或者作恶不广播客户端的请求,客户端设置超时机制,超时的话,向所有副本节点广播请求消息。副本节点检测出主节点作恶或者下线,发起View Change协议。

副本节点向其他节点广播<VIEW-CHANGE, v+1, n, CP, i>消息。n是最新的stable checkpoint的编号,C2f+1验证过的CheckPoint消息集合,P是当前副本节点未完成的请求的PRE-PREPARE和PREPARE消息集合。

当主节点p = v + 1 mod |R|收到2f个有效的VIEW-CHANGE消息后,向其他节点广播<NEW-VIEW, v+1, VO>消息。V是有效的VIEW-CHANGE消息集合。O是主节点重新发起的未经完成的PRE-PREPARE消息集合。PRE-PREPARE消息集合的选取规则:

1. 选取V中最小的stable checkpoint编号min-s,选取V中prepare消息的最大编号max-s。

2. 在min-s和max-s之间,如果存在P消息集合,则创建<<PRE-PREPARE, v+1, n, d>, m>消息。否则创建一个空的PRE-PREPARE消息,即:<<PRE-PREPARE, v+1, n, d(null)>, m(null)>, m(null)空消息,d(null)空消息摘要。

副本节点收到主节点的NEW-VIEW消息,验证有效性,有效的话,进入v+1状态,并且开始O中的PRE-PREPARE消息处理流程。

PBFT通常假设拜占庭(无效)节点有f个,服务节点为3f+1个,但是在实际的系统搭建中,只能大概率保证好的节点数目≥2f+1.

另外PBFT的通讯量复杂度为O( ),所以难以适用大规模像全球性的业务流程,只适用与含有少量节点的政府或大型企业(联盟链、私有链)。

在PBFT中依赖于一个Leader(coordinator),如果它是拜占庭节点并向其它节点分发了错误的消息,那么其它正确节点只能选择忽视这条消息,客户端超时,向所有节点分发消息,检查出主节点作恶或下线,发起view change协议更换主节点,浪费时间(需要从coordinator接受特定的消息,有时也必须回复),所以提出了弱coordinator的解决方法。

以上结合reduction of multivalue to binary consensus提出了一个时间最优(4个消息延迟)、鲁棒性最优、并且不需要数字签名的DBFT共识算法(应用在联盟链中)。

构建拜占庭计算模型

  1. 异步进程:异步,每个进程都按照自己的速度(可以随着时间变化)执行并且始终不知道其它进程的进展。连续,进程一次执行一个步骤,但并不防止它使用适当的多路复用执行几个线程。
  2. 通讯网路:异步,消息传输延迟没有限制但延迟是有限的。可靠,网络不会丢失、复制、修改或创建消息。点对点,每一对进程是双向联通的,因此可以识别发送者。
  3. 失败模型:一个拜占庭节点可能崩溃,无法发送或接受消息(任意的状态转换),可以在任意的状态下发送任意的消息,可以通过贿赂“污染”其它节点。拜占庭节点不能模仿其它节点,可以通过改变消息的接受顺序来控制(影响)网络,但不能永远不接受消息。
  4. 另外的同步假设(◇Synch):原因,在完全的异步消息传递网络中无法保证安全性和活性,拜占庭失败模型比碰撞失效模型严重的多,为了规避进程可能导致拜占庭失败而仍然被共识认可的可能性,并且确保终止性的属性。在有限的时间τ后,在消息延迟和进程计算延迟有一个δ上限。
  5. 符号:BAMPn,t  [∅],拜占庭异步消息消息传递共识模型;∅表示没没有额外的假设;基本计算模型,BAMPn,t  [t<n/3],后一种模型,BAMPn,t  [t<n/3, ◇Synch]

二元拜占庭共识

前提:弱协调者、BAMPn,t  [∅]、V = {0,1}

BBC-终止性:每个正确的进程最终都会决定一个Value。

BBC-协议性:两个正确的进程不会决定不同的Value。

BBC-有效性:如果所有的正确节点都提出了相同的Value,不会有其它的Value被决定。

  1. 二值communication abstraction 传播

BV-broadcast:

BV-Obligation,如果至少有(t+1)个正确进程BV-broadcast了相同的Value v,则v最终将添加到每个正确进程pibin valuesi 集合。

BV-Justfication,如果pi 是正确进程并且v属于bin valuesi ,v已经被正确进程BV-broadcast。

BV-Uniformity,如果v被添加到了一个正确进程的bin-values,那么最终它将被添加到每个正确进程的bin-values。

BV-Termination,最终每个正确进程pibin valuesi 集合都是非空的。

结果:

1最终每个正确进程pibin valuesi 集合都是非空的;2变得平等;3包含所有被正确进程broadcast的values;4不会包含任何一个仅被拜占庭进程broadcast的value。然而正确进程并不清楚第二和第三条什么时候发生。

  1. 本地变量和消息类型

每个进程pi 管理这些本地变量:

esti:本地对于目前决定的value的估值,由pi提议的value初始化。

ri:本地异步轮次,初始为0。

bin_valuesi[1..]:二元values数组,初始为空。

bi:auxiliary二元value。

valuesi:auxiliary values集合

在每一轮算法使用的两种消息类型:

EST[r]():pi在第r轮去BV-broadcast它目前决定的估值esti。

AUX[r]():pi去散播它bin_valuesi[r]的value。

  1. 一个安全的异步二元拜占庭共识算法(协议性和有效性)

在r轮次中,每一个正确进程pi都执行以下三个阶段。

二元value传播过滤掉拜占庭进程:

进程pi首先传播它目前的估值(L4),每个进程pi在接受到t+1个其它进程的相同value后,pi重新传播这个value。而当pi从不同的2t+1个进程收到相同的v后,通过BV-delivers将v添加到它的bin_valuesi(非空不一定就有最终价值)。

交换估计value以达到一致协议:

pi通常传播一个消息AUX[r](bin_valuesi[r]),然后pi等待直到它接收到的valuesi集合满足-在valuesi中的values来自于至少(n-t)个不同进程的AUX[r]();valuesi⊆bin_valuesi[r]。(L7)之后valuesi⊆{0,1}并且仅包含由正确进程BV-broadcast传播的value。

决定估计value收敛到mod2的整数(L8-12):

根据valuesi的内容pi试着去决定value b=r mod 2-如果valuesi仅包含一个元素v,则v成为pi新的估计,然而,v只是共识决定的候选,为了确保BBC-Agrement,v仅在v=b时决定;如果valuesi={0,1},pi不能决定。

   我们观察到decide(v)并不能终止pi的参与,它仍然在无止尽的循环,这

   是因为一个决定的进程应该帮助其它进程在随后的两轮中也达成一致决定。

  1. Psync-安全性和活性的共识

时间最优:O(t)时间延迟为终止,当所有正确进程提出相同的value,O(1),不需要等待与回复协调者的消息。

轮次r的弱coordinator:(p)i=((r-1)mod n)+1,通过建议一个value来帮助协定。

额外的本地变量:

timeri:本地timer,timeouti是timeout value,都与◇Synch有关。

coordi:目前这一轮弱coordinator的索引。

auxi:auxiliary values集,存储当前弱coordinator努力施加影响的决定值。

OPT1仅在多值一致性的简化中使用,OPT2是为了最大限度的减少决策后需要执行的额外轮次。

N2、3、5,M6允许当前弱coordinator提出第一个value并添加到它的bin_values作为决定value,正确进程间及时的交换消息后有一个时间段,这确保了他们在这一轮正确的进程都有了唯一的决定后的值在它们的valuesi集合。

弱coordinator仅仅帮助传播被所有正确进程采用的值来帮助完成协定性:

如果Pk是正确的进程,那么timeout value对于正确进程而言是足够的,并且消息传输延迟有一个界限,所以所有的正确进程都将在timer 终结前收到它;所有正确的进程发送auxi到{w},w∈bin_valuesi[ri]防止拜占庭coordinator去发送错误的values;最后所有正确进程将收到来自于(n-t)个不同进程的消息AUX[ri]({w}),设置valuesi={w},这需要它们在(r+1)或(r+2)轮做出决定。

为了确保慢的进程赶上更快的进程,一旦一个进程在r轮已经收到至少t+1个消息,这个进程将在小于r的轮次中等待timeouts。◇Synch确保了所有正确进程最终执行轮次的同步。

 

DBFT:从二元拜占庭共识到区块链共识

VBPC(有效的基于断言的拜占庭共识),其有效性的需求依赖于valid(),每个正确进程提出一个有效的value都需要满足一下属性-终止性、协定性和有效性(一个决定的value是有效的,它满足提前定义的断言表示valid()并且如果所有正确的进程提出相同的value v,那么它们决定了v)。

BIN_CONS[1..n],一系列binary Byzantine consensus objects。+

本地变量:

⊥,默认的value,不能被正确或拜占庭进程提出。

proposalsi[1..n]初始化为[⊥,..,⊥],proposalsi[j]的作用是包含pj提出的value。

bin_decisionsi[1..n]初始化为[⊥,..,⊥],bin_decisionsi[k]的作用是包含被BIN_CONS[k]决定的value(0或1)。

算法:

reducing from the binary Byzantine con-sensus to multivalue Byzantine consensus

mv_propose(v),v是一个进程proposes to multivalued consensus的value。pi执行四个阶段。

  1. pi传播它的value。pi首先通过RB-broadcast将它的value发给所有进程,如果一个进程RB-delivers了有效的value v(由pj broadcast),然后将它存储在它的proposalsi[j]并且直接BV-delivers 1到BIN_CONS[j],将1放到它的bin_valuesi。
  2. 进程pi用-1唤醒每一个由pk RB-broadcast被pi RB-divered的value。

-1是一个特殊的值,它使得二元共识跳过BV_broadcast并且立刻用1发送一个AUX信息,使得二元共识用value 1在仅仅一个消息延迟后终止(注意到第一轮timeout被设置为0,所以二元共识将以尽可能快的速度进行)。由于BV_broadcast和RB-broadcast重叠的属性使得直接将值1添加到bin_calues成为可能,允许我们跳过二元共识算法中消息步骤。换句话说 ,所有正确进程都将RV-deliver被提议的value并且将作为结果BV-deliver 1。这个循环将在pi发现一个二元共识事例BIN_CON[L]中1被决定而结束(由于在实例终止之前,所有正确进程的bin_value中都只有1,因此决定1的i的一个实例将在RB-delivery后的一个消息延中终止)。

  1. L5、6pi开始参与其它所有二元共识实例。在它知道一个二元共识实例决定

   后,pi用bin_propose(0)唤醒所有还没有参加的二元共识实例BIN_CONS[k],我们应该注意到BIN_CONS[k]中的一些实例是有可能没有一个进程从相关联的进程pk RB-delivered到value。这些共识参与的目的是确保所有二元共识实例都能最终终止。

  1. L7、10、12决定一个value。进程pi(根据进程索引顺序)认为是第一个在所有成功的二元共识对象中返回1。让BIN_CONS[j]成为这个二元共识对象。由于相关联已经决定value是1,那么至少有一个正确进程也提议1,这意味着它RB-delivered了一个来自于进程pj的value。注意到value最终被每个正确进程RB-delivered。所以,L9-10pi决定了它。只要拥有最小索引的二元共识实例终止是1,那么一旦相关联的value被RB-delivered,就可以返回reduction。这是因为相关联的较大索引的值将不会被使用。

复杂性。在好的情况下,允许共识算法在4个消息延迟后终止,3个消息延迟去执行可靠的broadcast和通过跳过BV_broadcast步骤来达到1个消息延迟去完成二元共识。在这种情况下可靠的消息传播和二元共识都是O(n2 )消息复杂度,当包含n个所有实例,总共是O(n3 )。在错误进程或者异步的情况下,算法将至少需要额外的3个消息延迟以使得二元共识实例以0终止。

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值