AlexiaChen / AlexiaChen.github.io

My Blog https://github.com/AlexiaChen/AlexiaChen.github.io/issues
87 stars 11 forks source link

拜占庭网络下的共识 #135

Closed AlexiaChen closed 1 year ago

AlexiaChen commented 3 years ago

前言

分布式共识算法大概分为非拜占庭容错和拜占庭容错(BFT)这两类。非拜占庭共识有些时候又称为Crash Fault Tolerance(CFT),也就是崩溃错误容忍,就是我们平时更经常听过的Paxos, Raft了,这类分布式网络下只考虑节点不响应,宕机崩溃的情况,分布式网络怎样继续工作达成共识的问题。而拜占庭容错就是要考虑拜占庭节点了,这种节点就会作恶,不仅仅可能不回复消息,可能还会回复假消息,在这样有非法节点的分布式网络下,这是BFT家族算法考虑的共识问题,BTF共识网络开销太大,后来1999年才出现了PBFT,开销降低到了O(n^2), 这样好多了。除了BFT家族,还有一种是非BFT的,比如PoW, PoS,DPoS这类适用于大网络环境下,但是据说DPoS早期是没有被数学证明过是拜占庭容错的,BFT类是有大量的研究和学术脉络了,早被证明正确了,比如HotStuff,还有近期的小飞象算法。

这里需要重点讲述的就是PBFT算法的大致思想,以及其他的一些用到的工程实现是怎样做的,比如Tendermint这类工具框架。

正文

PBFT算法

PBFT的算法需要对错误节点的数量进行一个预估建模,就是要估计作恶节点的最大数量,设作恶节点的数量是f,那么节点的总数就应该是n,其中n >= 3*f + 1。也就是要比3倍的作恶节点还多,换句话说,正常节点数量是Q= n - f = 2*f + 1, 正常节点是作恶节点的2倍还多,这样才可以保证容错,符合服从大多数的民主机制。

PBFT主要是基于状态机的三阶段提交,其中有主节点和从节点,从节点也就是接收方状态机副本了:

最后client收到f + 1个reply消息后,就确认了。接下来client发送下一个消息,通过主节点扩散到全网,重复以上步骤。

优缺点也明显,通信开销虽然降低到了O(n^2),但是通信开销还是大,不适用大规模的类似BTC的动态网络,节点到达100个,性能下降很快,只适用于私有链或者联盟链,所以Fabric等用PBFT算法。因为随着n的变大,f的值也要随之调整,PBFT这些参数是个固定的,动态增加删除很复杂。优点也是有的,这样达成的共识不容易分叉。

Tendermint中的PBFT变种算法

Tendermint作为一个共识引擎,它里面实现的就是一个PBFT类的变种,下面来讲解下它的思想,该共识也是三阶段提交, 5种状态的状态机协议,其中2种节点角色:Proposer, Validator: