FISCO BCOS的PBFT共识算法流程详解

news2024/9/29 11:23:52

原文: https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/docs/design/consensus/pbft.html

PBFT模块主要包括PrepareReqSignReqCommitReqViewChangeReq四种共识消息:

  • PrepareReqPacket: 包含区块的请求包,由leader产生并向所有Replica节点广播,Replica节点收到Prepare包后,验证PrepareReq签名、执行区块并缓存区块执行结果,达到防止拜占庭节点作恶、保证区块执行结果的最终确定性的目的;

  • SignReqPacket: 带有区块执行结果的签名请求,由收到Prepare包并执行完区块的共识节点产生,SignReq请求带有执行后区块的hash以及该hash的签名,分别记为SignReq.block_hash和SignReq.sig,节点将SignReq广播到所有其他共识节点后,其他节点对SignReq(即区块执行结果)进行共识;

  • CommitReqPacket: 用于确认区块执行结果的提交请求,由收集满(2f+1)个block_hash相同且来自不同节点SignReq请求的节点产生,CommitReq被广播给所有其他共识节点,其他节点收集满(2f+1)个block_hash相同、来自不同节点的CommitReq后,将本地节点缓存的最新区块上链;

  • ViewChangeReqPacket: 视图切换请求,当leader无法提供正常服务(如网络连接不正常、服务器宕机等)时, 其他共识节点会主动触发视图切换,ViewChangeReq中带有该节点即将切换到的视图(记为toView,为当前视图加一),某节点收集满(2*f+1)个视图等于toView、来自不同节点的ViewChangeReq后,会将当前视图切换为toView。

视图切换(viewchange):

在这里插入图片描述

系统架构:

在这里插入图片描述

三阶段共识:

在这里插入图片描述

PBFT各个阶段的具体流程:
在这里插入图片描述

pre-prepare阶段

共识节点收到Prepare包后,进入pre-prepare阶段,此阶段的主要工作流程包括:

  • Prepare包合法性判断:主要判断是否是重复的Prepare包、Prepare请求中包含的区块父哈希是否是当前节点最高块哈希(防止分叉)、Prepare请求中包含区块的块高是否等于最高块高加一;

  • 缓存合法的Prepare包: 若Prepare请求合法,则将其缓存到本地,用于过滤重复的Prepare请求;

  • 空块判断:若Prepare请求包含的区块中交易数目是0,则触发空块视图切换,将当前视图加一,并向所有其他节点广播视图切换请求;

  • 执行区块并缓存区块执行结果: 若Prepare请求包含的区块中交易数目大于0,则调用BlockVerifier区块执行器执行区块,并缓存执行后的区块;

  • 产生并广播签名包:基于执行后的区块哈希,产生并广播签名包,表明本节点已经完成区块执行和验证。

Prepare阶段

共识节点收到签名包后,进入Prepare阶段,此阶段的主要工作流程包括:

  • 签名包合法性判断:主要判断签名包的哈希与pre-prepare阶段缓存的执行后的区块哈希相同,若不相同,则继续判断该请求是否属于未来块签名请求(产生未来块的原因是本节点处理性能低于其他节点,还在进行上一轮共识,判断未来块的条件是:签名包的height字段大于本地最高块高加一),若请求也非未来块,则是非法的签名请求,节点直接拒绝该签名请求;

  • 缓存合法的签名包:节点会缓存合法的签名包;

  • 判断pre-prepare阶段缓存的区块对应的签名包缓存是否达到2f+1,若收集满签名包,广播Commit包:若pre-prepare阶段缓存的区块哈希对应的签名包数目超过2f+1,则说明大多数节点均执行了该区块,并且执行结果一致,说明本节点已经达到可以提交区块的状态,开始广播Commit包;

  • 若收集满签名包,备份pre-prepare阶段缓存的Prepare包落盘:为了防止Commit阶段区块未提交到数据库之前超过2*f+1个节点宕机,这些节点启动后重新出块,导致区块链分叉(剩余的节点最新区块与这些节点最高区块不同),还需要备份pre-prepare阶段缓存的Prepare包到数据库,节点重启后,优先处理备份的Prepare包。

Commit阶段

