Fabric学习笔记-PBFT算法

本文介绍了实用拜占庭容错算法(PBFT)。

Fabric在v0.6中采用的是PBFT算法,在v1.0.0-preview中是SBFT算法,在v1.0.0-release中文档上说PBFT还在开发中,项目中目前还没有实现(⊙o⊙)…但是万变不离其宗都是对BFT算法的一些优化改进。

解决的问题

拜占庭算法主要解决了缺少可信的中央节点和可信任的通道的情况下,分布在网络中的各个节点如何达成共识的问题,实用拜占庭算法是拜占庭算法的改进,主要改进了拜占庭算法效率不高的问题,将算法复杂度由指数级降低到多项式级,使得拜占庭容错算法在实际系统应用中变得可行。

基本概念

  • 客户端(client)负责发送请求。
  • 副本(replica)所有参与提供服务的节点。
  • 备份节点(backup)主节点外的所有节点。
  • 主节点(primary)从副本中选出提供主要服务的节点。
  • 视图(view)主节点和副本之间编号的一次快照。

PBFT是一种状态机副本复制算法,即服务作为确定有限状态机进行建模,状态机在分布式系统的不同节点进行副本复制。每个状态机的副本都保存了服务的状态,同时也实现了服务的操作。

在确定有限自动机中,每个状态对每个可能输入只有精确的一个转移,在输入顺序一致,起始状态一致的情况下输出也必然一致。这也就对PBFT算法中的副本提出了两个限定 :

  1. 所有节点必须是确定性的。也就是说,在给定状态和参数相同的情况下,操作执行的结果必须相同。
  2. 所有节点必须从相同的状态开始执行。

在这两个限定条件下,即使失效的副本节点存在,PBFT算法对所有非失效副本节点的请求执行总顺序达成一致,从而保证安全性。

将所有的副本组成的集合使用大写字母R表示,使用0到|R|-1的整数表示每一个副本。为了描述方便,假设|R|=3f+1,这里f是有可能失效的副本的最大个数。尽管可以存在多于3f+1个副本,但是额外的副本除了降低性能之外不能提高可靠性。

算法流程

  1. 请求阶段:客户端向主节点发送请求。
  2. 预准备阶段:主节点分配一个序列号n给收到的请求,然后向所有备份节点广播预准备消息,预准备消息的格式为<<PRE-PREPARE,v,n,d>,m>,这里v是视图编号,m是客户端发送的请求消息,d是请求消息m的摘要。
  3. 准备阶段:备份节点i接受了预准备消息<<PRE-PREPARE,v,n,d>,m>,则进入准备阶段。在准备阶段的同时,该节点向所有副本节点发送准备消息<PREPARE,v,n,d,i>,并且将预准备消息和准备消息写入自己的消息日志
  4. 确认阶段:副本节点收到2f个从不同副本节点发来一致的预准备消息,一共2f+1个一致的预准备消息确认了消息的正确性,然后按照序号n依次执行请求。

预准备阶段和准备阶段确保所有正常节点对同一个视图中的请求序号达成一致。

准备阶段和确认阶段确保了节点执行了大多数都认可的操作。

PBFT算法流程:

PBFT算法流程

主要介绍了PBFT算法的主要流程,其中还有一些问题例如:主节点是如何选择,主节点失效,怎么确定消息的正确性等都不在此赘述,可以参考 区块链核心技术:拜占庭共识算法之PBFT


https://zhuanlan.zhihu.com/p/34346665

猜你喜欢

转载自blog.csdn.net/omnispace/article/details/80107108
今日推荐