共识算法系列之一:私有链raft算法和联盟链pbft算法。

对数据序列达成一致是很多* * *知识算法要解决的本质问题。

Fabic中pbft算法的实现

目前,* * *识别算法可以分为三类:公链、联盟链、私链。

私有链,所有节点都是可信的

联盟链,存在点对点的不可信节点。

私有链:私有链的* * *识别算法是区块链概念普及之前传统分布式系统中的* *识别算法,比如zookeeper的zab协议,是类paxos算法之一。私有链的适用环境一般不考虑集群中邪恶节点的存在,只考虑系统或网络原因导致的故障节点。

联盟链:在联盟链中,经典的代表项目是Hyperledger组织下的Fabric项目,Fabric0.6版本使用pbft算法。联盟链的适用环境不仅需要考虑集群中故障节点的存在,还需要考虑集群中邪恶节点的存在。对于联盟链,每个新增加的节点都需要进行验证和审计。

公链:公链不仅要考虑网络中的故障节点,还要考虑恶节点,类似于联盟链。与联盟链最大的区别在于,公链中的节点可以自由加入或退出,无需严格的验证和审核。

公链中最常用的是Pow算法和pos算法。这些算法与参与者的利益直接相关,通过利益约束节点的诚实工作,解决分布式系统中的拜占庭问题。拜占庭容错算法是一种状态机复制算法。通过节点间的多轮消息传递,网络中所有的诚实节点都能达成一致的理解。

拜占庭容错算法不需要发行加密货币,但只能在私有链或联盟链中使用,需要控制节点的访问。不能用在公链上,因为公链上的所有节点都可以随意加入和退出,无法抵御魔女攻击。

Raft算法包括三个角色:跟随者、候选者和领导者。集群中的一个节点在某一时刻只能是这三种状态中的一种,并且这三种角色可以随着时间和条件的变化而转换。

Raft算法主要有两个过程:一是领袖选举,二是日志复制,其中日志复制过程会分为记录日志和提交数据两个阶段。raft算法支持的最大容错节点数为(N-1)/2,其中N为集群中的节点总数。

国外有个动画把raft算法介绍的很透彻,链接地址是:/raft/。这部动画主要包括三个部分。第一部分介绍了简单版的首领选举和日志复制的流程,第二部分介绍了详细版的首领选举和日志复制的流程,第三部分介绍了raft算法在遇到网络分区(脑裂)的情况下如何恢复网络一致性。

pbft算法主要用于解决拜占庭问题。

要解决这个问题,有一个很重要的前提,就是信道必须可靠。如果信道不能保证可靠,那么拜占庭问题就无解。关于通道的可靠性,会引出两军的问题。两军之间问题的结论是,试图在一条不可靠的通信链路上通过通信达成协议,基本上是不可能的,或者是非常困难的。

拜占庭将军问题最早是莱斯利·兰波特和另外两人在1982年发表的论文《拜占庭将军问题》中提出的。他证明了当将军总数大于3f,汉奸数为F或更少时,忠诚的将军可以在命令上达成一致,即3F+1

首先,我们来思考一个问题。为什么pbft算法的最大容错节点数是(n-1)/3,而raft算法的最大容错节点数是(n-1)/2?

对于raft算法,raft算法的容错只支持容错节点,不支持容错恶节点。什么是故障节点?是指由于系统繁忙、停机或网络问题等其他异常情况导致节点无响应,出现这种情况的节点就是故障节点。那邪恶的节点是什么?邪恶节点除了故意不响应集群中其他节点的请求,还可以故意发送错误的数据,或者向不同的其他节点发送不同的数据,使整个集群中的节点最终无法到达* * *识。这种节点是恶节点。

Raft算法只支持容错节点。假设集群中节点总数为n,失效节点数为F,根据小数服从多数的原理,集群中正常节点只需要比F节点多一个节点,即f+1个节点,正确节点数就会比失效节点数多,那么集群就可以做到* * *识。因此,raft算法支持的容错节点数最大为(n-1)/2。

