PBFT协议
前提假设
- 分布式节点通过网络是连接在一起的
- 网络节点发送的消息可能会丢,可能会延迟到达,也可能会重复,到达顺序也可能是乱的
为什么至少要3f+1个节点
- 最坏的情况是:f个节点是有问题的,由于到达顺序的问题,有可能f个有问题的节点比正常的f个节点先返回消息,又要保证收到的正常的节点比有问题的节点多,所以需要满足N-f-f>f => N>3f,所以至少3f+1个节点
术语
- client:发出调用请求的实体
- view:连续的编号
- replica:网络节点
- primary:主节点,负责生成消息序列号
- backup:支撑节点
- state:节点状态
3阶段协议
从primary收到消息开始,每个消息都会有view的编号,每个节点都会检查是否和自己的view是相同的,代表是哪个节点发送出来的消息,源头在哪里,client收到消息也会检查该请求返回的所有消息是否是相同的view。如果过程中发现view不相同,消息就不会被处理。除了检查view之外,每个节点收到消息的时候都会检查对应的序列号n是否匹配,还会检查相同view和n的PRE-PREPARE、PREPARE消息是否匹配,从协议的连续性上提供了一定程度的安全。
每个节点收到其他节点发送的消息,能够验证其签名确认发送来源,但并不能确认发送节点是否伪造了消息,PBFT采用的办法就是数数,看有多少节点发送了相同的消息,在有问题的节点数有限的情况下,就能判断哪些节点发送的消息是真实的。REQUEST和PRE-PREPARE阶段还不涉及到消息的真实性,只是独立的生成或者确认view和序列号n,所以收到消息判断来源后就广播出去了。PREPARE阶段开始会汇总消息,通过数数判断消息的真实性。PREPARE消息是收到PRE-PREPARE消息的节点发送出来的,primary收到REQUEST消息后不会给自己发送PRE-PREPARE消息,也不会发送PRE-PREPARE消息,所以一个节点收到的消息数满足2f+1-1=2f个就能满足没问题的节点数比有问题节点多了(包括自身节点)。COMMIT阶段primary节点也会在收到PREPARE消息后发送COMMIT消息,所以收到的消息数满足2f+1个就能满足没问题的节点数比有问题节点多了(包括自身节点)。
PRE-PREPARE和PREPARE阶段保证了所有正常的节点对请求的处理顺序达成一致,它能够保证如果PREPARE(m, v, n, i) 是真的话,PREPARE(m’, v, n, j) 就一定是假的,其中j是任意一个正常节点的编号,只要D(m) != D(m’)。因为如果有3f+1个节点,至少有f+1个正常的节点发送了PRE-PREPARE和PREPARE消息,所以如果PREPARE(m’, v, n, j) 是真的话,这些节点中就至少有一个节点发了不同的PRE-PREPARE或者PREPARE消息,这和它是正常的节点不一致。当然,还有一个假设是安全强度是足够的,能够保证m != m’时,D(m) != D(m’),D(m) 是消息m的摘要。
确定好了每个请求的处理顺序,怎么能保证按照顺序执行呢?网络消息都是无序到达的,每个节点达成一致的顺序也是不一样的,有可能在某个节点上n比n-1先达成一致。其实每个节点都会把PRE-PREPARE、PREPARE和COMMIT消息缓存起来,它们都会有一个状态来标识现在处理的情况,然后再按顺序处理。而且序列号n在不同view中也是连续的,所以n-1处理完了,处理n就好了。
VIEW-CHANGE
上图是发生VIEW-CHANGE的一种情况,就是节点正常收到PRE-PREPARE消息以后都会启动一个定时器,如果在设置的时间内都没有收到回复,就会触发VIEW-CHANGE,该节点就不会再接收除CHECKPOINT 、VIEW-CHANGE和NEW-VIEW等消息外的其他消息了。NEW-VIEW是由新一轮的primary节点发送的,O是不包含捎带的REQUEST的PRE-PREPARE消息集合,计算方法如下:
- primary节点确定V中最新的稳定检查点序列号min-s和PRE-PREPARE消息中最大的序列号max-s
- 对min-s和max-s之间每个序列号n都生成一个PRE-PREPARE消息。这可能有两种情况:
- P的VIEW-CHANGE消息中至少存在一个集合,序列号是n
- 不存在上面的集合
第一种情况,会生成新的PRE-PREPARE消息<PRE-PREPARE, v+1, n, d>
发表评论
相关推荐
因为Libra学习rust,想用rust写些东西,而刚好看区块链共识机制的PBFT,就用原生Rust实现一个PBFT的分布式系统,业余中间断断续续写,代码比较零散。 中间也有些逻辑值得记录, 主要在Rust的多线程,网络通信的处理...
PBFT算法还包括垃圾回收和试图变更协议两个部分。垃圾回收是指系统对不再需要的数据进行清理的过程。试图变更协议则是当系统需要对运行中的协议进行升级时采用的机制。 总体来看,PBFT算法适用于分布式系统中的节点...
为了应对拜占庭问题,即系统中的节点可能进行错误行为或恶意攻击,PBFT引入了复杂的通信协议和投票机制。 PBFT算法特别适合在异步环境中运行,例如互联网,它能够应对网络延迟、节点故障等不确定因素。与以往只能在...
6. 联盟链PBFT系统:文章提到使用的数字代币系统基于PBFT协议的联盟链系统。联盟链由中心化数字货币系统主导,节点准入权也由其决定,保证了整个兑换系统的高效性和安全性。PBFT(Practical Byzantine Fault ...
每个节点都有自己的副本,它们通过特定的协议保持同步。当客户端请求提交一个事务时,主节点负责广播该事务,其他节点通过多轮的投票来确认该事务是否应该被提交。 ##### 5.2 具体步骤 1. **预准备阶段**(Pre-...
2. **一致性协议优化**:在没有拜占庭节点的假设下,对PBFT的一致性协议进行优化,减少了不必要的消息交互,提高了共识效率。 3. **升降级机制**:动态更新参与共识的节点集合,根据节点表现进行升降级,保证大部分...
总结来说,PBFT算法是分布式系统特别是联盟链中的关键共识机制,它通过严谨的设计和高效的一致性协议,能够在面临部分节点故障或欺诈时,保证系统的稳定运行和一致性决策。这种算法在区块链技术中的应用,极大地推动...
一种PBFT算法变种(实用拜占庭容错算法,联盟链共识算法),基于PBFT算法进行的改进。 原文名称:Tendermint: Consensus without Mining 作者:Jae Kwon
在不存在拜占庭节点的情况下,优化PBFT算法的一致性协议。引入升降级机制,动态更新参与共识的节点集合,以保证算法在大部分时间内都执行优化一致性协议。 四、实验结果 实验结果表明,与PBFT算法相比,本文提出的...
1. **异步网络环境下的状态机副本复制协议**:这是首次提出的在异步网络环境中使用状态机副本复制的方法。 2. **多方面优化提高性能**:通过多种优化措施,PBFT算法显著提升了性能。 3. **拜占庭容错分布式文件系统*...
传统的BFT协议,如PBFT(实用拜占庭容错),通常依赖于网络的同步或弱同步假设,即网络延迟在一段时间内有界,这在实际网络环境中难以保证。蜜獾BFT协议则是第一个能够在不依赖任何时间假设的情况下保证活性的实用...
近年来,虽然已经开发出了一些快速的BFT状态机复制协议,如PBFT(Practical Byzantine Fault Tolerance)、Q/U、HQ和Zyzzyva等,但这些协议在面对单个故障的客户端或服务器时表现得相当脆弱。它们的性能可能会大幅度...
传统的BFT协议,如Practical Byzantine Fault Tolerance (PBFT),依赖于网络的同步性假设,这在实际环境中可能难以满足。然而,随着加密货币的广泛普及,对大规模、强健的异步BFT协议的需求日益增长。在这种背景下,...
PBFT采用三阶段协议:预备、确认和执行,通过多数派决策来防止错误发生。 6. **2PC(两阶段提交)**:两阶段提交是一种分布式事务协议,但其主要缺点是阻塞和单点故障问题。在第二阶段,如果协调者失败,可能会导致...
移动支付的安全通信协议模型是确保交易安全的关键,其中,DNS(Domain Name System)协议的改进对于提升支付安全起着至关重要的作用。传统的DNS协议可能存在中间人攻击和数据不安全的风险,因此,科研人员致力于通过...
- **多阶段协议**:将共识过程分解为多个阶段,每个阶段完成特定的任务,从而减少整体延迟。 - **消息认证**:采用数字签名等机制来验证消息的来源和完整性,防止恶意节点发送伪造消息干扰共识过程。 - **状态同步**...
### RUST-2019新版代码大全:RCONWEB协议详解 #### 一、引言 《RUST-2019新版代码大全》是一本面向Rust游戏开发者的实用指南,其中包含了丰富的代码示例和技术细节。本书不仅适合初学者入门,也适合有经验的开发者...
HotStuff协议的特色在于其能与其他BFT复制协议,如DLS、PBFT、Tendermint和Casper,在一个通用框架中进行表达。这意味着它可以作为一个协议的桥梁,连接经典BFT基础与区块链技术。HotStuff被设计成能在大规模网络中...
常见的分散协议有拜占庭将军问题解决方案(如PBFT)、共识算法(如Paxos、Raft)等。 3. **模型检查**:模型检查是一种自动验证技术,用于确定一个系统是否满足指定的规范。在Alloy中,用户可以定义一组初始状态和...