分布式与一致性协议之PBFT算法(一)

PBFT算法

概述

前面提到了拜占庭将军问题之后,有人可能会感到困惑:口信消息型拜占庭问题直接在实际项目中是如何落地的呢?事实上,它很难在实际项目中落地,因为口信消息型拜占庭问题之解是一个非常理论化的算法,没有与实际场景结合,也没有考虑如何在实际场景中落地和实现。

比如,它实现的是在拜占庭错误场景下,忠将们如何在判断干扰时就一致行动达成共识。但是它并不关心结果是什么,这会出现一种情况:现在适合进攻,但将军们达成的最终共识却是撤退。

很显然,这不是我们想要的结果。因为在实际场景中,我们需要就提议的一系列值(而不是单值),即使在拜占庭错误发生的时候,也能达成共识。那我们应该怎么做呢?答案就是采用PBFT算法。

PBFT算法非常实用,它是一种能在实际场景中落地的拜占庭容错算法,在区块链中应用广泛(比如Hyperledger Sawtooth、Zilliqa)。为了更好地理解PBFT算法,下面会先介绍口信消息型拜占庭问题之解的局限,再介绍PBFT算法的原理。

老规矩,我们先看一道思考题。
假设苏秦再一次带队抗秦,如苏秦和4个国家的4位将军赵、魏、楚、韩商量军机要事,如图所示在这里插入图片描述
,结果刚商量完没多久苏秦就接到了情报:联军中可能存在一个叛徒。这时,苏秦要如何下发作战指令来保证忠将们正确、一致地执行下发的作战指令,而不被叛徒干扰呢?

口信消息型拜占庭问题之解的局限

口信消息型拜占庭问题之解有个非常致命的缺陷。如果将军数为n、叛将数为f,那么算法需要递归协商f+1轮,消息复杂度为O(n^(f+1)),消息数量指数级暴增。你可以想象以下,如果叛将数为64,那么消息数会远远超过int64所能表示的数量,这是无法想象的,不可行的。

另外,尽管对于签名消息,不管叛将数(比如f)是多少,经过f+1轮的协商,忠将们都能达成一致的作战指令,但是这个算法同样存在"理论化"和"消息数指数级暴增"的痛点,说到这儿,你肯定明白为什么这个算法很难再实际场景中落地了。不过技术是不断发展的,算法也是在解决实际场景问题中不断改进的。那么PBFT算法的原理是什么呢?为什么它能在实际场景中落地呢?

PBFT算法是如何达成共识的

我们先来看看如何通过PBFT算法解决苏秦面临的共识问题。先假设苏秦制定的作战指令是进攻,而楚是叛徒(为了演示方便),如图所示在这里插入图片描述

需要注意的是,所有的消息都是签名消息,也就是说,消息发送者的身份和消息内容都是无法伪造和篡改的(比如,楚无法伪造一个假装来自赵的消息)。
首先,苏秦联系找,向赵发送包含作战指令"进攻"的请求,如图所示.在这里插入图片描述

当赵接收到苏秦的请求之后,会执行三阶段协议(Three-phase protocol)。
赵将进入预准备(Pre-prepare)阶段,构造包含作战指令的预准备消息,并广播给其他将军(魏、韩、楚),如图所示。在这里插入图片描述

在这里想问一个问题:魏、韩、楚收到消息后能之解执行指令吗?
答案是不能,因为他们不能确认自己接收到的指令与其他人接收到的指令是相同的。比如,赵可能是叛徒,赵收到了两个指令,分别是"进攻"和"准备30提案的粮草",然后他给魏发送的是"进攻",给韩、楚发送的是"准备30天粮草",这样就会出现无法一致行动的情况。那么具体怎么办呢?
接收到预准备消息之后,魏、韩、楚将进入准备(Prepare)阶段,并分别广播包含作战指令的准备消息给其他将军。比如,魏广播准备消息给赵、韩、楚,如图所示在这里插入图片描述
。为了方便演示,我们假设叛徒楚想通过不发送消息来干扰共识协商(如图所示,楚没有发送消息)。

然后,某个将军在收到2f个(包括自己,其中f为叛徒数,在该演示中是1)一致的包含作战指令的准备消息后,会进入提交阶段(Commit)阶段。在这里,提一个问题:此时该将军(比如魏)可以之解执行指令吗?
答案是不能,因为魏不能确认赵、韩、楚是否收到了2f个一致的包含作战指令的准备消息。也就是说,魏这时无法确认赵、韩、楚是否已经准备好执行作战指令,那么怎么办呢?

