Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【共识算法(4)】拜占庭容错算法-“PBFT”

【共识算法(4)】拜占庭容错算法-“PBFT”

作者头像
帆说区块链
发布于 2022-04-26 11:42:28
发布于 2022-04-26 11:42:28
1.6K0
举报
文章被收录于专栏:帆说区块链帆说区块链

该算法是继raft算法之后的再一次深入实践的共识算法,与raft、paxo一样都可以看作是分布式一致性算法。

Practical Byzantine Fault Tolerance:PBFT,是联盟币的共识算法的基础。实现了在有限个节点的情况下的拜占庭问题,有3f+1的容错性,并同时保证一定的性能。

容错率

  • raft算法的的容错只支持容错故障节点,不支持容错作恶节点,所以容错率高,过半节点正常即可
  • PBFT算法可以容忍小于1/3个无效或者恶意节点 作恶节点:除了可以故意对集群的其它节点的请求无响应之外,还可以故意发送错误的数据,或者给不同的其它节点发送不同的数据,使整个集群的节点最终无法达成共识,这种节点就是作恶节点。

角色

Primary节点和普通节点,PBFT系统的Primary是轮流当选的,这和zab、raft不一样

  • 主节点 p = v mod |R|
  • p:主节点编号
  • v:视图编号
  • |R|节点个数

Primary角色分析

Primary节点的作用:

  1. 正常工作时,接收客户端的事务请求,验证request身份后,为该请求设置编号,广播pre-prepare消息
  2. 新Primary当选时,根据自己收集的View-Change消息,发送View-New信息,让其它节点同步数据
  3. Primary与所有的其它节点维系心跳

Primary节点地位和follower节点一样,并没有什么特权

  1. 如果Primary宕机,会因为心跳超时,而触发重新选举,保证系统运行稳定
  2. 如果Primary恶意发送错误编号的消息,那么会在后续的操作中,被follower察觉,因为 prepare和commit阶段都是会进行广播的,一旦不一致,view-change
  3. 如果Primary不发送接收到的request,client在超时未回复时,会重发request到所有的replica,小弟们发现primary竟然私藏消息,view-change
  4. 如果Primary节点篡改消息,因为有Request里面有data和client的签名,所以primary无法篡改消息,其它replica会先验证消息的合法性,否则丢弃,view-change 综上所述,限制了权限的Primary节点,如果宕机、或者不发生消息、或者发送错误编号的消息、或者篡改消息,都会被其它节点感知,并触发view-change。

PBFT工作正常的详细流程

客户端发起请求-->转发请求到primary-->primary生成proposal-->primary广播proposal-->所有节点复制proposal并广播-->复制过半节点完成-->广播commit节点-->commit过半节点完成-->应用状态机-->反馈客户端-->客户端统计f+1个反馈消息-->交易完成

  1. 系统根据机器编号顺序轮流选举出一个primary,primary初始化时发出View-new消息,同步所有节点的数据
  2. Client发起请求转发给primary,primary验证通过后,广播这个请求,发起pre-prepare消息给所有的follower节点,并且自己也保存这个request
  3. 所有的follower收到pre-prepare消息后,第一步是进行校验,包括数据的顺序是否正确,操作的先后有序性,以及交易是否有效比如签名。(防止客户端造假或者primary节点篡改造假)
  4. follower验证正确之后,写到自己的磁盘里,然后广播Prepare消息,并且自己也进入Prepare阶段
  5. 所有节点统计针对某个Request的Prepare消息,当统计结果超过2f节点时,表明大部分节点已经完成了持久化,则自己进入commit阶段
  6. 广播 commit 消息,并且统计收到的commit 消息的数量,当超过2f节点都发出commit的消息时
  7. 该节点完成commit阶段,写入数据(该操作已经完成2/3共识了),运用自己的状态机,更新 stable checkpoint,缓存该客户端最后一次的请求,并且反馈给客户端
  8. 当客户端统计反馈的节点超过f个时,表示交易已经被大部分节点确认了,交易成功。如果超时还不成功,则向所有的replica广播这个request

