分布式共识:无需管理员也能就「同一事实」达成一致
当 P2P 网络不再只是分发数据,而要共享一份「账本」或「状态」时,就需要一种让所有人对同一内容达成一致的机制:分布式共识算法。这里讲解四种代表性方案:PoW、PoS、PBFT 与 HotStuff。
为什么分布式共识很难
有中央服务器时,「正确的数据」由服务器说了算即可。但在一群对等节点之中,你必须假设消息会延迟或丢失、节点会宕机,甚至还有会撒谎的节点。这种困难已被若干著名结论所形式化。
- 拜占庭将军问题:驻扎各地的将军们只能靠信使来统一「一齐进攻还是撤退」。然而信使可能丢失,叛变的将军还可能向各处传达互相矛盾的内容。这个思想实验揭示了在参与者不仅会故障、还可能怀有恶意的环境中达成一致的困难。做出矛盾行为的故障称为拜占庭故障。
- CAP 定理:分布式系统无法同时满足一致性(Consistency)、可用性(Availability)与分区容忍(Partition tolerance)三者。由于网络分区不可避免,实际设计就成了「分区时优先保一致性还是可用性」的选择。
- FLP 不可能性:1985 年的定理指出,在异步网络(消息到达时间没有保证的环境)中,哪怕只有一台可能宕机,也不存在确定性地必然达成一致的算法。实用系统靠引入超时、随机化或经济激励来绕过这堵墙。
也就是说,分布式共识算法是在这些理论约束之下,通过设定现实假设来「实现实用上足够的一致」的一整套工程。大体可分为面向自由参与(无许可)环境的中本型(PoW/PoS),和面向参与者已知(许可型)环境的BFT 型(PBFT/HotStuff)两个谱系。
按故障模型梳理:崩溃容错系与拜占庭容错系
理解共识算法的最短路径,是按「假设何种故障(故障模型)」来分类。崩溃故障指节点只是默默停机,绝不撒谎。像数据中心内的数据库那样、参与者都在自家管辖之下的环境,这一假设就足够了,Paxos 和 Raft 在此大显身手。而拜占庭故障指不但会停、还会撒谎、自相矛盾的任意故障;在无法信任参与者的环境必须按此设防:成员已知时用 PBFT、HotStuff,参与自由时则由 PoW/PoS 应对。
所需节点数也有本质差异:容忍 f 台崩溃只需 2f+1 台(多数派法定人数),而拜占庭容错为了在表决中压制撒谎者需要 3f+1 台。下面按 Proof 系 → 崩溃容错系 → 拜占庭容错系的顺序逐一讲解。
按参与模型梳理:可信节点的共识与不可信节点的共识
此前的分类以容错模型为轴:只假设崩溃故障,还是要连撒谎的拜占庭故障也一并假设。还有另一个独立的轴能解释这六种方案为何呈现出各自的形态,即参与模型:成员是已知且固定的,还是任何人都能自由加入退出。
可信节点的共识(已知成员×仅崩溃容错):如同自家数据中心或 Kubernetes 集群,节点由同一组织构建和监控,硬件故障或网络分区可能让它默默停止,但假设它不会故意发送虚假消息是合理的。Paxos 和 Raft 最适合这种「可信但不完美」的节点形象:容忍 f 台故障只需 2f+1 台,通信也无需承担密码学投票的额外开销,足够轻量。
身份已知但行为不可信节点的共识(已知成员×拜占庭容错):如同联盟链或银行间结算网络,参与者的组织和身份通过注册审核已知,但无法排除运营者被收买或系统被入侵的可能。这里要假设「身份已知但行为不可信」的节点,正是 PBFT、HotStuff,以及以质押量决定验证者名单的 Tendermint 的用武之地。拜占庭容错需要 3f+1 台,也要求签名与多轮投票这类更重的机制,但正因为参与者数量有限,这份成本才划算。
连身份都无法确认节点的共识(自由参与×拜占庭容错):如同公开区块链,没有人能掌握究竟是谁、以多少台节点在参与。既然身份无法作为信任的担保,诚实参与者占多数这件事就必须靠一种「滥用即自损」的外部成本来担保:算力(PoW)或质押资产(PoS)。参与自由的代价,是概率性最终性、罚没(slashing)这类已知成员环境中不存在的机制。
剩下的「自由参与×仅崩溃容错」组合在实践中几乎不存在:既然任何人都能自由加入,还假设所有参与者都不撒谎,未免过于毫无防备。不愿承担核实身份的成本,就无法保证行为的诚实。这正是公开网络的共识无一例外都要求拜占庭容错的原因。
| 参与模型 | 假设的故障 | 对应方案 | 典型环境 |
|---|---|---|---|
| 已知且固定(许可型) | 仅崩溃 | Paxos、Raft | 自有数据中心、单一组织的集群 |
| 已知且固定(许可型) | 拜占庭 | PBFT、HotStuff、Tendermint | 联盟链、银行间结算网络 |
| 自由参与(无许可) | 拜占庭 | PoW、PoS | 公开区块链 |
| 自由参与(无许可) | 仅崩溃 | (无实用案例) | 不核实身份就无法假设诚实 |
这一梳理让 PoS 的定位更加清晰:PoS 所承担的,不过是「用质押代替身份来发放参与资格」这一无许可层面的巧思。一旦质押固定下验证者集合,该集合内部的共识便常常回到「已知成员的拜占庭容错共识」,也就是 PBFT 与 HotStuff 的地盘。下一节将具体展开。
Proof 系:自由参与网络的共识(PoW / PoS)
PoW(工作量证明):用算力为「正确性」背书
比特币采用的工作量证明通过算力竞赛来决定「追加下一个区块的权利」。矿工靠穷举不断寻找一个一次性数值(nonce),使区块的哈希值满足特定条件(如开头有一定数量的零)。最先找到满足条件哈希的矿工提议区块并获得奖励。
关键在于,找到答案很难,但验证只需一瞬。其他节点只算一次哈希,就能确认这个区块投入了巨量计算。链发生分叉时,规则很简单:「以投入累积算力最多的链为准」。这就是中本共识,它首次在任何人、任意多人皆可加入的开放环境中促成了实用的一致。
- 51% 攻击:掌握全网过半算力的攻击者,能撤销交易(双花)或排斥特定交易。反过来说,凑齐过半算力的成本正是安全性的依据。小型链确实发生过 51% 攻击的受害案例。
- 概率最终性:区块只是「越往后堆叠越难被推翻」,并没有数学上确定的瞬间。比特币「等待 6 个确认」的惯例正源于此。
- 电力问题:由于安全性与算力成正比,大量耗电在所难免。对这一环境负担的批评,推动了向下文所述 PoS 的迁移。
PoS(权益证明):用质押的资产为「正确性」背书
权益证明用「货币的质押(stake)」代替算力竞赛来担保参与资格。验证者锁定一定数量的货币进行登记,协议按质押量等选出出块提议者。其他验证者对提议区块投票(认证),当规定数量的赞成汇集后区块便逐步确定。
威慑力来自罚没。一旦检测到对两个互相矛盾的区块签名等违规,质押的一部分或全部会被没收。相对于 PoW 的「攻击要花电费」,PoS 用「攻击就烧掉自己的资产」这种经济惩罚来构筑安全。
- 无利害关系问题:对早期 PoS 设计的经典批评。链分叉时,若投票没有成本,那「给所有分叉都押上」就成了理性选择,共识可能无法收敛。罚没正是对策,它惩罚矛盾投票本身。
- 以太坊的迁移(The Merge):2022 年 9 月,以太坊在不停机的情况下从 PoW 迁移到 PoS,能耗削减超过 99.9%。如今由质押 32 ETH 的验证者群体提议和认证区块,并引入了在特定条件下「确定(finalize)」的明确最终性。
- 课题:向大额持有者的权力集中、质押池导致的事实中心化、对长程攻击的对策(弱主观性)等 PoS 特有议题仍在活跃研究中。
崩溃容错系:「全是自己人」世界的共识(Paxos / Raft)
Paxos:崩溃容错共识的经典
莱斯利·兰波特提出的 Paxos 是崩溃故障模型下共识的理论基石。核心思想是多数派法定人数,即「任意两个多数派必有至少一台共同节点」,由此保证一旦选定的值绝不会被推翻。角色有三:提出值的 Proposer、投票接受值的 Acceptor、学习结果的 Learner(实现中通常由同一节点兼任)。
共识分两个阶段。先是 Prepare/Promise:Proposer 附上单调递增的提案编号 n 发送 Prepare,从多数派 Acceptor 处收集「不再接受低于 n 的提案」的承诺(Promise),以及已被接受的值(如有)。然后是 Accept/Accepted:Proposer 发送 Accept,内容为「若 Promise 中含有已接受的值则用该值,否则用自己的值」,当多数派接受(Accepted)时值即告选定。正是这条继承已接受值的规则,成就了「一旦选定、永不更改」的安全性。
- 难在何处:算法本身很短,但论文没有写「在现实中跑起来」所需的周边,例如多个 Proposer 冲突(活锁)、故障恢复、状态持久化,导致实现者各自解读,这是「Paxos 难」的主因。
- Multi-Paxos:把决定单个值的基本 Paxos 连续应用,并立一位稳定领导者从而省略 Prepare 阶段,就成为实用的日志复制系统。
- 采用实例:Google 的锁服务 Chubby,以及 Spanner 系的分布式数据库,都以 Paxos 为基础。
Raft:以「易于理解」为设计目标的共识
Raft(Ongaro & Ousterhout,2014 年)的旗号是「以易于理解的形式,实现与 Paxos 同等的性能与安全」。它把问题拆解为领导者选举、日志复制、安全性三块,并始终立一位强领导者来简化思考(原论文见参考文献中的 ongaro2014search)。
- 领导者选举:时间被单调递增的 term(任期)编号切分。跟随者若在随机化超时(如 150〜300ms)内收不到领导者的心跳,便转为候选者,推进任期并征集选票;获得多数派选票者成为新领导者。随机化超时让票数分裂自然消解,是其巧妙之处。
- 日志复制:客户端命令追加到领导者的日志,经 AppendEntries RPC 复制到所有跟随者。确认复制到多数派的条目即提交,并应用到各节点的状态机。
- 安全性(Leader Completeness):投票时「不投给日志比自己旧的候选者」,因此缺少已提交条目的节点当不上领导者,从而保证已提交的命令绝不丢失。
易于理解直接转化为普及率:Kubernetes 心脏的 etcd、NewSQL 数据库 TiDB 和 CockroachDB(参考文献中的 huang2020tidb / taft2020cockroachdb)。现代基础设施的各个角落都在运行 Raft。
Raft 的日志复制:领导者分发日志,条目复制到多数派的瞬间即告提交。
拜占庭容错系:纵有叛徒也不崩溃的共识(PBFT / HotStuff)
PBFT:许可型网络的经典 BFT 共识
PBFT(实用拜占庭容错,1999 年)是用于参与者已知环境(联盟链、金融系统等)的拜占庭容错共识经典。在 n 台中最多 f 台发生任意(恶意)故障时,只要 n ≥ 3f+1 就能正确达成一致。也就是 4 台容 1 台、7 台容 2 台叛徒。
一致分三个阶段推进:
- pre-prepare:领导者(主节点)为客户端请求赋予序号,并把提议广播给所有副本。
- prepare:每个副本验证提议,并把「我接受此提议」的 prepare 消息互相发给所有节点。集齐 2f+1 条即可确认足够多的诚实节点看到了同一提议。
- commit:节点再互相交换「可以确定」的 commit 消息,集齐 2f+1 条时执行请求并回复客户端;客户端凭 f+1 条一致的回复即可信任结果。
与区块可能被重组的中本型不同,PBFT 具有在 commit 瞬间结果即确定的即时最终性。代价是,在 prepare/commit 阶段所有节点向所有节点发消息,通信量达到 O(n²),因而实用部署上限约为数十到一百个节点。而且当领导者故障时,必须用「视图变更」这一沉重的协议重新选出领导者。
PBFT 消息流。在 prepare/commit 阶段所有节点互相交换消息,使通信量膨胀到 O(n²)。
HotStuff:实现 O(n) 通信量的现代 BFT
HotStuff(2019 年)是解决了 PBFT 通信量问题的基于领导者的 BFT 共识算法。最大的巧思在于,副本之间不再互发消息,而是把所有投票汇总到领导者。领导者集齐 2f+1 票后,把它们打包成一份「证书(QC:Quorum Certificate)」,在下一轮分发给所有人。若使用门限签名,证书可压缩为单个签名,每轮通信量便降到 O(n)。
另一个特点是三链规则。当对应 prepare→precommit→commit 的三代 QC 连续堆叠在某区块之上时,该区块即告确定。这一设计把「共识的一个阶段」和「领导者更替」统一成同样形态的处理,从而能以低成本让领导者每轮轮换。在 PBFT 中属于沉重异常处理的视图变更,在 HotStuff 中成了常规运行的一部分。
- 因 Facebook(现 Meta)的 Libra/Diem 项目将其作为 LibraBFT 采用而广为人知。
- 如今 HotStuff 系共识(含改进版)仍是 Aptos 等高性能区块链的核心。
- 「领导者汇总+门限签名+链式」这套设计,成为其后 BFT 研究(两轮化、基于 DAG 的共识等)的共同语言。
PoS 与 BFT 共识的交汇点:选出验证者的那一层,和把票转化为共识的那一层
深入主流 PoS 链的内部会发现,决定「谁拥有投票权」的 PoS 层,和决定「收集到的票如何变成最终共识」的 BFT 共识层,是清晰分离、彼此叠加的两层。以 Tendermint、Diem/Aptos、以太坊三个实例,具体看看这种分层结构。
Tendermint(Cosmos):用质押加权运行 PBFT 式的三阶段
Tendermint 的 propose → prevote → precommit 三阶段,结构上与 PBFT 的 pre-prepare → prepare → commit 几乎同构(参见参考文献中的 buchman2018tendermint)。区别在于:提议者不是来自固定的已知集合,而是按质押量逐轮轮换;法定人数的标准也不是「2f+1 个节点」,而是「超过 2/3 的质押量」。PoS 在这里只负责「谁是提议者」「一票的分量是多少」这类输入,实际的共识逻辑与 PBFT 极为接近,也继承了 O(n²) 通信量这一弱点。Cosmos 生态通过把验证者数量大致控制在 100~150 左右来维持实用性。
Diem(Libra)/Aptos:在 PoS 验证者集合之上直接运行 HotStuff
LibraBFT(现 Diem)与 Aptos 的共识层,几乎是把 HotStuff 论文(参见参考文献中的 yin2018hotstuff)原样落地的实现。验证者集合的构成与投票权重由 PoS 质押量决定,HotStuff 的领导者汇总、QC、三链规则则在这一集合内部运行。相较于 PBFT 系的 Tendermint 受困于 O(n²) 通信难以扩容,HotStuff 系凭借 O(n) 通信更容易在更大的验证者集合下维持吞吐。Aptos 在此基础上采用了 DiemBFTv4(Jolteon)等进一步提速的改进版本。
以太坊:「PBFT 式最终性 × 中本式分叉选择」的双层结构
以太坊既不是单纯的「Tendermint 式」,也不是单纯的「HotStuff 式」,而是双层混合。最新区块的提议与链头的确定由 LMD-GHOST 这一中本式(选择权重最大的分支)分叉选择规则负责,单看这一层仍是概率性最终性。在其之上叠加的是 Casper FFG(友好最终性小工具):针对每个纪元(epoch)边界的检查点,一旦验证者质押的超过 2/3 通过两轮投票(justify → finalize)表示赞成,该检查点便不可逆转地确定。这种两轮、2/3 超级多数的结构,与 PBFT 的 prepare/commit 是同一种思路,原论文(参见参考文献中的 buterin2017casper)也明确承接了拜占庭容错共识的谱系。
| 链 | PoS 决定什么 | BFT 共识谱系 | 最终性粒度 |
|---|---|---|---|
| Tendermint / Cosmos | 提议者选出与投票权重 | PBFT 系(三阶段、O(n²)) | 逐区块即时确定 |
| Diem・Aptos | 验证者集合与投票权重 | HotStuff 系(QC 汇总、O(n)) | 逐区块即时确定(三链规则) |
| 以太坊 | 验证者集合与投票权重 | Casper FFG(PBFT 式 2/3 投票)+LMD-GHOST | 按纪元确定,最新区块仍是概率性 |
PoS = 谁来投票(女巫抵抗力、投票权重),PBFT/HotStuff = 收集到的票如何变成共识(安全性、最终性)。如今大多数主流链,都是这两层组合而成的实现。前面表格里「中本型」与「拜占庭容错型」看似是两个独立分组,那是按容错模型与参与模型划分的结果;而在实现层面,这两层是叠加共存的。
六种方案对比
各方案在「谁能参与」「假设何种故障」「以什么作担保」上有着根本差异。按用途取舍才是关键。
| 方案 | 最终性 | 容错模型 | 可扩展性 | 典型例子 |
|---|---|---|---|---|
| PoW | 概率性(推翻概率递减) | 拜占庭容错(过半算力诚实) | 节点数无上限/吞吐低 | Bitcoin、早期以太坊 |
| PoS | 概率性+明确最终性并用 | 拜占庭容错(质押的 2/3 以上诚实) | 参与广泛开放/比 PoW 快 | 以太坊(The Merge 后)、Cardano |
| Paxos | 即时(多数派接受即确定) | 仅崩溃故障(n≥2f+1) | 数台〜十余台的集群 | Google Chubby、Spanner 系 |
| Raft | 即时(多数派复制即提交) | 仅崩溃故障(n≥2f+1) | 数台〜十余台的集群 | etcd(Kubernetes)、TiDB、CockroachDB |
| PBFT | 即时(commit 即确定) | 拜占庭容错(n≥3f+1) | O(n²) 通信,数十节点规模 | Hyperledger Fabric(早期)、Tendermint 系源流 |
| HotStuff | 即时(三链确定) | 拜占庭容错(n≥3f+1) | O(n) 通信,可达百节点规模 | Diem(LibraBFT)、Aptos |
相关学术文献汇总于参考文献页面。