← 返回预习计划
Module 02

Module 02: Distributed Systems & Consensus

CAP 定理、拜占庭将军、PoW 与 PoS——理解互不信任的节点如何达成一致

区块链是分布式系统的一个特例。不理解分布式系统的基本约束,就无法理解区块链为什么要这样设计——为什么出块需要等待、为什么交易确认不是即时的、为什么网络分叉是正常现象而不是 bug。

本模块覆盖分布式系统核心概念、CAP 定理、拜占庭容错,以及主流共识机制的工作原理和取舍。

上一模块思考题参考

Q: Hash 函数的抗碰撞性和单向性如何帮助 P2P 网络中的节点验证数据完整性?如果 Hash 函数可逆,共识机制会面临什么问题? 节点收到区块后独立计算其哈希值,与声称的哈希对比即可验证完整性,无需信任发送方。如果哈希可逆,攻击者可以从目标哈希值反推出伪造的区块内容,PoW 的计算难题将不复存在,任何人都能瞬间伪造合法区块。

Q: 在一个没有中心权威的网络中,数字签名如何让节点确认交易的发起者身份?如果没有非对称加密,去中心化系统能否运作? 每笔交易附带发送方的数字签名,任何节点用对应公钥即可验证——不需要询问任何权威机构。没有非对称加密,节点间必须预先共享密钥,这要求一个可信的密钥分发中心,本质上又回到了中心化架构。

Q: Merkle Tree 的 log₂(N) 验证复杂度对轻节点意味着什么?想象一个有百万笔交易的区块链网络,SPV 节点如何在不信任任何单一节点的前提下工作? 百万笔交易只需约 20 个哈希值即可验证任意一笔交易是否被包含。SPV 节点向多个全节点请求 Merkle proof,只要区块头链合法且 proof 数学上成立,就无需信任任何单一节点——安全性来自密码学而非信任。

分布式系统基础

架构模型

Client-Server 模型:客户端发请求,服务器处理并返回。简单直接,但服务器是单点故障(single point of failure)。传统数据库、Web 应用都是这个模型。

P2P 模型:所有节点既是客户端也是服务器,没有中心权威。BitTorrent 是经典例子,区块链网络也是。优势是抗审查、无单点故障;代价是协调成本高、数据一致性难保证。

区块链中的节点类型

  • 全节点(Full Node):存储完整区块链数据,独立验证所有交易和区块。Bitcoin Core 就是全节点软件。
  • 轻节点(Light Node / SPV):只存储区块头,通过 Merkle proof 验证交易是否被包含在某个区块中。手机钱包通常是轻节点。
  • 矿工/验证者节点:全节点 + 参与出块(PoW 中挖矿,PoS 中验证)。
  • 归档节点(Archive Node):存储所有历史状态,不仅是当前状态。Ethereum 归档节点超过 12TB。

网络拓扑

区块链采用非结构化 P2P 网络(unstructured P2P)。每个节点连接若干邻居节点(Bitcoin 默认 8 个出站连接),消息通过 gossip 协议传播:收到新交易或新区块后,转发给所有邻居。

这种设计的关键特性:

  • 没有全局广播,消息传播需要时间(Bitcoin 网络中一个区块传播到 95% 节点大约需要几秒)
  • 节点随时可以加入或离开
  • 网络可能出现分区(partition)——部分节点之间暂时无法通信

CAP 定理

2000 年 Eric Brewer 提出,2002 年被形式化证明:一个分布式系统不可能同时满足以下三个性质,最多只能满足两个。

性质含义
Consistency(一致性)所有节点在同一时刻看到相同的数据
Availability(可用性)每个请求都能得到非错误响应(不保证是最新数据)
Partition Tolerance(分区容忍)网络分区发生时系统继续运行

在现实网络中,分区不可避免(路由器故障、海底光缆中断、DDoS 攻击),所以 P 是必选项。剩下的选择就是 C 和 A 之间的取舍。

区块链的 CAP 选择

Bitcoin 选择了 AP——可用性 + 分区容忍,牺牲强一致性。

具体表现:

  • 网络分区时,两边各自继续出块(可用性保持)
  • 分区恢复后,较短的链被丢弃,相关交易回滚(一致性是最终一致,不是即时一致)
  • 「6 个确认」规则本质上就是在等待最终一致性收敛

Ethereum 2.0 引入 finality 后情况更复杂:一个 epoch(32 个 slot,约 6.4 分钟)内如果超过 2/3 验证者投票确认,区块获得最终性(finalized),不可回滚。这是在 AP 基础上增加了确定性一致性的层。

传统金融系统(银行转账)通常选 CP——一致性 + 分区容忍,牺牲可用性。网络出问题时宁可拒绝服务,也不允许数据不一致。

拜占庭将军问题

1982 年 Lamport 等人提出的思想实验:

几支拜占庭军队围攻一座城市。将军们需要就「进攻」或「撤退」达成一致。他们只能通过信使通信。问题在于:部分将军可能是叛徒,会发送矛盾的消息——对 A 说「进攻」,对 B 说「撤退」。

核心约束:忠诚的将军必须达成一致的行动方案,即使存在叛徒。

结论:如果有 f 个叛徒,至少需要 3f+1 个将军才能达成共识。换句话说,系统能容忍不超过 1/3 的节点作恶。

为什么这对区块链重要

区块链网络中的节点互不信任,任何节点都可能作恶(发送虚假交易、篡改区块)。这就是拜占庭环境。区块链的共识机制本质上就是对拜占庭将军问题的不同解法:

  • PBFT 直接遵循 3f+1 的理论下界
  • PoW 通过计算代价让作恶变得昂贵,将拜占庭容错转化为经济学问题
  • PoS 通过抵押资产实现同样的效果