解释:

  1. 为什么客户端收到f+1个确认时,交易就成功了? 因为默认问题节点为f,那么f+1个确认节点中,肯定有1个是诚实的节点,只要有1个诚实的确认消息,则交易成功,因为1个诚实的消息必须是2f+1个节点都commit操作成功了,才可能有这个1个最终确认消息的。所以为了提升交易处理的速度,只要有f+1个确认反馈,就可以表示交易成功。

客户端Client发起请求

  1. 客户端 c 通过向副本多播一条<REQUEST,o,t,c>到系统中
  2. 副本对Request进行身份验证
  3. 验证成功,则接受请求并将其添加到它们的日志中,请求执行使用request中的时间戳进行排序执行
  4. 副本直接将请求的回复发送给客户端
  5. 客户端在接受结果 r 之前,等待一个来自不同副本的有 f + 1 个带有有效 MACs 的以及相 同的 t 和 r 的 weak certificate
  6. 如果客户端没有足够迅速的收到一个 reply certificate,则会重新发送请求。如果请求已被处理,则副本只是重新发送回复;副本记住他们发送给每个客户端的最后一个回复消息以 启用此重传

客户端请求消息:客户端直接向Primary节点发起一个请求 :消息的格式<REQUEST, o, t, c>

  • o: 请求的具体操作,operation
  • t: 请求时客户端追加的时间戳,time,这里面追加的是client的时间戳,会在后面的时候,客户端的请求做时间戳排序,结合请求编号一起,保证消息的有序性(不仅仅是写操作,还有读写操作)
  • c:客户端标识,clientID,其中 c + t 就是requestID
  • REQUEST: 包含消息内容m,以及消息摘要d(m)。客户端对请求进行签名。

服务端在执行request时会进行签名验证,因为PBFT应用的是联盟链,而不是私链,所以要对操作者的身份进行校验,比如A发起一笔转账,则服务端需要check是不是A发起的转账,防止盗刷

服务端回复消息:<REPLY, v, t, c, i, r>

  • REPLY,消息类型为回复客户端
  • v,当前view
  • t,c 哪个client的时间戳为t的回复(而不是通过zxid,是通过时间戳,相当于requestID)
  • i 当前node编号
  • r 操作结果,还必须有server i的签名,客户端要验证的,防止网络拦截和欺诈

消息

  • 消息的类型(pre-prepare、prepare、commit)
  • View(类似于term)
  • n(类似于index)
  • d(交易的详细信息)
  • m(交易的签名)
  • i(节点的编号)
  • checkpoint :节点参数,该节点最新的proposal编号
  • stable checkpoint:系统参数,该系统中,最新的超过2f节点commit过了的proposal的编号。可以减少内存的占用,已经2f+1确认过的操作,就最终确认了,后续不需要操作了,可以从内存中移除了。

重新选举 viewChange

当普通节点感知到primary异常的时候,触发viewchange,重新选举必须要有2f+1个节点都confirm(VIEW-CHANGE)了,发起重选才生效,一旦超过2f节点都发起VIEW-CHANGE消息,则选举结束,p =v+1 mod |R|节点当选为new Primary。并且new primary会根据自己统计的VIEW-CHANGE的内容,生成并广播NEW-VIEW消息,其它节点验证之后,开始新的view

<VIEW-CHANGE, v+1, n, C, P, i>消息

  • v+1 :新的view编号
  • n是最新的stable checkpoint的编号
  • C是2f+1验证过的CheckPoint消息集合
  • P是当前副本节点未完成的请求的PRE-PREPARE和PREPARE消息集合 新的主节点就是 newPrimary = v + 1 mod |R|。当newPrimary收到2f个有效的VIEW-CHANGE消息后,向其他节点广播NEW-VIEW消息

