网站首页 > 币百科 >

Pbft共识算法[应用于联盟链的pbft共识算法]

2023-05-29 08:17:37 币百科 阅读 0

Bitget下载

注册下载Bitget下载,邀请好友,即有机会赢取 3,000 USDT

APP下载   官网注册

pbft共识算法可能是相关行业人士需要注意的知识。这里详细介绍了pbft共识算法在联盟链中的应用,还有一些相关知识分享给大家,希望能给你带来帮助!

根本目的是为了效率;

通过比较pbft和bft的消息量,我们知道主节点的存在可以大大减少消息量,从而提高效率

实用的拜占庭容错算法

BFT是区块链共识算法中需要解决的核心问题。比特币的POW,eos的dpos,共识算法pos,这些公链算法解决了共识节点多的情况下的bft问题。

拜占庭一般问题。也称为拜占庭容错。

用于描述分布式系统的一致性问题。

背景如下:

拜占庭帝国想要进攻一个强大的敌人。十支部队被派去包围敌人。虽然这个敌人不比拜占庭帝国强多少,但足以抵挡五支常规拜占庭军队的同时进攻。10军同时进攻,处于分而围之状态。如果任何一支军队单独进攻,他们都没有胜算。除非至少6支军队(超过半数)同时进攻,才能攻占敌国。他们分散在敌国各地,依靠通信兵在马背上相互沟通,商议进攻意图和进攻时间。困扰这些将军的问题是,他们不确定其中是否有叛徒。叛徒可以擅自改变攻击意图或攻击时间。在这种状态下,拜占庭将军能保证六支以上的军队同时一起进攻,从而赢得战斗?

这个问题的复杂程度,光靠上面的描述可能理解不了。让';让我们做一个简单的分析:

让';让我们先看看它。如果一个A将军提出攻击建议(比如明天下午1点攻击),你愿意加入吗?)通信兵分别告诉其他将军,如果那个幸运儿运气好,他得到了其他六名以上将军的同意,发起了进攻。如果它';很不幸,其他将军也会在这个时候提出不同的攻击方案(比如明天下午2点和3点攻击,你愿意加入我们吗?),由于时差原因。不同的将军可能会收到(并认可)不同的进攻方案,这可能会导致方案A有三个支持者,方案B有四个支持者,方案C有两个支持者,以此类推。

增加一点复杂性,在汉奸的情况下。一个叛徒会给不同的将军发送不同的进攻方案(通知A明天下午1点进攻,通知B明天下午2点进攻,等等。),而且一个汉奸也可能同意多个进攻方案(即同意下午1点进攻,同意下午2点进攻)。

它叫"拜占庭错误"叛徒发送不一致的攻击建议,这种可以处理拜占庭错误的容错被称为"拜占庭容错",缩写为BFT。

密码算法用于保证节点间的消息传输不被篡改。通过下面的算法,我们可以保证A将军从B将军那里收到的消息真的是B将军本人的真实要求。

我们使用哈希函数(哈希算法)sha256-从数据(字节)值创建唯一的哈希值,并将其压缩到摘要中以固定数据格式。。数字签名和个人公钥证书由该摘要和个人私钥生成,接收者验证该签名和摘要。如果经过验证,证明摘要内容没有被篡改。

pbft容忍无效或恶意的节点号e,为了保证整个系统的正常运行,需要2f1个正常节点,系统的汇总点是3f1。也就是说,pbft算法容忍不到1/3的恶意或无效节点。。见节点恶的极端情况

pbft是一个状态机拷贝算法,所有拷贝都是在一个视图旋转过程中操作的,哪些是主节点(攻击提议者的将领)。依次)由视图中其他节点(其他将军)给出的编号和节点编号集决定,即主节点p=vmod|R|。v:视图数,|R|节点数,p:主节点数。。关于状态机复制算法和视图改变的意义(主要是防止主节点作恶),详见论文。

基于拜占庭一般问题PBFT算法的一致性主要可以分为三个阶段:预准备、准备和提交。流程如下图所示:

[Image-e3329d-1562488133052]

首先解释以上符号所表达的含义:

