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

这篇具有很好参考价值的文章主要介绍了FISCO BCOS的PBFT共识算法流程详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原文: 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共识过程,区块链,共识算法,区块链,PBFT,FISCO BCOS

系统架构:

pbft共识过程,区块链,共识算法,区块链,PBFT,FISCO BCOS

三阶段共识:

pbft共识过程,区块链,共识算法,区块链,PBFT,FISCO BCOS

PBFT各个阶段的具体流程:
pbft共识过程,区块链,共识算法,区块链,PBFT,FISCO BCOS

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阶段为什么需要判断空块? 不能有空块?

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

  • 关于消息转发流程优化,如何在起始阶段判断需要转发的节点数量?文章来源地址https://www.toymoban.com/news/detail-786782.html

到了这里,关于FISCO BCOS的PBFT共识算法流程详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链共识机制 (Consensus)(PoW,PoS,PAXOS,RAFT,PBFT)

    所谓“共识机制”,是通过特殊节点的投票,在很短的时间内完成对交易的验证和确认;对一笔交易,如果利益不相干的若干个节点能够达成共识,我们就可以认为全网对此也能够达成共识。再通俗一点来讲,如果中国一名微博大V、美国一名虚拟币玩家、一名非洲留学生和一

    2024年02月03日
    浏览(33)
  • Fisco Bcos区块链五(后端区块链应用开发框架及流程)

    在IntelliJ IDE中创建一个gradle项目,勾选Gradle和Java,并输入工程名 asset-app 。 注意:该项目的源码可以用以下方法获得并参考。(此步骤为非必须步骤) 注解 如果因为网络问题导致长时间无法下载,请尝试将 199.232.28.133 raw.githubusercontent.com 追加到 /etc/hosts 中,或者请尝试 cu

    2024年02月14日
    浏览(59)
  • 区块链实验室(11) - PBFT耗时与流量特征

    耗时特征见下图所示。横坐标是节点的度,纵轴是耗时(毫秒) 从上图可以看出,在度值小的节点上发起的交易,与度值大的节点上发起的交易,两者的耗时差别不大。原以为在度值大的节点上发起交易(例如上图的度值38),该节点处于网络中心位置,报文传播速度快,耗时应该

    2024年02月04日
    浏览(39)
  • FISCO BCOS(二十二)——— 游离节点、观察者节点和共识节点

    本篇文章主要讲一下如何对游离节点、观察者节点和共识节点进行转换。首先要了解一下什么是组员和非组员以及一写操作命令 组员和非组员 组员 共识节点:参与共识的节点,拥有群组的所有数据(搭链时默认都生成共识节点)。 观察者节点:不参与共识,但能实时同步链

    2024年02月09日
    浏览(95)
  • PBFT实用拜占庭容错算法

    本篇文章开启区块链共识算法的普及——我以 PBFT (Practical-Byzantine-fault-tolerant)实用拜占庭容错共识算法打头阵。 为什么先是PBFT呢? 一个原因是觉得这个算法的名字很酷,实际上它也有着有趣的历史背景。另一个原因呢,就是最近在接触联盟链,而这个算法呢,正是联盟链

    2024年02月02日
    浏览(41)
  • 实用拜占庭容错算法 (PBFT)

    一、算法原理     实用拜占庭容错算法 (Practical Byzantine fault tolerance, PBFT)是一种状态机副本复制算法, 每个状态机的副本都保存了服务的状态, 同时也实现了客户端所有合法请求的操作, 能够保证在满足分布式系统活性和安全性的前提下, 允许 (n − 1)/3 个节点出错 (数据丢失、

    2024年02月11日
    浏览(47)
  • Fisco Bcos区块链一(搭建单群组FISCO BCOS联盟链)

    技术文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/index.html 1、搭建单群组FISCO BCOS联盟链 1. 安装centos依赖包 安装依赖包openssl、curl 2. 创建操作目录, 下载安装脚本 如果因为网络问题导致长时间无法下载build_chain.sh脚本,请尝试 3. 搭建单群组4节点联盟链 在fisco目录下执

    2024年02月10日
    浏览(49)
  • FISCO BCOS 区块链(一)

    目录 一、搭建 FISCO BCOS 链 1、安装 openssl, curl 依赖 2、安装 build_chain 脚本 二、配置控制台 1、下载java jdk 2、安装控制台 3、拷贝配置文件以及证书 4、启动控制台 三、Java-SDK(idea版) 1、创建 project  2、引入 Java-SDK依赖 3、sol2java.sh 4、导入所需资源 5、创建测试类 参考 FISCO

    2024年01月24日
    浏览(50)
  • 搭建FISCO BCOS区块链平台

    这是为北京交通大学《区块链技术》课程制作的实验教程,因面向全校研究生开放选课,故提供了详细的步骤。本文是实验第一步,用于搭建FISCO BCOS区块链平台。 详细阅读FISCO BCOS官方文档: https://fisco-bcos-doc.readthedocs.io/zh_CN/latest/index.html VMware虚拟机安装包下载地址: https

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包