<NEW-VIEW, v+1, V, O>

  • 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消息,验证有效性(各个replica都统计view-change的个数),有效的话,进入v+1状态,并且开始O中的PRE-PREPARE消息处理流程。

特殊情况: 那么如果一半的节点和primary网络分区了,那也无法发起重选。 同时primary也执行不了新的操作,因为新的消息有一半节点收不到,整个集群陷入瘫痪状态。所以primary也应该和zab一样,具备自我检测超时,超过一定个数的ack缺失时,触发重新选举。

Raft Vs PBFT

  1. Raft系统中leader拥有最高权限,follower如果和leader数据不一致,那么必须删除自己的数据,保持和leader一致
  2. PBFT中,Primary向我发送命令时,当我认为老大的命令是有问题时,我会拒绝执行。并且很有可能会触发view-change。就算我认为老大的命令是对的,我还会问下团队的其它成员老大的命令是否是对的,只有大多数人 (2f+1) 都认为老大的命令是对的时候,我才会去执行命令

PBFT的特点

  1. 客户端事务请求的严格有序性 request里面包含了时间戳,request在服务端执行的时候,按照时间戳进行排序执行。而zab协议、raft协议都是按照先到先执行的有序性(服务端),但是PBFT却能按照Client的有序性。即使网络问题,先发起的请求晚于后发起的请求抵达服务端,服务端也不会打乱执行的顺序,PBFT是更严格的操作有序性。这也提高了系统的复杂度。
  2. 性能尚可 PBFT 算法通信复杂度 o(n^2),因为系统在尝试达成状态共识时,涉及到N个几点都需要广播N-1个其它节点。而在没有作恶节点的zab、raft系统中,通信复杂度 O(N)

raft与PBFT各有优缺点,raft容纳故障节点,PBFT容纳错误节点,要保持整个网络的稳定,或者说在一些鲁棒性要求高的场合,将两者算法结合会是一个非常不错的选择,整个网络可容纳故障节点和错误节点,且解决拜占庭将军问题。

在PBFT应用于电力领域可考虑将其用于虚拟电厂调度环节,将commit分成两阶段,建立半中心化的两阶段鲁棒优化调度模型,以此来保证该共识的半中心化特性。

两个源码链接:https://pan.baidu.com/s/1J8BX-GxBeIb862uXRXzAJg

提取码:217e

参考

美图架构师 讲PBFT 和Raft区别 https://zhuanlan.zhihu.com/p/35847127

原始论文的地址 http://pmg.csail.mit.edu/papers/osdi99.pdf

论文翻译中文版 https://blog.csdn.net/DeveloperRen/article/details/82771710

归纳