进入提交阶段后,各将军(不包括叛徒楚)分别广播提交信息给其他将军,也就是告诉其他将军,我已经准备好执行指令了,如图所示在这里插入图片描述

最后,当某个将军收到2f+1(包括自己,其中f为叛徒数,在该演示中为1)个验证通过的提交消息后,也就是大部分的将军已经达成共识,可以执行作战指令了,那么该将军将执行苏秦的作战指令,并在执行完毕后发送执行成功的消息给苏秦,如图所示。在这里插入图片描述

最后,当苏秦收到了f+1个(其中f为叛徒数,在该演示中为1)相同的响应(Reply)消息时,说明各位将军们已经就作战指令达成了共识,并执行了作战指令。
你看,将军们经过3轮协商,是不是就指定的作战指令达成了共识并执行了作战指令呢?
在这里,苏秦采用的就是简化版的PBFT算法,在这个算法中:

  • 1.可以将赵、魏、韩、楚理解为分布式系统的四个节点,其中赵是主节点(Primary),魏、韩、楚是备份节点(Backup);
  • 2.可以将苏秦理解魏业务,也就是客户端
  • 3.可以将消息理解为网络消息
  • 4.可以将作战指令"进攻"理解为客户端提议的值,也就是希望被个节点达成共识并提交给状态的值。
    PBFT算法通过签名(或消息认证码MAC)来约束恶意节点的行为的,也就是说,每个节点都可以通过验证消息签名来确认消息的发送来源,一个节点无法伪造另外一个节点的消息。同时,该算法是基于大多数原则(2f+1)实现共识的。而最终的共识是否达成,是由客户端进行判断的,如果客户端在指定事件内未收到请求对应f+1个相同响应,则认为集群故障,未达成共识,且客户端会重新发送请求。

需要注意的是,PBFT算法通过视图变更(View Change)的方式来处理主节点作恶行为,当发现主节点在作恶时,该算法会以"轮流上岗"的方式推荐新的主节点。另外,尽管PBFT算法相比口信消息型拜占庭之解已经有了很大的优化,如将消息复杂度从O(n(f+1))降低为O(n2),能在实际场景中落地,以及能解决实际的共识问题等,但PBFT还是有一定的局限,如需要发送比较多的消息,以13节点的集群(f为4)为例,PBFT算法需要涉及如下消息.

  • 1.请求消息:1
  • 2.预准备消息:3f=12
  • 3.准备消息:3f*(3f-f)=96
  • 4.提交消息:(3f-f+1)*(3f+1)=117
  • 5.恢复消息:3f-1=11
    也就是说,一次共识协商需要237个消息,消息数还是蛮多的,所以推荐在中小型分布式系统中使用PBFT算法。

注意

PBFT算法与Raft算法类似,也存在一个"领导者(就是主节点)“,同样,集群的性能也受限于"领导者”。另外,O(n^2)的消息复杂度,以及随者消息数的增加,网络时延对系统运行的影响也会越大,这些都限制了运行PBFT算法的分布式系统的规模,也决定了PBFT算法只适用于中小型分布式系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链数据集(一)Xblock

一、Transaction Datasets Ethereum On-chain Data [Dataset] 2021-10TransactionData/Code AvailableEthereum Introduction: This is the dataset of paper “XBlock-ETH: Extracting and Exploring Blockchain Data From Ethereum”. Data / Code Paper CiteDownloads: …

【Python大数据】PySpark

CSDN不支持多个资源绑定,另外两个数据文件下载: 订单数据-json.zip search-log.zip Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服…

5万字带你一文看懂自动驾驶之高精度地图前世今生

在讲解高精度地图之前,我们先把定位这个事情弄清楚,想明白,后面的事情就会清晰很多,自古哲学里面讨论的人生终极问题,无非就三个,我是谁,我从哪里来,我要去哪里,这里的位…

构建智慧设施管理平台:数字化引领未来建筑行业发展

随着城市化进程的不断推进和建筑行业的持续发展,智慧设施管理平台的重要性日益凸显。在这一背景下,构建智慧设施管理平台成为推动建筑行业数字化转型的关键举措。本文将深入探讨智慧设施管理平台的构建与优势,助力建筑企业把握数字化转型的主…

【从零开始学架构 架构基础】二 架构设计的复杂度来源:高性能复杂度来源

架构设计的复杂度来源其实就是架构设计要解决的问题,主要有如下几个:高性能、高可用、可扩展、低成本、安全、规模。复杂度的关键,就是新旧技术之间不是完全的替代关系,有交叉,有各自的特点,所以才需要具体…

openEuler 22.03安装单机版oracle 19c(附录所有patch包)

