高吞吐公链的论文里经常同时出现两个名字:Narwhal 和 Bullshark。一个管内存池,一个管共识,合起来代表了一条越来越主流的路线——把交易传播和顺序裁决拆开,共识不再对交易本身投票,只对一张由承诺构成的有向无环图投票。本文按两篇论文(arXiv 2105.11827 与 2201.05677)的记载讲清这套结构怎么运转、顺序从哪里被提取出来。
先讲直觉:传统共识把两件事捆在一起出了事故
拜占庭容错共识的经典做法,是把交易打包进提案,让验证者对提案投票。交易体积大,广播一次就要花掉全网带宽的大头,而共识投票又要在这堆重物上反复做,吞吐先被交易传播卡住,再被投票轮次卡一次。Narwhal 的解法是把两者解耦:交易根本不走共识的广播通道,而是由每台验证者的工作机(worker)持续向全网流式推送小批交易;共识层只传播轻得多的区块,里面装的只是一批批交易承诺的哈希。论文把这层抽象叫 DAG 式内存池——验证者各自建块、互相引用上一轮块,天然叠成一张按轮次分层的有向无环图,图本身在异步网络下就保证:只要你看到了某个块,对应交易批至少在一个诚实节点手里可取回。每个块要拿到 2f+1 份对等节点的确认,合成一个可用性证书,才能宣告这一轮的块成立。
顺序从哪里被提取出来

图建好了,谁说了算?Bullshark 的答案是:不需要额外的投票通信,顺序直接从图的边里读出来。协议把轮次交替标记为领导者轮和普通轮;每个领导者轮指定一个确定性的领导者,其块叫锚。诚实节点引用某个块时,按协议规则优先链接到上一领导者轮中自己已见过、且获得 2f+1 个块引用的最高锚——于是引用关系形成支撑链。当某轮积累的引用让一个锚拿到 2f+1 个块的支撑,按论文的引理,任何后续合法集合都绕不开这个交集,该锚连同更早一轮的锚一起被提交。两个锚之间所有被支撑可达的块,按轮次与验证者编号的确定规则全序排开,块里承诺的交易批按序取出,这就是这一段的最终顺序。论文对安全性的核心论证正是集合交集论证:任意两个 2f+1 大小的集合必然包含同一个诚实验证者的块,攻击者想让两个节点提交不同的锚,就必须让诚实块同时出现在矛盾的支撑里,而这在 f 台拜占庭机的预算下做不到。
快速路径与慢速回退
Bullshark 论文强调自己是第一个针对常见同步场景优化的 DAG 原子广播协议:网络顺畅时,一个锚很快拿到足够支撑,付款经历少数几轮就沉底,这条顺畅通道叫快速路径。网络异步或领导者不活跃时,支撑链可能一时接不上,协议不引入传统那种复杂的视图更换机制,而是沿图中更早的锚向下检查是否存在满足提交条件的支撑结构,作为慢速回退;论文列举了锚缺少足够引用、诚实节点落后于当前轮次等触发场景。无论走哪条路,安全性都不依赖网络假设——这正是 DAG 路线的卖点:活性看网络脸色,安全永远看集合交集。
这套拆分改变了什么
回到工程账本:交易批量传播与共识轮次解耦后,带宽主要花在流式批上传,共识消息只剩承诺和引用,通信复杂度接近最优;因为每个诚实块的可用性都有 2f+1 证书背书,单点排序器拒收交易的审查压力也被结构性削弱——任何一台诚实 worker 收到交易,最终都会被拉进图里。值得留意的边界同样清楚:批的可用性证书只保证数据可得,不代表已被排序;引用规则与轮次参数的细节散落在论文与不同实现里,落地前应以对应论文版本和具体实现的文档为准。本文是协议机制说明,不构成任何投资或选型建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。