凡是把 BFT 类算法(无论是经典 PBFT,还是现代的 HotStuff、DiemBFT、Grandpa、Casper FFG 等)当作核心 fork choice 机制的链,无论它多么大声喊自己是公链,本质上都是一条联盟链。
作者:魏文侯
引言
在现在的 Web3 世界里,人们常常把 “公链” 和 “BFT” 绑死在一起,仿佛只要用了 PBFT、HotStuff、CometBFT、Casper 等一众拜占庭容错算法,就能理直气壮地宣称自己是 “去中心化的公链”。
本文要揭露一个残酷却逻辑自洽的事实:
凡是把 BFT 类算法(无论是经典 PBFT,还是现代的 HotStuff、DiemBFT、Grandpa、Casper FFG 等)当作核心 fork choice 机制的链,无论它多么大声喊自己是公链,本质上都是一条联盟链。
拜占庭将军问题的真正含义
1982 年 Lamport 那篇论文的核心只有一个:
在存在任意类型故障(包括恶意说谎)的将军群中,如何保证忠诚的将军们就同一个行动方案达成一致,避免一部分进攻、一部分撤退导致全军覆没。
论文证明了:只要恶意节点不超过 1/3,通过多轮可认证的消息交互,所有忠诚将军最终一定能收到同一个一致的命令(进攻或撤退)。
关键在于:
Lamport 老爷子从来没说过 “该进攻还是该撤退” 应该由算法决定。
算法只负责把 “某个已经存在的主观决定” 安全、无歧义地传递给所有人,它解决的是 “一致性传播” 问题,而不是 “该做出什么决定” 这个前置问题。
换句话说:
BFT 的前提是已经有了一个主观决定(进攻/撤退),它只管把这个决定防篡改地广播出去。
它根本不负责产生这个决定,也不负责判断这个决定是对是错。
区块链把 BFT 用错了地方:把它当成了 fork choice 本身
比特币之前根本不存在 “区块链” 这个概念,自然也没有人把 BFT 拿来做 fork choice。
比特币的伟大发明在于:它把 fork choice 彻底客观化了——
哪条链累计了最多的不可伪造、不可逆的物理成本(PoW),哪条链就是正统。
每个人抬头看累计难度就知道该跟谁走,根本不需要互相发消息投票。
而所有依赖 BFT 的所谓 “公链” 干了什么事?
它们把 “该进攻还是撤退” 这个本该由客观物理成本决定的前置问题,硬生生塞给了 BFT:
- 先定义一个有限的验证者集合(不管是 100 个还是 10 万个,本质都是有限可识别的 “将军团”)
- 让这群将军投票决定 “哪条链是正统”(即进攻还是撤退)
- 用 BFT 算法保证投票过程不脑裂(不超过 1/3 作恶就不会出现两条链都拿到 2/3 签名)
这完全是本末倒置。
公链的 fork choice 根本不应该依赖任何主观投票,它应该像比特币一样,靠客观、可独立验证、难以逆转的物理成本说话。
为什么 PoS 等非 PoW 共识几乎都得抱 BFT 大腿?因为没有客观锚定
PoW 之所以能彻底摆脱 BFT,是因为它有最硬的客观锚定:烧电。
你想让我跟你的分叉?请拿出比当前主链更多的电费单据给大家看,全世界都能独立验证。
PoS 没有这种物理成本,质押的币本身就是链内数据,可以同时在两条分叉上使用(nothing at stake)。
即使你设计再复杂的罚没规则,罚没本身也需要先达成共识才能执行——陷入死循环。
于是只能退而求其次:
设计各种 “最重链”“最新 justified 块” 等启发式规则 → 再叠加一层层 BFT 投票来提供最终性。
它们不是因为 BFT 更高级才用 BFT,而是因为没有客观锚定,只能靠主观投票来模拟客观性。
惩戒机制彻底无用:永远不知道该站哪一边
很多人说:“PoS 有罚没啊,作恶会被 slash,BFT 链不怕长程攻击!”
错得离谱。
真正致命的问题不是 “同时在两条链签名会被 slash”,而是合法的 2/3 倒戈本身就是允许的:
- 第 1 个月,验证者集合的 2/3 投票认定 A 链是主链,B 链是少数派 → B 链上的签名者可能被 A 链罚没
- 第 2 个月,验证者集合换了一批人/被收买/被威胁,又有新的 2/3 投票认定 B 链才是主链 → 现在轮到 A 链上签名的人被罚没
- 第 3 个月,又倒回去……
这就是典型的 “攻击合法化”:只要你每次都能拉到 2/3 的票,你就可以名正言顺地改写历史、没收异己。
而普通用户和轻节点永远搞不清 “到底该跟哪一波 2/3”,因为两波人都声称自己代表了 “社区共识”。
惩戒机制在这种场景下完全失效——它只会变成胜利者对失败者的秋后算账工具,永无止境。
这不就是现实中的政治斗争吗?今天议会 2/3 通过法案没收你的财产,明天新议会 2/3 推翻上一届决定再把支持者送进监狱……
你作为一个老百姓,永远不知道该站哪一边才安全。
结语:没有北极星的船,注定在海上打转
真正的公链像大航海时代的水手,大家都朝着北极星(累计难度)航行:
北极星位置固定、任何人都能独立验证、谁也改不了。即使船队暂时走散,最终也必然抵达同一片大陆,期间完全不需要互相投票 “现在该往哪开”。
而 BFT 类 “公链” 把水手扔到没有星空的太平洋上:
“大家投票决定方向吧!我们用最先进的 BFT 算法保证投票过程不脑裂!”
→ 第 1 个月 2/3 票往东 → 全队往东
→ 第 2 个月 2/3 票往西 → 全队掉头往西
→ 第 3 个月又有人倒戈……
方向永远是相对的、暂时的、可推翻的。
船只会在海上无限漂流,永远到不了任何目的地。
只要你的 fork choice 核心依赖 BFT 投票,那你就已经不是公链了——
你只是把联盟成员名单从 Excel 表格搬到了链上,本质无二。
北极星才是公链,投票永远只是联盟链的遮羞布。
免责声明:作为区块链信息平台,本站所发布文章仅代表作者及嘉宾个人观点,与 Web3Caff 立场无关。文章内的信息仅供参考,均不构成任何投资建议及要约,并请您遵守所在国家或地区的相关法律法规。