共识节点收到Commit包后,进入Commit阶段,此阶段工作流程包括:

  • Commit包合法性判断:主要判断Commit包的哈希与pre-prepare阶段缓存的执行后的区块哈希相同,若不相同,则继续判断该请求是否属于未来块Commit请求(产生未来块的原因是本节点处理性能低于其他节点,还在进行上一轮共识,判断未来块的条件是:Commit的height字段大于本地最高块高加一),若请求也非未来块,则是非法的Commit请求,节点直接拒绝该请求;

  • 缓存合法的Commit包:节点缓存合法的Commit包;

  • 判断pre-prepare阶段缓存的区块对应的Commit包缓存是否达到2f+1,若收集满Commit包,则将新区块落盘:若pre-prepare阶段缓存的区块哈希对应的Commit请求数目超过2f+1,则说明大多数节点达到了可提交该区块状态,且执行结果一致,则调用BlockChain模块将pre-prepare阶段缓存的区块写入数据库;


视图切换处理流程

当PBFT三阶段共识超时或节点收到空块时,PBFTEngine会试图切换到更高的视图(将要切换到的视图toView加一),并触发ViewChange处理流程;节点收到ViewChange包时,也会触发ViewChange处理流程:

  • 判断ViewChange包是否有效: 有效的ViewChange请求中带有的块高值必须不小于当前节点最高块高,视图必须大于当前节点视图;

  • 缓存有效ViewChange包: 防止相同的ViewChange请求被处理多次,也作为判断节点是否可以切换视图的统计依据;

  • 收集ViewChange包:若收到的ViewChange包中附带的view等于本节点的即将切换到的视图toView且本节点收集满2*f+1来自不同节点view等于toView的ViewChange包,则说明超过三分之二的节点要切换到toView视图,切换当前视图到toView。


几个问题

  • prepare阶段和commit阶段,需要收集超过2f+1个消息, 是否包含本身的消息? 例如4个节点,有1个节点是拜占庭,那么最多只能收集3个消息(包含节点本身的1条)

  • pre-prepare阶段为什么需要判断空块? 不能有空块?

  • 收到“未来块”会如何处理?

  • 关于消息转发流程优化,如何在起始阶段判断需要转发的节点数量?

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

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

相关文章

nacos mac

一.nacos的下载 进入官网:home 朝下翻 下载一点几版本的,2点几的已经停止更新了。 将下载好的文件放入一个没有中文名称的目录下 nacos目录: 二.nacos的启动与终止 打开终端,进入bin目录下 我的是: cd /Volumes/…

办公高效、生活便捷!海尔科创生态园启用

理想的工作环境应该是什么样子? 是高效的智慧办公,流畅的商务洽谈,快速的停车及通行…… 仅仅这些就够了吗?高效的数字化体验之外,还有浓浓的人性化关爱,健身设备齐全的员工服务中心、给哺乳妈妈们专设的…

LinkedList和ArrayList对比各有什么优势?

一、LinkedList的概述 1. LinkedList是双向链表实现的List 2. LinkedList是非线程安全的 3. LinkedList元素允许为null,允许重复元素 4. LinkedList是基于链表实现的,因此插入删除效率高,查找效率低(虽然有一个加速动作) 5. LinkedList是…

宜明昂科上市申请“失效”:融资数据“打架”,田文志持股约20%

12月29日,贝多财经从港交所披露易了解到,宜明昂科生物医药技术(上海)股份有限公司(下称“宜明昂科”)在港交所递交的上市申请材料已经“失效”,目前已正常无法查看或下载。 其中,招股…

C++图论 最小生成树和二分图问题总结

目录 一、最小生成树 (一)Prim朴素版 思路 练习题 代码 (二)kruskal算法 练习题 代码 二、二分图 (一)染色法判定二分图 练习题 代码 (二)匈牙利算法 练习题 代码 一、…

CSDN官方开发工具利器猿如意实测