链接:https://www.jianshu.com/p/cf1010f39b84

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 帆说区块链 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
拜占庭容错机制
Client会发送一系列请求给各个replicas节点来执行相应的操作,BFT算法保证所有正常的replicas节点执行相同序列的操作。因为所有的replicas节点都是deterministic,而且初始状态都相同,根据状态机原理(state machine replication),这些replicas会产生相同的结果状态。当Client收到f+1个replicas节点返回的结果时,如果这些结果都一样,因为BFT算法确保了最多有f个replicas出现问题,所以至少有一个replicas是正确的,那么Client收到的这些结果都是正确的。
用户2909867
2018/08/22
9090
拜占庭容错机制
关于拜占庭问题及其分析
拜占庭问题是容错计算中的一个老问题,有莱斯特兰伯特等人在1982年提出。拜占廷帝国为5-15世纪的东罗马帝国,拜占庭城邦拥有巨大的财富,令他的十个邻邦垂涎已久,但是拜占庭高墙耸立,固若金汤,没有任何一个单独的邻邦能够成功入侵,任何单个城邦的入侵行动都会失败,而入侵者的军队也会被歼灭,使得其自身反而容易遭到其它九个城邦的入侵。这十个城邦之间也互相觊觎对方的财富并经常爆发战争。
用户2909867
2019/03/29
9810
关于拜占庭问题及其分析
分布式系统一致性和共识基础(二)
The Byzantine Generals Problem拜占庭将军问题是Lesilie Lamport等人 1982年发表的论文, 具体PDF链接, http://lamport.azurewebsites.net/pubs/byz.pdf
Zeal
2020/11/11
4510
分布式系统一致性和共识基础(二)
PDFT/Paxos/Raft-分布式一致性协议解析
分布式系统中有个著名的原则CAP原则,C为Consistency(一致性)、A为Availability(可用性)、P为Partition tolerance(分区容错性)。这里主要介绍下分布式环境下如果达到一致性。
王知无-import_bigdata
2020/02/20
6320
共识机制
区块链作为一个去中心化的分布式账本系统,然而在实际运行中,怎么解决因为去中心化后,保证整个系统能有效运行,各个节点诚实记账,在没有所谓的中心的情况下,互相不信任的个体之间就交易的合法性达成共识的共识机制。
用户2909867
2019/03/29
8720
从零开始设计一个共识算法——一场没有硝烟的战争
在本文中,我们尝试从零开始设计一个拜占庭容错的共识算法。但由于本文是在阅读大量文献之后,思考整理得出的,难免会有“事后诸葛亮”的嫌疑,但这不要紧,我们的目的也不是真的为了设计一个全新的共识算法,而是站在设计者的角度,思考一个共识算法是如何一步步得出的。当然,在推理过程中,我们也会使用尽可能少的已知条件,让“从零开始”不那么“哗众取宠”。相信本文会让你对共识算法有一个较为全面的理解,以后如果遇到新的共识算法,也可以使用本文的思路分析,快速拿下。
梦飞
2022/10/31
1.1K0
【共识算法】-“PBFT的实现”
插:若出现以下问题:go: go.mod file not found in current directory or any parent directory; see 'go help modules'
帆说区块链
2022/04/26
6210
【共识算法】-“PBFT的实现”
FISCO BCOS 网络中共识节点如何工作
假设在 FISCO BCOS 网络中,有五个共识节点(如 A、B、C、D、E)通过共识机制(如 PBFT 或 RAFT)协同工作,确保交易的一致性和最终性 以下是 FISCO BCOS 网络中五个共识节点(A、B、C、D、E)处理10笔交易的详细过程:
终有链响
2024/11/21
1240
深入理解PBFT算法——提交阶段的作用
PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错算法)是联盟链常用的一种共识算法。本文讨论PBFT提交阶段的作用,要求读者对PBFT的算法有一个大致了解,如果你是刚听过这个算法,知道算法的基本流程,看完本文可能会对PBFT有更深入的理解;如果你研读过PBFT原论文,那么本文也许可以作为阅读拓展。如果有不同理解或者认为文中表述有问题,欢迎讨论指正。
梦飞
2022/06/24
1.4K0
深入理解PBFT算法——提交阶段的作用
区块链基础知识(下):共识机制 附带图解、超详细教学!看不懂你打死我
共识算法是用于保证分布式系统一致性的机制。这里的一致性可以是交易顺序的一致性、账本一致性、节点状态的一致性等。一般地,我们根据容错类型将共识算法分为两类。
苏泽
2024/03/12
1.5K0
区块链基础知识(下):共识机制 附带图解、超详细教学!看不懂你打死我
Tendermint共识算法技术实现
tendermint共识算法是拜占庭容错算法,也是最多容忍不超过1/3的恶意节点。协议遵循一个简单的状态机,通过消息事件推动状态的改变。tendermint共识主要有一下几个阶段:NewHeight、NewRound、Propose、Prevote、Precommit、Commit。作为一个BFT类的共识算法。tendermint对应的三阶段分别是Proposal,Prevote,Precommit三个阶段:
fnatic
2022/07/14
6.4K0
拜占庭将军问题和 Raft 共识算法讲解
Tech 导读 在分布式系统中, 什么是拜占庭将军问题?产生的场景和解决方案是什么?什么是 Raft 共识算法?Raft 算法是如何解决拜占庭将军问题的?其核心原理和算法逻辑是什么?除了 Raft,还有哪些共识算法?共识问题作为分布式系统的一大难点和痛点,本文主要介绍了其产生的背景、原因,以及通用的 Raft 算法解决方案。
京东技术
2023/09/21
3450
拜占庭将军问题和 Raft 共识算法讲解
比原链BBFT如何让共识更快——兼论BBFT与FBFT/HotStuff的比较
近日比原链(BYTOM)技术团队发布了Bystack区块链BaaS平台,其中包括侧链的共识算法BBFT(Bystack Byzantine Fault Tolerance)。笔者将在这篇文章中阐述比原链BBFT尝试解决的问题以及分析BBFT与其他各家共识协议的主要差异。BBFT是一个PBFT的变形,它的原理与PBFT一脉相承。若想深刻理解BBFT的巧思,则必须进入PBFT的脉络推敲。早在区块链藉由比特币的大红大紫之前,PBFT就作为共识协议存在于世界上了。由Castro和Liskov于1999年发明,它是一个具有20年历史的经典设计,它的发明是为了解决分布式系统中的一个经典问题:拜占庭将军问题。直到今日,PBFT仍蕴含许多值得反复推敲的巧思,不断启发后世发明出更好的协定。
比原链Bytom
2019/07/11
8210
共识算法探讨:拜占庭容错算法
拜占庭容错(Byzantine Fault Tolerance,BFT)是一种在分布式计算系统中实现容错的重要机制,旨在确保系统在存在恶意或故障节点的情况下仍能正常运作。本文将详细介绍拜占庭容错算法的基本原理、实现方法及其在实际应用中的重要性。
运维开发王义杰
2024/06/11
1.2K0
共识算法探讨:拜占庭容错算法
区块链基础知识(下):共识机制 附带图解、超详细教学 看不懂你打死我
本篇专栏 ←持续记录本人自学两年走过无数弯路的智能合约学习笔记和经验总结 如果喜欢拜托三连支持~
苏泽
2024/05/24
8720
区块链基础知识(下):共识机制 附带图解、超详细教学 看不懂你打死我
区块链共识机制知多少
小智的假期结束了,又要开启吃鸡状态。现在就来考考你,区块链的共识机制,你能说出哪些呢?
前端修罗场
2022/07/29
6960
区块链共识机制知多少
【深度知识】25种区块链共识算法全面详解
本文尽可能列出所有主要的共识算法,评估各自的优劣之处。共识算法是区块链的核心技术,本文会跟随作者的理解,持续更新。如果读者发现有所遗漏,或是存在错误,希望能通过评论指出。
辉哥
2020/07/28
14.8K2
【深度知识】25种区块链共识算法全面详解
常见的分布式协议与算法
我这里将主要列举一致性Hash算法、Gossip协议、QuorumNWR算法、PBFT算法、PoW算法、ZAB协议,Paxos会分开单独讲,Raft算法已经写好了一篇文章,具体可以参考:从JRaft来看Raft协议实现细节。
luozhiyun
2020/07/06
1.1K0
分布式共识算法(Paxos、Raft)
多个参与者针对某一件事达成完全一致:一件事,一个结论。 已达成一致的结论,不可推翻。
leobhao
2022/06/28
3.8K0
分布式共识算法(Paxos、Raft)
聊聊区块链中的几个技术点
随着技术浪潮的涌动,国家政策的推动,区块链又慢慢的进入了我们的视野中。在 2020 年初这个时刻,不妨我们再回头看看区块链的发展,聊聊区块链中的几个技术点,为新的一年打打基础。
Seebug漏洞平台
2020/01/17
8340
聊聊区块链中的几个技术点
相关推荐
拜占庭容错机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档