目录
  1. 1. 一、共识机制概述
  2. 2. 二、PoW:Proof of Work,工作量证明
    1. 2.1. 2.1 SHA-256 挖矿原理
    2. 2.2. 2.2 难度调整机制
    3. 2.3. 2.3 51% 攻击与安全性分析
    4. 2.4. 2.4 PoW 的优缺点
  3. 3. 三、PoS:Proof of Stake,权益证明
    1. 3.1. 3.1 基本工作原理
    2. 3.2. 3.2 无利害关系问题(Nothing-at-Stake)
    3. 3.3. 3.3 Casper FFG(Friendly Finality Gadget)
    4. 3.4. 3.4 LMD GHOST 分叉选择规则
    5. 3.5. 3.5 PoS 的优缺点
  4. 4. 四、DPoS:Delegated Proof of Stake,授权权益证明
    1. 4.1. 4.1 工作流程
    2. 4.2. 4.2 投票权重
    3. 4.3. 4.3 BFT 共识组件
    4. 4.4. 4.4 DPoS 的优缺点
  5. 5. 五、PBFT:Practical Byzantine Fault Tolerance
    1. 5.1. 5.1 拜占庭将军问题
    2. 5.2. 5.2 三阶段协议
    3. 5.3. 5.3 视图变更(View Change)
    4. 5.4. 5.4 Checkpoint(检查点)
    5. 5.5. 5.5 PBFT 的复杂度与局限性
  6. 6. 六、Raft 共识算法
    1. 6.1. 6.1 核心机制
    2. 6.2. 6.2 领导者选举详解
    3. 6.3. 6.3 日志复制
    4. 6.4. 6.4 Raft 与 PBFT 对比
  7. 7. 七、共识算法对比总结
    1. 7.1. 7.1 安全性模型对比
    2. 7.2. 7.2 最终性对比
    3. 7.3. 7.3 共识算法的全景图
    4. 7.4. 7.4 选型建议
  8. 8. 八、新一代共识算法
    1. 8.1. 8.1 Tendermint 共识
    2. 8.2. 8.2 HotStuff 共识
    3. 8.3. 8.3 Avalanche 共识
    4. 8.4. 8.4 共识算法演进路线图
  9. 9. 九、深入理解最长链规则与分叉
    1. 9.1. 9.1 链重组(Chain Reorganization)
    2. 9.2. 9.2 自私挖矿策略
  10. 10. 十、共识机制的实际考量
    1. 10.1. 10.1 长程攻击(Long-Range Attack)
    2. 10.2. 10.2 活性与安全性的权衡
    3. 10.3. 10.3 共识机制的量子安全考虑
区块链———共识机制

区块链是一种去中心化的分布式账本,可以简单理解为分布在全球各个节点的分布式数据库,数据库由区块按时间顺序相连而成,区块中记录的是数笔交易。为了能支持这一套系统的运行,需要各节点矿工的参与,他们参与的主要原因是因为有奖励,奖励可以去交易所换成钱,他们这样参与的过程类似于挖矿,所以被称为”矿工”。矿工在什么样的规则下才会得到奖励,这样的规则在区块链中叫共识机制。以下是几种常见的共识机制。

一、共识机制概述

区块链中最重要的便是共识算法。比特币使用的是 PoW(Proof of Work,工作量证明),以太坊(2022 年合并后)使用的是 PoS(Proof of Stake,权益证明)。DPoS(Delegated Proof of Stake,股份授权证明)进一步削减算力浪费,同时加强了区块链的安全性。对于不需要货币体系的许可链或私有链,传统的一致性算法如 PBFT(实用拜占庭容错)、Paxos、Raft 等成为首选。

共识算法的核心目标:

  1. 一致性(Agreement):所有诚实节点对同一值达成一致
  2. 有效性(Validity):达成一致的值是由诚实节点提出的
  3. 容错性(Fault Tolerance):在一定数量的恶意/故障节点存在下,系统仍能正常工作
  4. 终止性(Termination):所有诚实节点最终做出决定(不无限等待)

FLP 不可能定理:在纯异步系统中,即使只有一个节点故障,也不存在确定性的共识算法。这解释了为什么实际系统要么使用同步假设(如 PBFT),要么使用概率性共识(如 PoW 的 Nakamoto 共识)。