客户要在OpenEuler 22.0.3 LTS上安装的19.3.0.0 ,在安装到11%的时候报错all_no_orcl错误,我们知道欧拉底层是rhel9,这些错误其实经常接触都知道肯定是各种软件包的版本不对导致的,但是各种依赖太多了也不好解决,最后在官网有所发现: Requirements for Installing Oracle Datab…

【文末附gpt升级方案】探讨当前时机是否适合进入AIGC行业(一)

随着科技的飞速发展,人工智能生成内容(AIGC)作为新兴的技术领域,正逐步走进公众的视野,并在多个行业展现出巨大的应用潜力。然而,对于创业者、投资者以及希望进入这一领域的专业人士来说,当前时…

2024新零售行业多元化用工报告

来源:君润人力 近期历史回顾:

小米15曝光?可能会要稍微涨价

也许是感受到了智能机市场的逐渐复苏,最近各大手机品牌发售新品的速度明显加快了。从4月份的Redmi、一加,再到5月份一大堆vivo、OPPO新机型的发布。而近日,有关小米14即将发售的消息也是悄咪咪的放了出来。 去年发售的小米14可以说是狠狠地让…

202012青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 在Python正则表达式中,用来匹配任意空白字符的是( )。 A 😒 B :S C :d D 😄 正确答案:A 试题解析: 第 2 题 【单选题】 在Python正则表达式中,用来匹配任意非数字字符的是&…

双向RNN和双向LSTM

双向RNN和双向LSTM 一、双向循环神经网络BiRNN 1、为什么要用BiRNN 双向RNN,即可以从过去的时间点获取记忆,又可以从未来的时间点获取信息,也就是说具有以下两个特点: 捕捉前后文信息:传统的单向 RNN 只能利用先前的上下文信息…

vue3+ts(<script setup lang=“ts“>)刷新页面后保持下拉框选中效果

效果图&#xff1a; 代码&#xff1a; <template><div class"app-layout"><div class"app-box"><div class"header"><div class"header-left"></div><div class"title">室外智…

scratch列表排序 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch列表排序 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

Python函数之旅专栏(导航)

Python内置函数(参考版本:3.11.8)AELRabs( )enumerate( )len( )range( )aiter( )eval( )list( )repr( )all( )exec( )locals( )reversed( )anext( )round( )any( ) ascii( )FM  filter( )map( )S float( )max( )set( )Bformat( )memoryview( )setattr( )bin( )frozenset( )…

ArcGI基本技巧-科研常用OLS, GWR, GTWR模型实现

ArcGI基本技巧-科研常用OLS, GWR, GTWR模型实现 OLS,GWR,GTWR回归模型均可以揭示解释变量对被解释变量的影响且可以进行预测。Ordinary Least Squares (OLS)是最小二乘法&#xff0c;Geographically Weighted Regression (GWR)是地理加权回归&#xff0c;Geographically and T…

Unity射击游戏开发教程:(18)添加弹药计数+补充弹药

添加简单的弹药计数 我将讨论如何向游戏中添加简单的弹药计数。这将包括在 HUD 中添加弹药计数器,当弹药达到 0 时,文本会将颜色更改为红色以提醒玩家。另外,当弹药数为0时,玩家将无法再射击。让我们深入了解吧! 在播放器脚本中我们需要添加一些变量。我们将创建两个公共整…

详细分析Python中的win32com(附Demo)

目录 前言1. 基本知识2. Excel3. Word 前言 对于自动化RPA比较火热&#xff0c;相应的库也比较多&#xff0c;此文分析win32com这个库&#xff0c;用于操作office 1. 基本知识 Win32com 是一个 Python 模块&#xff0c;是 pywin32 扩展的一部分&#xff0c;允许 Python 代码…

C语言如何删除表中指定位置的结点?

一、问题 如何删除链表中指定位置的结点&#xff1f; 二、解答 删除链表中指定的结点&#xff0c;就像是排好队的⼩朋友⼿牵着⼿&#xff0c;将其中⼀个⼩朋友从队伍中分出来&#xff0c;只需将这个⼩朋友的双⼿从两边松开。 删除结点有两种情况&#xff1a; &#xff08;1&am…

HTML静态网页成品作业(HTML+CSS)——我的家乡江永网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

Pencils Protocol Season 2 收官在即,Season 3 携系列重磅权益来袭

此前Scroll生态LaunchPad &聚合收益平台Pencils Protocol&#xff08;原Penpad&#xff09;&#xff0c;推出了首个资产即其生态代币PDD的Launch&#xff0c;Season 2活动主要是用户通过质押ETH代币、组件战队等方式&#xff0c;来获得Point奖励&#xff0c;并以该Point为依…