Let';下面就用上图来详细说说PBFT的步骤:

按照上面的流程,在N3F1的情况下可以解决一致性问题,其中N为计算机总数,f为出现问题的计算机总数。

以下所有验证过程都省略了对消息内容、签名和身份的验证。也就是说已经保证了节点间的消息传播不可篡改

在上面的算法中,更重要的一点是视图改变,为了恢复之前的请求。在收到消息或发送消息后,每个副本节点将在本地日志记录中记录该消息。当请求被执行时,副本节点需要清除先前请求的记录消息。最简单的方法是在回复消息之后执行当前状态的一致同步。但是为了节省资源,状态同步一般是在多个请求k之后进行一次,这个状态同步就是检查点消息。

为了节省内存,系统需要一种机制来删除日志中的无异议消息记录。为了确保系统的安全性副本节点在删除自己的消息日志之前,需要保证至少有f1个正常副本节点执行了消息对应的请求,并且能够在视图发生变化时向其他副本节点证明。此外,如果一些副本节点丢失了一些消息。然而,这些消息已经被所有正常的副本节点删除,这需要通过传输部分或全部服务状态来同步副本节点。因此,副本节点也需要证明状态的正确性。

在每个操作执行后生成这样的证明是非常耗费资源的。因此,只有当请求序列号能被一个常数整除时(如100),证明过程才会周期性地进行。。我们把这些请求执行后得到的状态称为检查点,有证明的检查点称为稳定检查点。

以上情况比较理想。实际上,副本节点I向其他节点发送检查点消息后,其他节点还没有完成k个请求的相互一致,所以不会响应I'的要求。其他节点将根据自己的处理步骤和顺序向前移动并达成共识。。但是,此时我发出的关卡并没有形成稳定。为了防止I太快,超过自己太多,会设置一个高水位H=hL,其中L是我们规定的允许高度差。,等于检查点周期处理数k的整数倍,可以设置为L=2K。当副本节点I处理的请求超过高水位H时,即使副本节点收到请求,也会被视为非法请求。等待稳定检查点发生变化。然后继续前进。

如果主节点作恶,可能会给不同的请求分配相同的序列号,或者不分配序列号,或者使相邻请求的序列号不连续。备份节点(备份主节点)应该有责任主动检查这些序列号的合法性。。如果主节点断开连接或作恶而不广播客户端';的请求,客户机设置一个超时机制,并在超时发生时向所有副本节点广播请求消息。副本节点检测到主节点或离线,并启动视图更改过程。

上面我们讲过。当网络中有F台计算机出现问题时,至少需要3F1台计算机来保证一致性问题。让';让我们在这里讨论一下原因。

我们可以认为,由于有F个节点发生故障或受到攻击。,所以只能从N-F个节点来判断。但由于异步传输,在收到N-F条消息后,并不确定后面是否有新的消息。(目前从N-F个节点收到的消息中有可能有来自被攻击节点的消息。并且由于异步传输而没有接收到好节点的消息。)

我们考虑最坏的情况,就是剩下的f个节点都是好的,收到的有f个被攻击的节点。所以我们需要使接收的好节点数(N-F)-F大于被攻击节点数F,所以有N-2FF,也就是N3F,所以N的最小整数是N=3F1。

pbft由需要参与认证的节点执行。所以一个完整的共识算法包括DPOSPBFT。其速度可以达到1500tps左右。

参考资料:

practicalByzantinefaulttolerance

MiguelCastroandBarbaraLiskovComputerScienceLaboratory,MassachusettsInstituteofTechnology,545ScienceandTechnologyPlaza,Cambridge,Massachusetts,02139castro,Liskov@lcs.mit.edu.

部分论文翻译

对数据序列达成共识是很多共识算法要解决的本质问题

Fabic的pbft算法实现

目前共识算法主要可以分为三类:公链、联盟链、私链

私链。所有节点信任

联盟链,存在等价的不信任节点

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

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

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

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

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

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

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

国外有一个动画把raft算法介绍的非常透彻,链接地址是:这个动画主要包含三个部分。第一部分介绍领导者选举和日志复制过程的简单版本。第二部分详细介绍了首领选举和日志复制的过程,第三部分介绍了如果遇到网络分区(裂脑),raft算法如何恢复网络一致性。