CAP 定理中的共识:区块链共识算法本质上是在可用性(Availability)和一致性(Consistency)之间做权衡。PoW/PoS 倾向于可用性(最终一致性),PBFT 倾向于强一致性。


二、PoW:Proof of Work,工作量证明

PoW 是比特币的核心创新,由中本聪在 2008 年白皮书中提出。其核心思想是:节点通过解决计算难题来竞争记账权,谁先解出题目,谁就获得出块权利和奖励。

2.1 SHA-256 挖矿原理

比特币使用 SHA-256 哈希算法作为工作量证明的基础。挖矿的本质是寻找一个 nonce 值,使得区块头的双重 SHA-256 哈希值小于目标值(target)。

挖矿过程(伪代码):
1. 组装区块头: version + prev_block_hash + merkle_root + timestamp + bits + nonce
2. 计算: hash = SHA256(SHA256(block_header))
3. 判断: hash < target ?
是 → 成功出块,广播区块
否 → nonce++,回到步骤 1
import hashlib
import struct
import time

def sha256d(data: bytes) -> bytes:
"""双重 SHA-256 哈希(比特币的标准哈希)"""
return hashlib.sha256(hashlib.sha256(data).digest()).digest()

def mine_block(prev_hash: str, merkle_root: str, bits: int, max_nonce: int = 2**32):
"""
模拟比特币挖矿
bits: 难度目标(如 486604799 代表约 3.8T 难度)
"""
# 从 bits 计算 target
def bits_to_target(bits: int) -> int:
exponent = bits >> 24
mantissa = bits & 0xFFFFFF
return mantissa * (2 ** (8 * (exponent - 3)))

target = bits_to_target(bits)
version = 536870912 # BIP9 version
timestamp = int(time.time())

for nonce in range(max_nonce):
# 组装区块头(80 字节)
header = struct.pack(
'<I32s32sIII',
version,
bytes.fromhex(prev_hash)[::-1], # 小端序
bytes.fromhex(merkle_root)[::-1],
timestamp,
bits,
nonce
)
hash_result = sha256d(header)

# 判断是否小于 target
if int.from_bytes(hash_result, 'little') < target:
return {
'nonce': nonce,
'hash': hash_result[::-1].hex(), # 大端序显示
'header': header.hex()
}

return None # 未找到有效 nonce

# 难度公式:
# difficulty = genesis_target / current_target
# 其中 genesis_target 是创世区块的 target(最大值)
# 当前比特币网络难度约 80T+(2024年)

# 全网算力计算:
# 若难度 = D,则预期哈希次数 = D * 2^32
# 出块时间 = 预期哈希次数 / 全网算力

2.2 难度调整机制

比特币每 2016 个区块(约 2 周)调整一次难度,目标是维持 10 分钟的平均出块间隔。

难度调整公式:
new_target = old_target * (actual_time / 20160 minutes)

其中 actual_time 是过去 2016 个区块的实际时间
约束:
- 调整因子限制在 [1/4, 4] 之内
- 防止难度突变导致网络不稳定
def calculate_new_difficulty(prev_target: int, actual_time: int):
"""计算新的难度目标"""
EXPECTED_TIME = 2016 * 10 * 60 # 2016 个区块 × 10 分钟 = 20160 分钟

