对PBFT算法的一点理解

导师让看一下SBFT,刚看了一点发现需要先理解PBFT,于是先去看了PBFT,太菜了看了好久才大概弄明白什么情况,这里简单记录一下自己的理解。

背景

背景部分就不细说了,该算法的提出主要是为了解决拜占庭问题(Byzantine Fault Tolerance),P代表Practical,实用的意思,该算法将原先的复杂度为指数的一个算法进行了取舍与优化,达到 O ( N 2 ) O(N^2) O(N2)的复杂度,可以在实际中工程中使用。

前言

以往的BFT算法大部分都基于同步系统(synchronous system),也就是系统可以在已知的有限时间内完成计算网络传输的任务,异步系统(Asynchronous System)是指计算和网络传输的时间可能无限长。而现实中的系统一般是半同步系统,也就是计算和网络传输可以在有限时间内完成,但这个时间是无法预知的。

如果系统中存在 F F F个恶意节点,那么PBFT算法总共需要 N = 3 F + 1 N=3F+1 N=3F+1个节点来保证系统的livenesssafety,也就是说若系统有 N N N个节点,则该系统可以容忍 ⌊ N − 1 3 ⌋ \lfloor{\frac{N-1}{3}}\rfloor 3N1个恶意节点。

节点可以分为三类。一直正常工作的节点,二是出现错误的节点(比如延迟、宕机),三是恶意节点(故意做坏事)。

safety:是指满足linearizability,也就是像中心化系统一样,一次只进行一个原子操作。(大概就是说所有节点保持一致?)
liveness:是指client发出的request都会得到reply。

为什么容忍 F F F个节点错误需要 3 F + 1 3F+1 3F+1个节点
因为 F F F个恶意节点可能故意不回复,因此当收到 N − F N-F NF个回应时要做出决定,但是我们知道所有的节点都可能会出现延迟或者宕机的情况,还没回复的 F F F个节点也可能存在正常的节点(甚至全都是正常的节点),回复的 N − F N-F NF个节点中可能也存在恶意节点(甚至 F F F个恶意节点都进行了错误的回复),为了达成共识,我们需要保证已经回复的节点中正常节点的数量大于恶意节点的数量,也就是 N − F − F > F N-F-F>F NFF>F(第一个 F F F是指减去没有回复的节点,第二个 F F F是指减去可能存在的恶意节点,右边的 F F F指恶意节点),也就是 N > 3 F N>3F N>3F,即 N ≥ 3 F + 1 N\ge3F+1 N3F+1.

算法

总览

PBFT算法是状态机复制(state machine replication)的一种形式,将服务建模成状态机在分布式系统的不同节点间复制。这里需要理解一个视图(View)的概念:client将request发给一个主节点(primary),然后主节点将request多播到其他节点(backups),当主节点出错或成为恶意节点时,就需要进行视图更换(view change),也就是选择(轮换法)下一个backup作为主节点,共识过程进入下一个view

总体算法流程如下:

  • client向primary发起request
  • primary将request多播到backups
  • 节点发送reply给client
  • client等待 F + 1 F+1 F+1个结果相同的reply作为最终结果

该算法成立的两个前提条件:

  • 节点的行为必须是确定的,也就是在相同的状态下输入相同的参数,必须返回相同的结果
  • 每个节点都必须从同一个状态开始

三个阶段

共识机制主要分三个阶段:pre-prepare, prepare,commit. 如下图,C是client,0号节点是primary,其他节点是backups,3号节点是拜占庭节点。
在这里插入图片描述

  1. request阶段:client发送 ⟨ R E Q U E S T , o , t , c ⟩ σ i \left\langle REQUEST,o,t,c \right\rangle_{\sigma_i} REQUEST,o,t,cσiprimary,其中t是时间戳,o表示操作,c是这个client
  2. pre-prepare阶段:primary赋予收到的request一个编号 n n n,然后将消息 ⟨ ⟨ P R E − P R E P A R E , v , n , d ⟩ σ p , m ⟩ \left\langle \left\langle PRE-PREPARE, v, n, d \right\rangle_{\sigma_p} , m\right\rangle PREPREPARE,v,n,dσp
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值