分布式与一致性协议之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算法只适用于中小型分布式系统。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++类的概念以及用法

目录 面向过程和面向对象初步认识类的引入类的定义类的两种定义方式声明和定义全部放在类体中 声名定义分离 类的作用域成员变量命名规则建议访问限定符 类的封装类的实例化类对象模型类的对象大小的计算扩展 结构体内存对齐规则 感谢各位大佬对我的支持,如果我的文章对你有用,…

《Fundamentals of Power Electronics》——转换器的传递函数

转换器的工程设计过程主要由以下几个主要步骤组成: 1. 定义了规范和其他设计目标。 2. 提出了一种电路。这是一个创造性的过程,利用了工程师的物理洞察力和经验。 3. 对电路进行了建模。组件和系统的其他部分适当建模,通常使用供应商提供的…

祝天下母亲节快乐!虚无!——早读(逆天打工人爬取热门微信文章解读)

练功加精力哦 引言Python 代码第一篇 人民日报【夜读】人与人之间最好的关系:遇事靠谱,懂得感恩第二篇 冯站长之家 三分钟新闻早餐结尾 感恩与善行 是人生旅途中的灯塔 怀感恩之心 行小善之事 它们将指引我们走向光明 引言 今天是母亲节 祝天下的所有母…

三星硬盘格式化后怎么恢复数据

在数字化时代,硬盘作为数据存储的核心部件,承载着我们的重要文件、照片、视频等资料。然而,不慎的格式化操作可能使我们失去宝贵的数据。面对这样的困境,许多用户可能会感到无助和焦虑。本文旨在为三星硬盘用户提供格式化后的数据…

【CMU 15-445】Proj4 Concurrency Control

Concurrency Control 通关记录Task1 TimestampsTask2 Storage Format and Sequential ScanTask3 MVCC ExecutorsTask3.1 Insert ExecutorTask3.2 CommitTask3.3 Update and Delete ExecutorTask3.4 Stop-the-world Garbage Collection Task4 Primary Key IndexTask4.0 Index Sc…

vue3 element plus el-date-picker组件在日期上做标识

1.先看效果图,带红点的就是我要做标识的日期 2.直接把代码拿出来就可以用 (1)html部分 <el-date-pickerv-model"startTime"type"datetime"placeholder"选择开始日期"format"YYYY-MM-DD HH:mm"value-format"YYYY-MM-DD HH:mm…

基于ChatGLM+Langchain离线搭建本地知识库(免费)

目录 简介 服务部署 实现本地知识库 测试 番外 简介 ChatGLM-6B是清华大学发布的一个开源的中英双语对话机器人。基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT…

大模型微调之 在亚马逊AWS上实战LlaMA案例(八)

大模型微调之 在亚马逊AWS上实战LlaMA案例&#xff08;八&#xff09; 微调技术 Llama 等语言模型的大小超过 10 GB 甚至 100 GB。微调如此大的模型需要具有非常高的 CUDA 内存的实例。此外&#xff0c;由于模型的大小&#xff0c;训练这些模型可能会非常慢。因此&#xff0c…

计算机网络(网络原理与应用)之高级交换实验------冗余环路与生成树协议

一、实验目的 (1)了解生成树协议的作用&#xff1b; (2)熟悉生成树协议的配置。 二、应用环境 采用生成树协议可以避免环路。 生成树协议的根本目的是将一个存在物理环路的交换网络变成一个没有环路的逻辑树形网络。IEEE802.ID协议通过在交换机上运行一套复杂的算法STA(sp…

Springboot+Vue项目-基于Java+MySQL的影院订票系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

英语复习之英语形近词总结(三)

英语形近词总结复习第三部分: 单词释义例句 adorn 英 /əˈdɔːn/ 美 /əˈdɔːrn/ vt.装饰&#xff1b;使生色&#xff1a;n.(Adorn)人名&#xff1b;&#xff08;泰&#xff09;阿隆 1.They wash and wax the cars, go on and on about them—some even adorn them with …

【GESP】2024年03月图形化二级 -- 找因数

找因数 【题目描述】 默认小猫角色和白色背景。 小杨最近刚刚学习了因数的概念&#xff0c;具体来说&#xff0c;如果一个正整数 a a a 可以被另一个正整数 b b b 整除&#xff0c;那么我们就说 b b b 是 a a a 的因数&#xff0c;例如6可以被1、2、3、6整除&#xff0c;…

[BJDCTF2020]ZJCTF,不过如此 1

涉及&#xff1a;php的伪协议、preg_replace函数的漏洞和正则表达式的运用。 解题步骤 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream"))…

JeeSite 平台 Spring Boot 3 体验版发布,一个 Java 快速开发平台

引言 是时候为 Spring Boot 3 做准备了&#xff0c;2018年2月 Spring Boot 进入 2.0 时代&#xff0c;距今已经 5 年了。2022 年 11 月 Spring Boot 3.0 正式发布&#xff0c;它将基于 Spring Framework 6.0&#xff0c;并且需要 Java 17 版本&#xff0c;同时它也将是 Jakart…

AI仿站源码教程

AI仿站源码教程 随着AI技术的不断发展&#xff0c;仿站技术已经越来越成熟&#xff0c;通过AI一键仿站&#xff0c;开发者们可以更快速、更高效地搭建网站。传统的前端开发过程中&#xff0c;需要大量的手工编码和设计&#xff0c;而AI仿站技术可以通过截图或视频&#xff0c;…

LoRaWAN入门

1.文档资料 飞书云文档 (feishu.cn) G43室内LoRaWAN网关 - doc.alinkwise.com > LoRaWAN网关&#xff08;基站&#xff09; > G4x > G43室内LoRaWAN网关 2.简介 LoRa: 远距离无线电&#xff08;long rang radio), 它最大特点就是在同样的功耗条件下比其他无线方式…

C#实现多线程的几种方式

前言 多线程是C#中一个重要的概念&#xff0c;多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景&#xff0c;可以充分利用多核处理器和系统资源&#xff0c;提高应用程序的性能和效率。 多线程常用场景 CPU 密集型任务…

[机器学习-05] Scikit-Learn机器学习工具包进阶指南:协方差估计和交叉分解功能实战【2024最新】

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

【教学类-55-03】20240512图层顺序挑战(三角形版)(6块三角形,420种叠放顺序)

作品展示 背景需求 分享Lab&#xff5c;更新啦&#xff5e;图层顺序挑战游戏 - 小红书 (xiaohongshu.com)https://www.xiaohongshu.com/discovery/item/62f21760000000000900ec6d?app_platformandroid&ignoreEngagetrue&app_version8.35.0&share_from_user_hidde…

类和对象中篇

类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情况下&#xff0c;都会自动生成下面6个默认成员函数 ①初始化和清理&#xff1a;构造函数和析构函数 ②拷贝复制&#x…