# 限制实际时间的范围(防止极端情况)
actual_time = max(EXPECTED_TIME // 4, min(EXPECTED_TIME * 4, actual_time))

new_target = prev_target * actual_time // EXPECTED_TIME

# target 不能超过最大 target(创世区块的 target)
MAX_TARGET = 0xFFFF * (2 ** 208)
new_target = min(new_target, MAX_TARGET)

return new_target

# 极端情况示例:
# 如果算力翻倍(actual_time ≈ 10080 分钟):
# new_target = prev_target * 10080 / 20160 = prev_target / 2
# 难度翻倍,维持出块速度

2.3 51% 攻击与安全性分析

51% 攻击是指攻击者控制了全网超过 50% 的算力,从而能够:

  1. 双花攻击(Double Spending):在一条链上进行交易后,生成一条更长的、不含该交易的链,使原始交易被回滚
  2. 拒绝服务(DoS):阻止特定交易被打包进区块
  3. 自私挖矿(Selfish Mining):隐藏区块,在适当时机释放以获得竞争优势

攻击成本估算:

攻击成本 = 算力成本 + 电力成本

以比特币为例(2024年估算):
- 全网算力 ≈ 600 EH/s(600 × 10^18 H/s)
- 控制 51% 算力需要 ≈ 306 EH/s
- Antminer S21 (200 TH/s) 单价约 $5000
- 所需矿机数:306 EH/s / 200 TH/s = 1,530,000 台
- 硬件成本:1,530,000 × $5000 ≈ $76.5 亿
- 日电力成本:约 $500 万
- 攻击一小时总成本:约 $7700 万

此外,51% 攻击会导致币价暴跌,攻击者持有的币也会贬值
这形成了经济上的反身性保护

最长链规则(Longest Chain Rule):所有节点默认跟随累计工作量最多的链(通常也是最长的链)。这条规则简单而有效,保证了在 PoW 网络中,只要诚实节点掌握超过 50% 的算力,诚实链最终会是最长的。

孤块(Orphan Blocks):当两个矿工几乎同时挖出有效区块时,网络会暂时分叉。最终其中一个区块会被多数算力接纳为主链的一部分,另一个被废弃的区块称为孤块。比特币的孤块率通常在 0.2-0.5%。

2.4 PoW 的优缺点

优点:

  • 安全性经过 15 年验证,是最成熟的共识机制
  • 去中心化程度高,任何人都可以参与挖矿
  • 经济模型清晰,物理算力提供客观的安全度量

缺点:

  • 巨大的能源消耗(比特币年耗电 ≈ 140 TWh,与阿根廷全国相当)
  • 出块速度慢(比特币 10 分钟,确认需要 6 个区块 ≈ 1 小时)
  • 算力趋于集中(矿池化)
  • 交易吞吐量低(比特币约 7 TPS)

三、PoS:Proof of Stake,权益证明

PoS 的核心思想是:验证者的投票权与其持有的代币数量(权益)成正比,而非计算的哈希数量。以太坊于 2022 年 9 月 15 日完成了”合并”(The Merge),从 PoW 正式切换到 PoS。

3.1 基本工作原理

PoS 流程:
1. 用户质押代币成为验证者(以太坊要求 32 ETH)
2. 每个 slot(12 秒),随机选出一个验证者提议新区块
3. 每个 slot,随机选出一个验证者委员会对区块进行投票
4. 如果区块获得超过 2/3 的投票,则最终确定(finalized)
5. 诚实验证者获得奖励,作恶验证者被罚没(slashing)

3.2 无利害关系问题(Nothing-at-Stake)

在早期的 PoS 设计中,验证者可以在多个分叉上同时投票且不存在成本(没有 PoW 那样的电力消耗),导致共识难以收敛。

解决方案 — 罚没(Slashing):

# 以太坊的罚没条件(伪代码)
class SlashingConditions:
def check_double_vote(self, validator, vote1, vote2):
"""同一验证者对同一 slot 的两个不同区块投票"""
if vote1.slot == vote2.slot and vote1.block != vote2.block:
return SlashingPenalty(validator)
return None

def check_surround_vote(self, validator, vote1, vote2):
"""环绕投票:一个投票被另一个投票的范围所包围"""
if (vote1.source_epoch < vote2.source_epoch and
vote1.target_epoch > vote2.target_epoch):
return SlashingPenalty(validator)
return None

class SlashingPenalty:
def apply(self, validator):
# 罚没金额(以太坊最低罚没 1 ETH,最高可达全部质押)
penalty = max(1, validator.effective_balance // 32)
validator.balance -= penalty
# 强制退出验证者集合
validator.exit()

3.3 Casper FFG(Friendly Finality Gadget)

Casper FFG 是以太坊的最终性确认机制,运行在 PoS 链之上,提供区块的绝对最终性。

Casper FFG 的核心概念:

1. Checkpoint(检查点):每个 epoch(32 个 slot)的边界区块
2. Justification(合理化):checkpoint 获得超过 2/3 验证者投票
3. Finalization(最终确定性):连续两个 epoch 的 checkpoint 都被 justified

最终确定的区块永远不可回滚,这是 PoS 相比 PoW 的关键优势。

状态转换:
- epoch 0: justified
- epoch 1: 投票 epoch 0-1 → justified, epoch 0 finalized
- epoch 2: 投票 epoch 1-2 → justified, epoch 1 finalized

3.4 LMD GHOST 分叉选择规则

LMD GHOST(Latest Message Driven Greedy Heaviest Observed SubTree)是以太坊使用的分叉选择规则:

LMD GHOST 算法(简化):
1. 从最新的 justified checkpoint 开始
2. 在每个 slot,选择获得最多验证者投票(按权重)的子区块
3. 递归执行,直到到达叶子区块
4. 返回的叶子区块即为链头

"Latest Message":每个验证者最近一次投票的权重
"Greedy Heaviest":始终选择投票权重最大的子树

这个规则确保在正常情况下,链会快速收敛,不会产生长期分叉。

3.5 PoS 的优缺点

优点:

  • 能源效率极高(能耗降低约 99.95%)
  • 出块速度快(以太坊 12 秒/slot)
  • 最终确定性:区块一旦 finalized 即不可回滚
  • 降低硬件门槛(普通电脑可运行验证者节点)

缺点:

  • “富者愈富”风险(大户拥有更大投票权)
  • 对初始代币分配敏感
  • 长程攻击:攻击者购买历史私钥重建伪造历史
  • 较 PoW 缺少 15 年的实战验证

四、DPoS:Delegated Proof of Stake,授权权益证明

DPoS 是 Dan Larimer(BitShares、Steem、EOS 的创始人)提出的 PoS 变体。持有代币的人投票选举出若干超级节点(见证人)代表他们进行区块生产和共识。

4.1 工作流程

DPoS 流程:
1. 代币持有者通过质押投票选举见证人(通常 21-101 个)
2. 见证人轮流出块(通常 3 秒一个区块)
3. 如果一个见证人错过出块,将被跳过
4. 见证人若作恶或不作为,可被投票罢免
5. 见证人获得区块奖励,通常会将部分分配给投票者

4.2 投票权重

投票权重 = 质押代币数量 × 质押时长(部分实现)

投票机制:
- 代理投票(Liquid Democracy):可以将票权代理给其他人
- 一票多投:1 个代币可以同时投给多个见证人(最多 30 个)
- 衰减投票:长时间不活跃的投票者权重逐渐降低

4.3 BFT 共识组件

EOS 的 DPoS 在见证人之间使用 BFT 共识实现区块的即时最终确认:

EOS 的共识管线:
1. 见证人轮流产生区块(Producer Schedule)
2. 每个区块需要 2/3 + 1 的见证人确认
3. 如果一个区块获得足够确认,即不可逆(irreversible)
4. 如果有见证人没有在 3 秒内出块,下一个见证人接替出块

确认时间:3 秒出块 × 2/3 确认 ≈ 45 秒(21 个见证人)

4.4 DPoS 的优缺点

优点:

  • 极高的交易吞吐量(EOS 可达数千 TPS)
  • 确认时间短(EOS 约 45 秒不可逆)
  • 代表制避免了全网的广播风暴
  • 通过投票机制进行社区治理

缺点:

  • 去中心化程度有限(21 个见证人容易被协同或贿赂)
  • 投票参与率低(普通持币者缺乏投票动力)
  • 寡头垄断风险(大节点长期垄断见证人位置)
  • 贿选和交易投票问题

五、PBFT:Practical Byzantine Fault Tolerance

PBFT(实用拜占庭容错)是 Miguel Castro 和 Barbara Liskov 在 1999 年提出的经典共识算法,能够容忍不超过 1/3 的拜占庭节点。

5.1 拜占庭将军问题

拜占庭将军问题的核心:多个将军(节点)需要通过信使(网络消息)达成一致的进攻或撤退决定。其中有些将军是叛徒(拜占庭节点),会发送错误信息。目标是:所有忠诚将军必须达成一致的决定。

模型假设:
- 总节点数: N
- 拜占庭节点数: f
- 条件: N >= 3f + 1
- 即最多容忍不超过 1/3 的拜占庭节点

直观理解:
- 假设有 3f+1 个节点
- 拜占庭节点可能不发送消息或发送错误消息
- 诚实节点需要至少 2f+1 个消息来达成多数
- 这样即使 f 个拜占庭节点捣乱,诚实节点之间仍有 f+1 的净优势

5.2 三阶段协议

PBFT 的共识过程分为 Pre-Prepare、Prepare、Commit 三个阶段:

视图 v 中的流程(主节点为 replica p = v mod N):

1. PRE-PREPARE 阶段:
- 客户端发送请求到主节点
- 主节点广播 <<PRE-PREPARE, v, n, d>, m> 到所有副本
(v=视图编号, n=序列号, d=消息摘要, m=原始消息)

2. PREPARE 阶段:
- 每个副本验证 PRE-PREPARE 的合法性
- 验证通过后广播 <PREPARE, v, n, d, i>
- 当副本收到 2f 个 PREPARE(加上自己的,共 2f+1)
→ 进入 PREPARED 状态

3. COMMIT 阶段:
- 处于 PREPARED 状态的副本广播 <COMMIT, v, n, d, i>
- 当收到 2f+1 个 COMMIT 消息
→ 执行请求,回复客户端

4. 客户端等待 f+1 个相同回复 → 确认结果

关键约束:
- 接收 PRE-PREPARE 的条件:副本未接受过同一 view 中另一个不同摘要的 n
- 通过 2f+1 的多数票确保安全性
- 即使 f 个节点是拜占庭的,仍有 f+1 个诚实节点提供了正确信息

5.3 视图变更(View Change)

当主节点故障或作恶时,PBFT 通过视图变更机制更换主节点:

视图变更流程:
1. 副本检测到主节点超时(未接收到新请求或未推动共识进程)
2. 发送 <VIEW-CHANGE, v+1, h, P, i> 消息
(h=最新稳定检查点序列号, P=该副本在 seq > h 的所有 prepared 消息集合)
3. 新主节点(replica (v+1) mod N)收集 2f+1 个 VIEW-CHANGE 消息
4. 新主节点广播 <NEW-VIEW, v+1, V, O> 消息
(V=收集到的 VIEW-CHANGE 消息集合, O=需要重新执行的未完成请求)

关键:确保视图变更后,新视图延续旧视图中已 prepared 的请求
——这是 PBFT 安全性的核心保障

5.4 Checkpoint(检查点)

为了减少状态存储和消息验证的开销,PBFT 使用检查点机制:

检查点协议:
- 每个副本定期创建稳定检查点(如每 100 个请求)
- 广播 <CHECKPOINT, n, d, i> 消息
- 当收到 2f+1 个相同检查点摘要 → 检查点被证明(stable checkpoint)
- 旧的请求日志和状态可以被清除
- View Change 消息只需要携带 stable checkpoint 之后的 prepared 请求

5.5 PBFT 的复杂度与局限性

好消息:
- 消息复杂度: O(N^2) — 每个阶段所有节点互相通信
- 延迟: 3 个消息轮次(不含客户端响应)
- 无需代币或算力投入

坏消息:
- 无法扩展到大量节点(通常 N <= 100)
- 对网络假设较敏感(半同步网络假设)
- 需要已知的固定的节点集合(许可链模型)
- 对拜占庭节点的容忍度有限(< 1/3)

实际应用:
- Hyperledger Fabric (早期版本)
- Tendermint 共识引擎(Cosmos 生态的基础)
- Zilliqa(公链,使用 PBFT 作为委员会共识)

六、Raft 共识算法

Raft 是一个为可理解性而设计的共识算法,适用于非拜占庭环境(节点不会恶意说谎,但可能 crash-fail)。

6.1 核心机制

Raft 的三项核心:

1. Leader Election(领导者选举):
- 节点状态:Follower → Candidate → Leader
- Leader 定期发送心跳(heartbeat)维持权威
- Follower 超时未收到心跳 → 变为 Candidate → 发起投票
- 获得多数票(> N/2)的 Candidate 成为 Leader
- 随机超时避免分票(split vote)

2. Log Replication(日志复制):
- Leader 接收客户端请求 → 追加到本地日志
- 广播 AppendEntries RPC 给 Followers
- 收到多数确认 → 提交(commit)→ 返回客户端
- Followers 在下次心跳中获知 commit index → apply 到状态机

3. Safety(安全性):
- 选举限制:Candidate 的日志必须至少和多数节点一样新
- 只允许 Leader 追加日志(不允许覆盖已有条目)
- 通过 term(任期)机制防止老 Leader 继续操作

6.2 领导者选举详解

任期(Term):
- 逻辑时钟,每个 term 最多一个 Leader
- 任期递增,所有 RPC 消息都携带 term
- 收到更高 term → 更新自己的 term,转为 Follower

选举过程:
1. Follower 超时(150-300ms 随机)→ 转为 Candidate
2. term++,投票给自己,发送 RequestVote RPC
3. 三种结果:
a. 获得多数票 → 成为 Leader
b. 其他节点成为 Leader → 收到其心跳 → 退回 Follower
c. 分票(split vote)→ 等待新一轮超时 → 重新选举
4. 随机超时是避免分票的关键设计

6.3 日志复制

日志条目结构: {term, index, command}

日志一致性保证:
- 如果两个日志条目在相同 index 有相同 term → 它们存储相同 command
- 如果两个日志条目在相同 index 有相同 term → 之前所有条目均相同
- AppendEntries RPC 携带 prevLogIndex 和 prevLogTerm:
- Follower 检查自己的日志是否匹配
- 不匹配 → Leader 回退一个 index 重试
- 匹配 → Follower 用 Leader 的日志覆盖该 index 之后的所有条目

提交(Commit):
- 当日志条目被复制到多数节点 → Leader 标记为 committed
- 之后所有节点的状态机按序 apply committed 条目
- Leader 的 committed index 通过心跳传播给 Followers

6.4 Raft 与 PBFT 对比

特征 Raft PBFT
容错类型 Crash-fault only Byzantine-fault (恶意)
最大容错数 < N/2 (ceiling) < N/3
消息复杂度 O(N) O(N^2)
领导者 强领导者 弱主节点
实现难度 中等
适用场景 联盟链、私有链 联盟链、部分公链
典型产出 etcd, Consul, Hyperledger Fabric (v1.4+) Tendermint, Zilliqa

七、共识算法对比总结

7.1 安全性模型对比

经济安全性(PoW/PoS):
- 依赖 51% 假设(算力/权益)
- 攻击有经济成本
- 安全性是概率性的

拜占庭容错安全性(PBFT/Tendermint):
- 依赖 1/3 假设(拜占庭节点比例)
- 攻击需要控制关键节点
- 安全性是绝对性的(finalized 即不可逆)

7.2 最终性对比

概率性最终性:
- PoW:6 确认 ≈ 1 小时(99.9% 概率不可逆)
- 最长链可能被重组(实际发生率极低)

绝对最终性:
- Casper FFG(以太坊 PoS):约 2 个 epoch ≈ 12.8 分钟
- PBFT/Tendermint:2-3 轮通信 ≈ 几秒
- 一旦 finalize,绝不可逆

7.3 共识算法的全景图

算法 类型 TPS 去中心化 最终性 代表项目
PoW (Nakamoto) 概率性 ~7 Bitcoin, Litecoin, Dogecoin
PoS (Casper) 概率性+确定性 ~30 ~13min Ethereum 2.0
DPoS BFT+选举 ~数千 ~1min EOS, TRON, BitShares
PBFT 经典 BFT ~数千 极低 即时 Hyperledger, Zilliqa
Tendermint BFT+PoS ~数千 即时 Cosmos Hub
HotStuff BFT ~数千 即时 Diem (Libra), Aptos, Sui
Avalanche 亚稳态 ~数千 即时(~1s) Avalanche
HoneyBadgerBFT 异步 BFT 即时 研究项目
Raft 非拜占庭 etcd, Fabric 排序服务

7.4 选型建议

选择共识算法时需考虑:
1. 网络类型:公链还是联盟链?
2. 节点信任模型:拜占庭环境还是 crash-fault?
3. 去中心化程度:节点数是千级、百级还是十级?
4. 性能需求:TPS、延迟、最终确定时间?
5. 安全预算:愿意付出多少安全成本(能源、质押)?

公链首推:PoS/Casper、Tendermint(兼顾安全性和可扩展性)
联盟链首推:PBFT、HotStuff(低延迟、高吞吐)
简单场景:Raft(易于理解和实现,无拜占庭威胁)

八、新一代共识算法

8.1 Tendermint 共识

Tendermint 是 Cosmos 生态的核心共识引擎,它结合了 PBFT 的安全性和 PoS 的去中心化经济模型:

Tendermint 共识流程(每轮):

1. Propose 阶段:
- 通过确定性算法选出一个 Proposer(按 voting power 轮转)
- Proposer 广播一个提议区块

2. Pre-vote 阶段:
- 每个验证者验证提议区块
- 验证通过 → 广播 PREVOTE 消息
- 等待收集 2/3+ PREVOTE → 进入下一阶段
- 超时或无效区块 → 广播 nil PREVOTE

3. Pre-commit 阶段:
- 收到 2/3+ 有效 PREVOTE → 广播 PRECOMMIT
- 收到 2/3+ PRECOMMIT → 区块被提交(committed)

4. Commit 阶段:
- 执行区块中的所有交易
- 更新状态根哈希
- 进入下一高度

超时处理:
- Propose 超时 → 发起新一轮(round++),换新 Proposer
- Pre-vote 超时 → 广播 nil PREVOTE
- Pre-commit 超时 → 发起新一轮

安全性保证:
- 每个高度只允许 commit 一个区块(同一 round 或不同 round)
- 锁定机制:验证者在某个 round 发了 PRECOMMIT 后,
在后续 round 不能对冲突的区块发 PREVOTE
- 验证者集合变更延迟到 2 个区块后生效

8.2 HotStuff 共识

HotStuff 是由 VMware Research 提出的 BFT 共识协议,被 Diem(原 Libra)、Aptos 和 Sui 采用。其核心创新是线性通信复杂度:

HotStuff 的三阶段(链式结构):

每个阶段产生一个 Quorum Certificate(QC,法定人数证书):
- PrepareQC:证明提议被接受
- PrecommitQC:证明进入锁定状态
- CommitQC:证明可以提交

关键特性:
1. 链式(Chained)设计:阶段之间通过哈希链接
2. 线性通信:Leader 收集投票(O(N)),不需要每个节点互相广播(O(N^2))
3. 流水线(Pipelined):一个提议在不同轮次中扮演不同阶段的角色
4. Pacemaker:独立的超时和领导者替换模块

与 PBFT 的对比:
- PBFT 消息复杂度:O(N^2)(每阶段全节点广播)
- HotStuff 消息复杂度:O(N)(投票→Leader→聚合→广播)
- 这使得 HotStuff 可以支持更多验证者(100+)

8.3 Avalanche 共识

Avalanche 是一种全新的共识协议族,基于亚稳态(metastable)机制,不使用传统的 BFT 投票或 PoW:

Avalanche 的四个核心机制:

1. Slush(单色共识):
- 节点随机采样 k 个邻居
- 如果 α 比例的邻居偏好不同于自己 → 切换偏好
- 重复直到稳定
- 特点:无状态,不记忆历史

2. Snowflake(添加记忆):
- 和 Slush 一样,但增加计数器
- 连续有多少轮偏好保持不变 → 计数递增
- 达到阈值 β → 接受该颜色(最终确定)

3. Snowball(增强置信度):
- 为每种颜色维护一个置信度计数器
- 每次都基于当前偏好进行查询
- 比 Snowflake 更鲁棒

4. Avalanche(有向无环图 DAG):
- 交易形成 DAG(而非线性链)
- 每个新交易引用多个祖先交易
- 通过有向投票决定冲突交易集合的接受顺序

核心优势:
- 亚稳态:没有领导者,没有委员会选举
- 高吞吐:数千 TPS,亚秒级最终确认
- 鲁棒性:对拜占庭节点的容忍度可参数化
- 无需质押锁定:验证者自由进出

8.4 共识算法演进路线图

2008  ── PoW (Bitcoin) ─── 去中心化共识的开端

2009 ── PBFT 形式化应用 ── 许可链共识

2013 ── Raft (etcd) ─── 非拜占庭共识

2014 ── DPoS (BitShares) ── 委托民主制

2016 ── Tendermint ── BFT + PoS 融合

2018 ── Casper FFG ── PoS 最终性叠加层

2019 ── HotStuff ── 线性复杂度 BFT

2020 ── Avalanche ── 亚稳态共识

2022 ── Ethereum Merge ── PoW→PoS 历史性转折

2023+ ── 分片共识、DAG 共识、零知识共识等前沿方向

九、深入理解最长链规则与分叉

9.1 链重组(Chain Reorganization)

当出现竞争分叉时,节点需要选择跟随哪条链。在 PoW 中,节点始终选择累积工作量最大的链:

场景:网络中出现两个有效的竞争区块(块 A 和块 B)

T=0: 两个矿工同时发现有效区块
Chain 1: ... → A
Chain 2: ... → B

T=1: 下一个区块被挖出
Chain 1: ... → A → X (矿工 power=51%)
Chain 2: ... → B → Y (矿工 power=49%)

Chain 1 累积难度 > Chain 2 → 网络收敛到 Chain 1
块 B 成为孤块,B 中的交易被重新放回内存池
块 Y 也被丢弃

重组深度:
- 1 区块重组:偶发(孤块率 ~0.3%)
- 2 区块重组:罕见
- 6+ 区块重组:极度罕见(视为不可能)

9.2 自私挖矿策略

自私挖矿是 PoW 中最重要的策略性攻击之一:

自私挖矿流程:
1. 自私矿工挖到区块后不立即广播,而是隐藏
2. 其他矿工在上一区块后继续挖矿
3. 自私矿工在其隐藏区块之后继续挖下一个区块
4. 当诚实矿工挖出区块时:
- 如果自私矿工已领先 2 个区块 → 立即广播,诚实矿工的区块作废
- 如果自私矿工只领先 1 个区块 → 同时广播竞争
- 如果自私矿工落后 → 放弃隐藏链,跟随诚实链

收益分析(理论结果):
- 如果自私矿工占算力 α > 33%,策略有利可图
- Eyal & Sirer (2014) 证明:α > 1/3 即可获超额收益
- 实际中,矿池之间的博弈使得自私挖矿较难实施

十、共识机制的实际考量

10.1 长程攻击(Long-Range Attack)

这是 PoS 独有的威胁——攻击者无需当前的大量权益,只需购买历史上持有大量权益的私钥:

攻击方式:
1. 从交易所或网络中获取已被出售的历史私钥
2. 因为私钥在历史上持有大量权益
3. 攻击者从 genesis 或早期 checkpoint 开始构建一条假链
4. 假链在早期有足够权益支持,看似合法
5. 新加入的节点可能接受这条更长的假链

防御方案:
- Weak Subjectivity(弱主观性):
新节点只接受最近 N 个 epoch 内 finalize 的 checkpoint
确保不会回滚到太远的过去
- 社交共识(硬分叉):
社区通过社交层协商决定正确的分叉
- Key-evolving Cryptography(密钥演化):
随时间自动更新验证者密钥

10.2 活性与安全性的权衡

CAP 定理视角下的共识算法设计:
- Consistency(一致性)— 所有节点看到相同的状态
- Availability(可用性)— 系统始终可处理请求
- Partition Tolerance(分区容错)— 网络分区时系统继续工作

PoW 链在网络分区时:
- 两个分区各自继续出块(可用性优先)
- 分区恢复后,较短的链被重组(一致性被推迟)

PBFT 链在网络分区时:
- 若某一分区没有 2/3+ 的节点 → 停止服务(一致性优先)
- 若某一分区有 2/3+ 的节点 → 该分区继续运行
- 分区恢复后,小分区自动同步大分区的状态

Tendermint 采用 BFT 安全模型:
- 1/3+ 验证者离线 → 链停止(牺牲活性,保证安全性)
- PoW/PoS 以太坊采用链增长优先策略(牺牲即时确定性,保证活性)

10.3 共识机制的量子安全考虑

量子计算对共识机制的威胁:

PoW (SHA-256):
- Grover 算法:搜索 nonce 的加速比 √N → 有效搜索空间减半
- 但 PoW 的竞争性质使所有人同步获益 → 相对安全性不变
- 仍然需要极大的量子比特数(数百万物理量子比特)

PoS (ECDSA/EdDSA 签名):
- Shor 算法:可能破解椭圆曲线密码学
- 需要迁移到后量子签名方案(如基于 Lattice 的签名)
- 以太坊已在规划后量子密码学升级路径

PBFT/类 BFT 共识:
- 核心共识逻辑不依赖密码学难题
- 仅消息签名可能受量子影响
- 替换签名算法即可升级

共识机制是区块链技术栈中最核心也最复杂的组成部分。从比特币的 PoW 开创了去中心化共识的先河,到以太坊的 PoS 实现了能源友好和最终确定性,再到 PBFT/Raft 在联盟链领域的广泛应用,共识算法的演进推动着整个区块链行业的发展方向。理解各种共识机制的优劣与适用场景,是做好区块链架构设计的基础。

文章作者: Leo·Cheung
文章链接: http://tufusi.com/2020/12/30/%E5%8C%BA%E5%9D%97%E9%93%BE-%E5%85%B1%E8%AF%86%E6%9C%BA%E5%88%B6/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ONE·PIECE
打赏
  • 微信
  • 支付宝

评论