目录前言一.ChatGPT二.效率工具三.开发工具四.教程文档五.一行代码六.总结前言 猿如意 是CSDN官方2022年推出的面向程序员效率工具集合,里面包含非常实用的小工具(如Linux命令查询、语音合成、Json格式化、Host切换、文字转图片、Postman、图片处理等&a…

Linux 快照 (snapshot) 原理与实践(一) 快照基本原理

文章目录0. 背景1. 如何理解快照(snapshot)?2. 快照 (snapshot) 的原理2.1 全量快照1. 克隆 (Clone)2. 镜像分离 (Split Mirror)2.2 增量快照1. 写时拷贝(Copy-On-Write)**写数据****读数据****优缺点**2. 写时重定向 (Redirect-On-Write)**写数据****读数据**优缺点3. Linux …

电脑免费录屏软件有哪些?5款视频录制软件免费版

在日常生活工作与学习中,都会经常遇到需要录制屏幕的情况,比如录制线上会议纪要记录、老师授课内容、游戏画面、线上直播等;在众多网络网友录屏软件分享下,有哪些电脑录屏软件是好用的?今天小编就给大家分享5款觉得还不…

最短编辑距离

最短编辑距离一、问题描述二、思路分析1、状态转移方程(1)状态表示(2)状态转移2、循环及初始化(1)循环设计(2)初始化处理三、代码实现一、问题描述 二、思路分析 这道题是一道DP的问…

oh my 毕设-人体姿态估计-简介应用场景

毕设题目为人体姿态估计,之前主要关注在目标检测上,这方面不太熟悉,于是想做一个系列专栏,从0到1学习姿态估计。 参考于大佬-同济子豪兄 姿态估计本质是关键点检测。 人体姿态的估计常常首先预测出人体各个关键点的位置坐标&am…

160.相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…

开启 kerberos 后,HiveServer2 的 webui 没有内容的解决方案

开启 kerberos 后,HiveServer2 的 webui 没有内容。页面如下,可以打开,但是即便已经有会话,也有SQL执行,这里一直这样。 1. 原因分析 1.1 hiveserver2.jsp 以Active Sessions 的内容为例,./service/src…

electron起步基本和electron打包 无脑步骤(修改electron图标)

1.安装 yarn add electron --dev 和 yarn add nodemon --dev 2.在package.json 写main入口和启动脚本 "main":"main.js", "start": "nodemon --exec electron . --watch ./ --ext .js,.html,.css,.vue" "license": "…

oracle在本地创建数据库和导入DMP数据泵

第一步:创建本地数据库 databse Configuration Assistant,创建数据库。 下一步之后完成。 通常在创建数据库时会报错,如图,直接跳过,在net manager的Listener下添加一个新的地址,协议名填写警告日志中Prot…

关于mmpose

为什么是关于mmpose呢,因为我菜。本文仅做记录使用,也就是说,写的不一定对,欢迎大佬批评指正。 我只想知道这种关键点检测是如何标注的,数据集是如何搞的,全网居然都找不到,付费资源我不配&…

Android设计模式详解之装饰模式

前言 装饰模式也称为包装模式,结构型设计模式之一; 定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更为灵活; 使用场景:需要透明且动态地扩展类的功能时; UML类…

零经验出海报单,看跨境电商小白如何在Starday突出重围

随着大数据、云计算等一系列新颖先进的技术概念引入,全球经济市场呈现出以往难以想象的活跃,世界各地的贸易订单都可以借助互联网渠道在数秒内完成全流程。“跨境电商”这一概念正是全球互联网技术普及应用下的附属品,更是经济全球化时代发展…

第五章. 可视化数据分析图表—Seaborn图表(线性回归模型,箱型图,核密度图,提琴图)

第五章. 可视化数据分析图 5.7 Seaborn图表 Seaborn是一个基于Matplotlib的高级可视化效果库,偏向于统计图表,主要针对的是数据挖掘和机器学习中的变量特征选取,相比Matplotlib,他的语法相对简单,但是具有一定的局限性…

《Java高并发与集合框架》第三部分在高并发场景中工作的集合

《Java高并发与集合框架》第三部分在高并发场景中工作的集合前言1.高并发场景中的List、Map和Set集合1.1 CopyOnWriteArrayList1.2 CopyOnWriteArrayList不支持的使用场景1.3 CopyOnWriteArrayList主要方法1.4 java.util.Collections.synchronizedList()方法的补充作用1.4.1 Co…

Allegro如何实现交换pin操作详细指导

Allegro如何实现交换pin操作详细指导 在做PCB设计的时候,换pin是用的较多的功能,换pin可以让线序更加的顺,方便布线。但是前提是确保网络的交换是被允许的 下面用下图为例介绍Allegro中是如何实现交换pin的 具体操作如下 选择File选择Export-Libraries