对于pbft算法,因为pbft算法既需要支持容错的故障节点,也需要支持容错的邪恶节点。假设集群中的节点数为n,有问题的节点为f,有问题的节点中,既可以是故障节点,也可以是恶节点,或者只是故障节点,也可以只是恶节点。那么会出现以下两种极端情况:

第一种情况,F个有问题的节点既是故障节点,又是恶节点,那么根据小数服从多数的原则,集群中的正常节点只需要比F个节点多一个节点,即f+1个节点,确认的节点数就会比故障节点数多,这样集群就可以做到* * *识。也就是说,这种情况下支持的最大容错节点数是(n-1)/2。

在第二种情况下,故障节点和邪恶节点是不同的节点。那么就会有F个问题节点和F个故障节点。当节点被发现是问题节点时,它们将被从集群中排除,留下F个故障节点。然后根据小数服从多数的原则,集群中的正常节点只需要比F节点多一个节点,即f+1个节点,确认的节点数就会比故障节点数多,这样集群就可以做到* *知。因此,所有类型节点的数量加起来是f+1个正确节点、f个失败节点和f个问题节点,即3f+1 = n。

结合以上两种情况,pbft算法支持的最大容错节点数为(n-1)/3。

pbft算法的基本流程主要包括以下四个步骤:

客户端向主节点发送请求。

主节点向其他节点广播请求,节点执行pbft算法的三阶段识别过程。

在处理完三阶段流程后,节点将消息返回给客户端。

客户端收到来自f+1节点的相同消息后,表示* * *识别已经正确完成。

为什么从f+1节点收到同样的消息,说明* * *知识已经正确完成?从上一节的推导可以看出,在最好的情况下或者最坏的情况下,如果客户端收到来自f+1个节点的相同消息,说明足够多的正确节点已经全部到达* * *识,并且已经被处理。

3.算法的核心三阶段过程

算法的核心三个阶段是预准备阶段、准备阶段和提交阶段。

对比流程,对于领袖选举,raft算法的本质是谁选得快,而pbft算法是根据人数轮流做主节点。对于* * *知识过程和重选领袖机制,为了更形象地描述这两种算法,我们将raft和pbft的* * *知识过程比作一个团队如何执行命令的过程,从这个角度来理解raft和pbft的区别。

一个团队必须有一个老板和普通成员。对于raft算法,* * *知识的过程是:只要老板还活着,我们(团队的普通成员)就会按照老板说的去做,坚决执行。那你什么时候再当老板?只有老板死了,才重新选老板,否则当老板的人会死老板的鬼。

对于pbft算法,* * *知识的过程是:当老板给我发命令的时候,当我认为老板的命令有问题的时候,我会拒绝执行。即使我觉得老板的命令是对的,我也会问团队其他成员老板的命令是不是对的。只有大部分人(2f+1)认为老板的命令是对的,我才会执行命令。老板什么时候改选?当然,如果老板死了,我们必须重新选举。如果大多数人认为老板不称职或者有问题,我们会重新选举老板。

四。结论

Raft算法和pbft算法是私有链和联盟链中的经典算法。本文主要介绍raft算法和pbft算法的流程和区别。Raft和pbft算法有两个基本区别:

Raft算法从节点不会拒绝主节点的请求,而pbft算法从节点在某些情况下会拒绝主节点的请求;

Raft算法只能容忍故障节点,最大容错节点数为(n-1)/2,而pbft算法可以容忍故障节点和邪恶节点,最大容错节点数为(n-1)/3。

Pbft算法是通过投票实现* * *知识,可以解决包括分叉在内的问题,同时提高效率。但它只适用于联盟链的私有链,因为两个节点之间的流量为O(n ^ 2)(可以通过优化降低),一般不适用于100以上的节点。

pbft解决方案的前提是信道必须可靠,但存在的问题是扩展性差。

部分来自:/kojhliang/article/details/80270223。

区块链是为BFT设计的。