pbft算法主要是为了解决拜占庭一般问题而提出的。

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

拜占庭将军问题最早由莱斯利兰波特和另外两人在1982年发表的论文中提出,《TheByzantineGeneralsProblem》。他证明了当将军总数大于3f,叛徒数为F或更少时,忠诚的将军可以在命令上达成一致,即3F1=n.该算法的复杂度为O(n(f1))。MiguelCastro和BarbaraLiskov在1999年发表的论文《PracticalByzantineFaultTolerance》中首次提出了pbft算法。算法的容错数也满足3f1=n,算法复杂度为O(n2)。

首先,让';s考虑一个问题,为什么pbft算法中容错节点的最大个数是(n-1)/3?而raft算法中容错节点的最大数量是(n-1)/2?

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

raft算法只支持容错节点,假设集群中节点总数为n,故障节点为f。根据小数服从多数的原则,集群中的正常节点只需要比F个节点多一个节点,即f1个节点,正确节点的数量就会多于失败节点的数量,那么集群就可以达成共识。。因此,raft算法支持的容错节点数最大为(n-1)/2。

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

第一种情况,F个有问题的节点都是失效节点。,而且还是恶节点,那么根据小数服从多数的原则,集群中的正常节点只需要比F节点多一个节点,也就是f1节点,确定节点的数量就会多于故障节点的数量,那么集群就可以达成共识。。也就是说,这种情况下支持的最大容错节点数是(n-1)/2。

第二种情况,故障节点和邪恶节点是不同的节点。那么就会有F个问题节点和F个故障节点。当发现该节点是有问题的节点时,,就会被排除出集群,留下F个失败节点,那么根据小数服从多数的原则,集群中的正常节点只需要比F个节点多一个节点,也就是f1个节点,确认节点的数量就会多于失败节点的数量,那么集群就可以达成共识。因此所有类型节点的数量加起来有f1个正确节点、f个失败节点和f个问题节点,即3f1=n

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

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

客户端向主节点发送请求

主节点向其他节点广播请求,节点实现pbft算法的三阶段一致流程。

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

客户端收到来自f1节点的相同消息后,表示共识已经正确完成。

为什么从f1节点接收到相同的消息后,表示共识已经正确完成?从上一节的推导可以看出,在最好的情况下或者最坏的情况下,如果客户端从f1个节点接收到相同的消息,那么就意味着有足够多的正确节点已经全部达成共识并且已经被处理。

3。算法的核心三阶段流程

算法的核心三阶段是预准备阶段(pre-preparationstage)。、prepare阶段(准备阶段)、commit阶段(提交阶段)

与流程相比,对于领导者选举,raft算法的本质是谁赢谁最快。而pbft算法根据编号轮流做主节点。对于共识过程和重选领袖机制,为了更形象的描述这两种算法。下面将raft和pbft的共识过程与一个团队如何执行命令的过程进行对比,从这个角度理解raft算法和pbft的区别。

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

对于pbft算法,共识过程是,当老板给我发订单的时候,当我觉得老板';的订单有问题,我将拒绝执行。即使我认为老板';的顺序是正确的,我会问团队的其他成员,如果老板';的顺序是对的。只有当大多数人(2f1)认为老板';s的命令是正确的,我将执行它。老板什么时候改选?当然,如果老板死了,我们必须重新选举。如果大多数人认为老板不称职或者有问题,我们会重新选举老板。

四。结论

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

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

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

pbft算法是通过投票达成共识,可以解决包括分叉在内的问题,同时提高效率。但只适用于联盟链的私有链,因为两个节点之间的流量为O(n2)(流量可以通过优化降低)。一般来说,它不能应用于100个以上的节点。

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

一部分来源于:

区块链是为BFT设计的

这是pbft共识算法的介绍及其在联盟链中的应用的结尾。不知道你有没有从中找到你需要的信息?如果你想了解更多。

相关内容

Pbft共识算法[应用于联盟链的pbft共识算法]文档下载.: PDF DOC TXT

猜你喜欢