故事
长安城里有个老规矩,叫"热座"。
每年冬至,三省六部二十四司的长官要聚在政事堂,议定来年钱粮。议事的法子很怪:堂上只摆一把椅子,铺了厚厚的毡垫,烧着炭火——这叫"热座"。谁坐上去,谁就是这一日的"主议",旁人只能站着说话。主议听完各方陈述,独自拟旨,当场用印。一日事毕,椅子空出来,次日寅时,众人再抢。
抢座的规矩也怪。不是比拳头,是比谁先把"愿承此任"四个字写到堂前的石碑上。石碑很大,能容百行,但主议只有一个。于是每回抢座,石碑上密密麻麻写满名字,真正坐上去的却只有一个。其余人写的字,白写。
更磨人的是,主议坐上去之后,不能立刻发号施令。他得先让二十四司长官逐一画押,确认"我认你坐这把椅子"。这二十四轮往返,一日过去大半。等画押齐了,主议才开始拟旨。拟完还得再跑一轮画押,确认"我认你拟的这道旨"。一日能议完一件事,就算快的。
元和年间,裴度当宰相,觉得这规矩蠢得厉害。他算了一笔账:抢座时百人写石碑,是平方级的混乱;坐上去后两轮画押,是线性级的拖沓。前者靠运气,后者靠耐心,两样都费时间。
裴度改了规矩,只改两处。
第一处:抢座不再写石碑。 裴度在政事堂门口挂了一只铜铃,铃下悬一根绳,绳头系着一枚玉牌,上刻"主议"二字。寅时一到,众人齐聚,谁第一个握住玉牌不松手,谁就是主议。铜铃只响一声,众人同时伸手,但总有一人手最快、握最紧——这一瞬的先后,肉眼可分,不必写满石碑再慢慢数。裴度把这叫做"三消息定座":众人伸手(一)、铃响示众(二)、握牌者昂然入堂(三)。三声消息,主议已定,从无争执。
第二处:画押只画一轮。 旧规矩里,主议先收"认座"押,再收"认旨"押,两轮各二十四。裴度把它们叠成一轮:主议拟旨之后,直接把旨稿和座牌一起送出去,众官画一次押,等于同时认了"此人坐得此座、此旨出得此人"。若有人不画,主议便知道是谁不服,只找那一个人理论,不必再跑满堂。
新规矩实行的第一年,政事堂一日能议三件事。裴度死后,规矩传下去,又经后人修补:玉牌加了磁扣,握上去便吸住手掌,防人假装握了其实没握;炭火改成地暖,椅子永远是热的,不必等烧。但骨架没变——三消息定座,一轮画押成事。
—
裴度的"三消息定座",在算法里叫 HotStuff(Yin et al., 2019)。
PBFT([✓#3 守夜人])的视图变更换主,需要三阶段提交(pre-prepare、prepare、commit),每阶段都是全网广播,消息复杂度 O(N²)。二十四个司长官,每轮每人都要给其余二十三人发消息确认,一轮下来五百多条消息在堂上乱飞。HotStuff 把它压成 O(N):领导者(主议)只向所有副本广播一次,副本们把投票直接回给下一个潜在的领导者,而不是互相广播。消息像一条链子,从旧主递到新主,不炸成漫天星。
更关键的是,HotStuff 把"选主"和"提交"流水线化了。PBFT 里,一个视图(view)内做完一整轮共识,再换下一个视图;HotStuff 里,领导者可以在前一个提案的 commit 阶段同时发起下一个提案的 prepare。裴度的"一轮画押叠两轮",正是这个意思:认座和认旨不必拆开,前一个旨的收尾和后一个旨的开头可以交叠。只要链子在转,椅子永远是热的——所以叫 HotStuff。
这个流水线结构让 HotStuff 成为第一个把领导者轮换做得和正常共识一样便宜的 BFT 协议。之前的协议换主像换引擎,得停车、拆盖、重装;HotStuff 换主像接力赛跑,递棒子在奔跑中完成。Diem(原 Libra)区块链的共识层 BFT-Smart、Flow 区块链的共识核,都直接用了 HotStuff 的骨架。
但裴度没解决的那个问题,HotStuff 也没解决:三消息定座,定的是"谁先伸手",不是"谁该伸手"。如果握牌的人其实是个篡位的,铜铃照响,他照样昂然入堂。HotStuff 假设网络是部分同步的、恶意节点不超过 f = (N-1)/3,在这个假设内它能保证安全;假设破了,三消息定座定出来的可能就是乱臣贼子。这是所有 BFT 共识的边界,不是 HotStuff 独有的缺陷。
裴度死后三十年,热座规矩散入民间,变成茶馆里的一种游戏。茶博士摆一把椅子,烧一壶滚水,众人抢座沏茶。老茶客说,这游戏的妙处不在坐,而在看——看那只铜铃几时响、那根绳子几时颤、那只手几时握住玉牌。三消息之间,毫秒之差,便是主议与闲人的分野。有人把这叫做"可感知的共识":不必等石碑刻满、不必等画押收齐,一瞬间的先后,所有人同时看见,同时承认。
后来有个年轻人,在茶馆里看了三年热座,写了一份帖子,说这世上所有复杂的议事规矩,归根到底都是在回答两个问题:谁说了算、说了算之后怎么让大家认。裴度的答案是把两个问题的答案压进同一轮动作里——握牌即定座,定座即拟旨,拟旨即画押。帖子最后一句说:椅子永远是热的,不是因为炭火,是因为下一个人已经在握绳子了。
概念解析
HotStuff 是 2019 年由 Yin 等人提出的拜占庭容错共识协议,核心贡献是线性消息复杂度和流水线化的领导者轮换。
线性复杂度。 PBFT 的三阶段提交中,每个阶段都是全网广播,消息量 O(N²)。HotStuff 改成星型拓扑:当前领导者向所有副本广播提案,副本把投票直接发给下一个视图领导者,而不是互相广播。全网消息总量从 N² 降到 2N-2,随节点数线性增长。
流水线化。 HotStuff 把共识的四个阶段(new-view、prepare、pre-commit、commit)设计成可以交叠执行:第 k 个区块的 prepare 可以和第 k-1 个区块的 pre-commit、第 k-2 个区块的 commit 同时进行。领导者轮换(view-change)被嵌入这个流水线,不必中断正常提交——换主像接力递棒,系统不停机。
Chained HotStuff。 这是 HotStuff 的工程变体,把每个视图的提案串成一条链,进一步简化实现。DiemBFT、Flow 的共识核都基于这个变体。链式结构让每个区块自带"前一个区块已提交"的隐含确认,省掉显式的 commit 阶段。
与 PBFT、Raft 的关系。 PBFT([✓#3 守夜人])解决"有叛徒时怎么共识",代价是 O(N²) 消息和昂贵的换主;Raft([✓#6 传灯人])解决"无叛徒时怎么高效共识",代价是不防拜占庭故障。HotStuff 把两者的优点嫁接:像 PBFT 一样容忍 f < N/3 的恶意节点,像 Raft 一样保持线性消息和简单换主。它是目前生产环境 BFT 共识中工程化程度最高的方案之一。
"热座"的隐喻。 椅子永远是热的,因为共识的流水线让领导者轮换不再是特殊事件,而是正常流程的一部分。前一个主议的尾巴,就是下一个主议的开头——系统不需要"冷却期"来整理状态,状态在流动中自然交接。