共识机制

PoW(Proof of Work)—— Bitcoin

工作原理:矿工反复计算区块头的哈希值(改变 nonce),直到找到一个小于目标值的哈希。找到的矿工获得出块权和区块奖励。

难度调整:Bitcoin 每 2016 个区块(约两周)调整一次难度,保持平均 10 分钟出一个块。全网算力翻倍,难度也翻倍。

安全模型:攻击者需要控制超过 50% 的算力才能持续产生最长链(51% 攻击)。对 Bitcoin 而言,这意味着需要超过全球所有 Bitcoin 矿机的总算力——经济上不可行。

优势劣势
去中心化程度高,任何人可参与能耗巨大(Bitcoin 年耗电约 150 TWh)
经过 15 年实战检验吞吐量低(Bitcoin 约 7 TPS)
Sybil 攻击抵抗力强矿池集中化削弱去中心化

PoS(Proof of Stake)—— Ethereum 2.0

工作原理:验证者抵押 ETH(最低 32 ETH)获得出块和验证资格。每个 slot(12 秒)随机选一个验证者提议区块(proposer),委员会成员投票确认(attester)。

惩罚机制(Slashing):验证者有以下行为会被罚没部分或全部抵押金:

  • 同一 slot 提议两个不同区块(equivocation)
  • 投票支持矛盾的区块

验证者选择:通过 RANDAO(基于验证者提交的随机数混合)实现伪随机选择,抵押越多被选中概率越高,但不是线性关系。

优势劣势
能耗降低 99.95%(Ethereum 合并后)富者愈富(抵押越多收益越高)
经济惩罚使攻击成本明确可量化「Nothing at Stake」问题需要额外机制解决
最终性明确(finalized 后不可逆)初始代币分发影响去中心化程度

PBFT(Practical Byzantine Fault Tolerance)

工作原理:1999 年 Castro 和 Liskov 提出。需要 3f+1 个节点容忍 f 个恶意节点。共识过程三轮消息传递:

  1. Pre-prepare:主节点(leader)广播提案
  2. Prepare:每个节点收到提案后广播 prepare 消息,收集 2f+1 个 prepare
  3. Commit:节点广播 commit 消息,收集 2f+1 个 commit 后执行

通信复杂度:O(n²),每轮每个节点要向其他所有节点发消息。节点数超过几十个后性能急剧下降。

优势劣势
交易最终性即时确定不适合大规模开放网络(通信开销 O(n²))
吞吐量高(节点数少时)节点数量固定,需要准入机制
理论基础坚实主节点是性能瓶颈

应用:Hyperledger Fabric(联盟链)、早期 Tendermint。适合已知参与者的许可链场景。

DPoS(Delegated Proof of Stake)

工作原理:代币持有者投票选出固定数量的代表(delegates/witnesses),由这些代表轮流出块。类似代议制民主。

EOS 选 21 个超级节点,TRON 选 27 个。

优势劣势
吞吐量高(出块节点少,协调快)去中心化程度低
普通用户可通过投票参与治理容易形成卡特尔(节点间互投)
出块速度快(EOS 0.5 秒)投票参与率低导致少数人控制

区块链中的数据一致性

分叉(Fork)

两个矿工几乎同时找到有效区块,网络暂时存在两条等长的链。这是正常现象,不是攻击。

处理方式:节点遵循「最长链规则」(Bitcoin)或「最重链规则」(Ethereum),等后续出块打破平衡。被抛弃的区块称为孤块(orphan block)或叔块(uncle block),其中的交易需要重新被打包。

最终性(Finality)

概率性最终性(Probabilistic Finality):Bitcoin 模式。交易被逆转的概率随确认数指数下降,但理论上永远不为零。6 个确认(约 1 小时)后逆转概率低于 0.1%。

确定性最终性(Deterministic Finality):PBFT 和 Ethereum 2.0(finalized epoch)模式。一旦共识达成,交易不可逆转,除非超过 1/3 的节点作恶。Ethereum 中 finalized 的区块要被回滚,攻击者至少损失数十亿美元的抵押金。

两种模式的核心区别:概率性最终性延迟低但有不确定性;确定性最终性需要更多通信轮次但结果确定。这直接影响应用设计——交易所要求多少个确认才入账,就是在这个框架下的风险决策。

推荐资源

资源类型链接
MIT 6.824 分布式系统(Robert Morris)视频课程YouTube 播放列表
Bitcoin 白皮书第 4-5 节(Proof of Work / Network)论文bitcoin.org/bitcoin.pdf
Ethereum PoS 文档官方文档ethereum.org/developers/docs/consensus-mechanisms/pos
Practical BFT(Castro & Liskov, 1999)论文pmg.csail.mit.edu/papers/osdi99.pdf
Lamport「拜占庭将军问题」原始论文论文lamport.azurewebsites.net

思考题

  1. 共识机制保证所有节点对交易顺序达成一致——这对智能合约的执行意味着什么?如果不同节点以不同顺序执行合约调用,会发生什么?
  2. 当一个智能合约在执行过程中调用了另一个合约(外部调用),共识机制需要保证什么?这种合约间的调用会带来什么新的复杂性?

下一步

Module 03 进入智能合约——在理解了节点如何达成共识之后,下一个问题是:共识确认的到底是什么?答案是状态转换,而智能合约定义了状态转换的规则。前往 Module 03: Smart Contracts 继续。

动手练习