当前位置:   article > 正文

实用拜占庭协议PBFT_pbft主节点是轮流担任

pbft主节点是轮流担任

实用拜占庭协议PBFT 

PBFT的思想:是基于一个简单但强大的共识机制,使得在分布式系统中的节点能够就某个提案达成一致意见。

利用了Hash函数、数字签名算法、消息验证码,它是第一个工作在异步网络上的拜占庭容错协议,且复杂度只有O(n^2)

PBFT 需要经过三个轮次来完成共识过程:预准备、准备和提交。每个轮次都涉及节点之间的消息传递和确认。

其关键思想包括以下几点:

  1. 主节点轮转:PBFT将系统中的节点分为不同的角色,其中一个节点作为主节点(primary),负责提出提案和协调整个系统的一致性。主节点的选择通过轮流方式,系统中的每个节点都有机会成为主节点。
  2. 三个阶段的请求处理:PBFT将请求处理分为三个阶段:请求预处理、请求处理和结果返回。在这三个阶段中,节点之间相互通信并就提案达成共识。
  3. 复制状态机:PBFT系统中的每个节点都维护一个复制状态机,该状态机会按照相同的顺序执行相同的请求,从而确保在所有正确节点上状态的一致性。(每个节点都包含了完整的状态机实例,称为副本(Replica)。这些副本在设计上具有相同的初始状态,并且通过共识算法确保它们在处理请求时保持一致。系统中的每个节点都有一个本地的状态机。当一个客户端请求操作时,这个操作会被发送到所有的节点副本上去执行。一旦在副本上执行了请求,并且节点确认了该操作的结果,这个结果通常会被复制到节点的状态机上。这个过程确保了系统中的所有副本状态的一致性。
  4. 容错性:PBFT算法可以容忍少数拜占庭错误,具体容忍度取决于系统中的节点数量和故障节点的数量。

三个阶段的请求处理(详解):

预准备(Pre-Prepare)

在这个阶段,主节点(Primary)首先向其他节点广播一个提案(proposal)或请求(request)。

其他节点收到提案后会验证其合法性,并将其添加到一个称为“预准备消息”的数据结构中。这个消息包含了提案的详细信息,如请求的内容、序号等。

预准备消息通常包括以下内容

  1. 请求内容(Request Content)
    • 请求内容指的是客户端发送给系统的具体请求,比如交易数据、状态更新等。这些请求内容是整个共识过程的对象。
  2. 视图编号(View Number)
    • 视图编号用来标识当前所处的视图(View)。在分布式系统中,不同视图对应着系统状态的不同版本,而每个视图由一个主节点负责管理。通过视图编号,系统可以区分不同的视图状态。
  3. 序号(Sequence Number)
    • 序号用来唯一标识每个请求。它确保了在同一个视图中不会有重复的请求被处理,同时可以用来恢复系统的状态以保证一致性。
  4. 消息认证(Message Authentication)
    • 为了防止消息被篡改或伪造,预准备消息通常包含了消息认证信息,比如数字签名或者消息验证码等。这些认证信息确保了消息的完整性和可信度。

预准备消息的目的是确保所有节点都收到相同的提案,并能够开始达成共识。

准备(Prepare)

在收到预准备消息后,每个节点会广播一个称为“准备消息”的内容,表明它们已经验证了预准备消息,并同意该提案的合法性。

以下是准备阶段的准备内容及其作用:

  1. 预准备消息的确认
    • 节点在收到预准备消息后,首先要确认该消息的合法性,即验证提案的内容、视图编号、序号等是否符合系统规则。(验证消息格式、验证试图编号、验证序号、验证请求内容、验证消息认证、确认提案合法
    • 如果预准备消息被确认为有效,则节点会进入准备阶段,并广播准备消息。
  2. 准备消息的内容
    • 准备消息包含了对于特定提案的确认,其中包括提案的内容、视图编号、序号等信息,以及节点自身的签名或认证信息。
    • 通过准备消息,节点向整个系统宣告自己已经验证并确认了该提案的合法性,愿意在后续共识中继续支持该提案。

准备消息的内容:

提案内容/提案哈希值

提案内容是预准备阶段提出的请求或者提案的详细信息。它包括了客户端发出的请求内容,如交易数据、状态更新等

视图编号(View Number):

视图编号用于标识当前所处的视图,确保消息在正确的视图中得到处理。它有助于节点在正确的系统状态下进行共识。

序号(Sequence Number):

序号用于唯一标识每个请求或提案,以确保消息的顺序性和唯一性。节点通过序号可以追踪和管理请求的处理顺序。

消息认证信息(Message Authentication):

消息认证信息用于确保消息的真实性和完整性。这可能包括数字签名或者其他加密算法生成的认证信息,以防止消息被篡改或伪造。

  1. 建立共识
    • 准备消息广播使得其他节点可以获知当前提案的得到多少节点的认可和支持,从而建立起系统对于该提案的共识。
    • 只有在足够数量的节点发送了准备消息,并且这些消息被其他节点确认后,系统才能继续向下一个阶段迈进。
  2. 防止双重投票
    • 准备消息的签名或认证信息有助于防止节点对同一个提案进行多次投票或伪造投票,从而保证了系统的安全性和正确性。
    • 节点的签名也起到了认证节点身份和确认准备消息的作用,确保了共识过程的可信度和可靠性。

节点收到足够数量的准备消息后,可以确定提案的合法性,并进入下一个阶段。

提交(Commit)

一旦一个节点收到了足够数量的准备消息,它会广播一个称为“提交消息”的内容,表示该节点已经确认了提案的合法性,并准备将其应用到系统中。

提交消息的内容:

  1. 提案哈希值(Proposal Hash)
    • 提案哈希值是对提案内容的摘要或哈希值,用于确保消息的完整性和一致性。
  2. 视图编号(View Number)
    • 视图编号用于标识当前所处的视图,以确保消息在正确的视图中得到处理。
  3. 序列号(Sequence Number)
    • 序列号用于唯一标识每个请求或提案,以确保消息的顺序性和唯一性。
  4. 消息认证信息(Message Authentication)
    • 消息认证信息用于确保消息的真实性和完整性。这可能包括数字签名或者其他加密算法生成的认证信息,以防止消息被篡改或伪造。

其他节点收到提交消息后,也会确认该提案的合法性,并将其应用到系统状态中。

一旦足够数量的节点确认了提交消息,该请求就被视为已经达成共识,并可以在系统中执行。

该算法我理解

预准备:主节点发布命令:你们去进攻,包含主节点的签名。其他节点接收消息验证签名,其他节点签名。

准备: 其他节点在收到足够数量的预准备消息后,将准备消息广播给其他节点,表示它们已经验证了提案的合法性,并且愿意在后续共识过程中支持该提案。

提交:我受到了其他节点的消息,表示它们已经确认了该提案,并准备将其应用到状态机中。(我要去执行命令了,发给其他节点

最后:节点将该结果应用到自己的状态机中,并执行对应的操作。

注意:

预准备阶段

  • 至少有2f + 1个节点接受主节点的预准备消息,这确保了即使有f个拜占庭节点,仍然能够找到大多数忠诚的节点来达成共识,可以准备阶段。

准备阶段

  • 同样地,至少收到2f + 1(包括自己)个准备消息,以确保大多数节点已经确认了提案的合法性,才能进行提交阶段。

提交阶段

  • 最后,在提交阶段,同样至少收到2f + 1(包括自己)个节点发送的提交消息,以确保大多数节点已经确认了提案的执行,才进行replay。

假设有N个节点,其中至多f个节点是拜占庭节点。为了保证系统的一致性和安全性,PBFT要求在准备阶段,至少有2f + 1个节点发送了准备消息。这样,即使最多f个节点是拜占庭节点,仍然能够保证至少有f + 1个诚实节点已经准备好了,从而能够继续到提交阶段,并最终达成共识。

实用拜占庭协议根据自己理解已详细解释,有误请指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/600127
推荐阅读
相关标签
  

闽ICP备14008679号