paper | code |
---|---|
https://pmg.csail.mit.edu/papers/osdi99.pdf | https://github.com/luckydonald/pbft |
- 其他相关实现:
- This is an implementation of the Pracltical Byzantine Fault Tolerance protocol using Python
- An implementation of the PBFT consensus algorithm using rust-libp2p as the networking layer.
- Network simulation for PBFT (Practical Byzantine Fault Tolerance) consensus algorithm in Python
- go Sample implementation of PBFT consensus algorithm
- https://github.com/vonwenm/pbft/blob/master/bft-simple/Makefile
PBFT相关简述
1. 拜占庭将军问题
- 拜占庭将军问题描述了一组将军(或节点)需要协同完成任务,但其中一部分将军可能会背叛或发出错误信息。问题是如何确保即使有一些将军是不可靠的,剩下的将军仍然能够达成一致并完成任务。
2. 拜占庭容错的核心目标
-
拜占庭容错的核心目标是确保系统即使在部分节点故障或恶意行为的情况下,也能继续正确地运作。这包括:
-
一致性:所有正常节点对系统状态达成一致。
-
可用性:系统能够在节点故障的情况下继续运行。
-
容错性:系统能够容忍一定数量的故障或恶意节点,而不会影响整体功能。
拜占庭容错和非拜占庭容错
-
拜占庭容错(Byzantine Fault Tolerance, BFT)和非拜占庭容错(Non-Byzantine Fault Tolerance)是两种不同的容错机制,用于确保系统在存在错误或故障的情况下仍然能够正常运行。
-
拜占庭容错的核心思想是
应对系统中存在的不确定性和不诚实节点
,尤其是面对可能的恶意攻击和节点故障。这个概念来源于拜占庭将军问题(Byzantine Generals Problem),这个问题描述了在一个系统中,如何确保即使存在部分节点故障或恶意节点,系统仍能达成一致意见并保持正常运行。BFT能够处理和容忍节点的恶意行为,包括虚假信息、拒绝服务等。常见的BFT算法如Practical Byzantine Fault Tolerance (PBFT)、Delegated Byzantine Fault Tolerance (DBFT)等,能够在存在恶意节点的情况下达成一致。 实现BFT机制的系统通常需要更多的通信开销和计算资源,因为算法要处理复杂的协议以确保一致性。 -
拜占庭容错关注的是在节点故障、网络问题等正常的故障情况下保证系统的正确性和一致性,但不处理恶意行为。
容忍的是普通的故障,如崩溃、掉线等,而不是恶意行为。
(更偏向封闭系统内部)。常见的非拜占庭容错算法如Paxos、Raft,这些算法假设所有的节点都遵循协议,没有恶意行为。 相对于BFT,非拜占庭容错的算法通常更简单,性能开销较低,因为不需要考虑恶意节点的情况。
3. BFT算法的基本要求
- 拜占庭容错算法通常要求系统中正常节点的数量至少是故障节点数量的三倍加一。也就是说,如果系统中有
n
个节点,最多可以容忍f
个故障节点,且f
满足f < (n - 1) / 3
。例如,在一个总共有 7 个节点的系统中,最多可以容忍 2 个故障节点。
4. BFT算法的实现:Practical Byzantine Fault Tolerance (PBFT)
- PBFT 由 Castro 和 Liskov 于1999年提出,广泛用于分布式系统。PBFT将原始的。PBFT 算法通过三阶段的协议(预备阶段、准备阶段和提交阶段)来确保系统的一致性。