从“乱传”到“聪明传” :WFR-Gossip 给 Gossip 网络开了一剂数学强心针
传统 Gossipsub 协议会在网络中泛滥传播大量重复消息,浪费带宽。而 Wasserstein-Fisher-Rao(WFR)Gossip 协议通过将消息传播视为一个“最优传输问题”,优先沿低延迟链路转发消息,从而解决了这一问题。
作者 | Thomas Thiery
感谢 Léonard Monsaingeon、Caspar Schwarz-Schilling、Julian Ma、Anders Elowsson、Raúl Kripalani、Yann Vonlanthen、Csaba Kiraly 和 Marco Munizaga 对本文早期版本提供的宝贵反馈和评论。
🔗 原文链接:https://ethresear.ch/t/the-paths-of-least-resistance-introducing-wfr-gossip/22671
摘要
传统 Gossipsub 协议会在网络中泛滥传播大量重复消息,浪费带宽。而 Wasserstein-Fisher-Rao(WFR)Gossip 协议通过将消息传播视为一个“最优传输问题”,优先沿低延迟链路转发消息,从而解决了这一问题。在一项包含一万个节点的模拟实验中,WFR-Gossip 将带宽使用减少了约 50%,延迟改善了 40%,同时维持了 95%以上的网络覆盖率。
引言
Gossipsub [1] 基于一个简单而巧妙的原理运作:对于每个话题(topic),每个节点会维护一组称为“mesh”的固定邻居(在以太坊中通常为 8 个节点)[2]。当某节点接收到一条新消息时,它会将完整消息转发给所有 mesh 中的节点。为了发现自己可能错过的消息,节点还会向 mesh 之外的其他邻居传播消息元数据(例如:“我看到了消息 X”)。这种设计对于冗余和抗审查性非常有利,但它也带来了隐藏的代价。
这个代价就是低效。在密集网络中,这种设计会导致大量重复消息的产生 [3]。虽然现实网络中的数据显示,一个典型节点在收到一个信标区块时,通常会看到中位数为 5 次的重复消息,但长尾情况才真正显示了网络的负担:最不走运的 5%~10% 的节点可能会收到同一个区块 12 到 16 次甚至更多。在过去,这种取舍是可以接受的:带宽成本相对较低,而且协议整体可用。但如今,随着传播数据量的激增和传播时间窗口的缩短,带宽已不再是一个“隐形成本”,它的低效正在成为扩展性的首要瓶颈。
于是问题变成了:我们是否可以设计一种更“聪明”的 Gossip 协议,同时保留 Gossipsub 的去中心化和稳健特性?答案是肯定的,而且出乎意料地来自数学中的一个分支:最优传输理论(Optimal Transport)[4]。
从随机性到物理学视角
当前点对点网络设计的核心局限,在于将 gossip 看作一种本质上随机的过程。节点将消息转发给其邻居,这些邻居再转发给它们的邻居,最终整个网络都收到消息。
但如果我们不再把它看作一个通信问题,而是把它看作一个物理分布问题,会怎样?
想象一下,某条消息就像一堆沙子,最初堆积在一个节点上。目标是:将这堆沙子中的一粒,传送给网络中每个其他节点。在此过程中,从一个节点向另一个节点“运送沙子”的代价,就是它们之间的连接延迟。那么,如何以最小代价完成这一分发任务?
这正是“最优传输理论”200 多年来所研究的问题核心。该理论提供了一个数学框架,用于寻找将一种质量分布(例如:整堆沙子集中在节点 A)转换为另一种分布(例如:每个节点都有一粒沙子)所需的最小成本计划。
这提示我们:与其根据固定或半随机规则来转发消息以保证传播鲁棒性,不如让节点根据最小化全局传输成本来做出传播决策。
但要实现这一点,还有一个关键问题尚未解决:标准最优传输假设“沙子总量守恒”,而 Gossip 协议的本质却是不断复制消息并丢弃重复项,这与传统的最优传输框架并不一致。
非平衡最优传输:使用 Wasserstein-Fisher-Rao(WFR)距离
在这里,现代数学工具——非平衡最优传输(Unbalanced Optimal Transport)就派上了用场,具体来说是一种度量方式,称为 Wasserstein-Fisher-Rao(WFR)距离。
简而言之,WFR 能够在允许“移动质量”的同时,也允许“生成”或“消除”质量(每种操作都伴随一定成本)的前提下,计算两个状态之间最有效率的变化路径。
这与点对点网络中遇到的情境完美对应:
移动质量 = 通过某条延迟链路转发一条消息;
生成质量 = 节点复制一条消息包以进行转发;
消除质量 = 节点接收到重复消息并将其丢弃(去重)。
这意味着我们现在拥有了一个可以真实建模 Gossip 网络物理行为的数学工具。
WFR-Gossip 的目标可以形式化地表达如下:在每一步中,每个节点的行为都应使网络中消息的整体分布状态沿着 WFR 度量下“最陡峭”的路径朝向最优的均匀分布状态演进。我们可以把这个过程看作是一种“梯度流”(gradient flow)。
在任意时刻 t,系统的整体“能量”状态可由以下方程描述:
μᵗ⁺¹ = argmin_ν [WFR²_c(μᵗ, ν) + τF(ν)]这句话的意思是:网络的下一个状态 μᵗ⁺¹ 应该是那个能最小化两项之和的 ν,即:
当前状态到下一个状态的 WFR 成本;
以及一个惩罚项 F(ν),该项衡量当前状态距离“所有节点都已收到消息”这一目标状态的偏差。
如何将这一理论用于去中心化场景
上面的一切都很美妙,但它看起来像是需要一个上帝视角的中央计算机,才能计算整个网络的全局梯度流。但 JKO 拆分方法(JKO splitting scheme)[5] 告诉我们,这个复杂的全局优化问题,其实可以通过一种简单、去中心化的启发式方法来近似实现,只需要依赖节点本地已有的信息。
一个真实的以太坊节点知道两个关键的信息:
每个直连邻居的往返时间(RTT),这可以通过标准的 ping 协议获得;
当它接收到一条消息时,它知道是谁发来的,并知道与该发送者之间的 RTT。
仅使用这些本地信息,我们就可以把复杂的“梯度流”转化为一个简单的两阶段转发规则,在保证鲁棒性的同时提升效率。每一跳中,节点执行如下混合式启发策略:
鲁棒转发(Robust Forwarding)
为了防止消息传播过早终止,节点始终会将消息转发给一小部分随机选出的邻居(例如 D_robust = 3 个随机节点)。这确保了存在多个独立路径,使传播不会因偶发丢包而停滞。
高效过滤(Efficient Filtering)
对于其他候选邻居(例如,剩下的 5 个候选中的 5 个),节点应用一个智能过滤规则:
只有当转发链路的延迟小于消息传入链路的延迟时,才会转发。
这个简单的“下坡规则”(latency_out < latency_in)可以有效修剪那些通过慢链路重复转发的冗余路径,从而节省带宽。
值得强调的是:对于那些因效率过滤被“错过”的节点,现有的懒散 gossip 元数据机制(IHAVE 消息)会作为兜底补充,确保最终能实现 100% 网络覆盖率。
实际中的本地“下坡”决策
每个 libp2p 节点本就会定期记录每个邻居的 RTT(每 10~15 秒通过 ping 协议刷新一次)。当节点收到一条完整消息的第一个副本时,会记录它是通过哪条链路进来的(即 latency_in)。
随后,节点只会向那些 RTT 小于 latency_in 的邻居转发该消息(也可以选用小于 latency_in – 1~2 毫秒的值作为安全裕度)。
这一个简单判断:“这条链路是否比刚才的那条更快?” 就实现了“下坡”转发规则,无需全局视图,也无需额外信令。
在不久的将来,我们计划进一步提升该启发式方法的响应速度和准确性:将 QUIC 协议中的原生 RTT 观测纳入使用,而不仅仅依赖定期 ping(感谢 Raul 的建议)。QUIC 在传输层协议中会持续追踪 RTT,这样节点就可以在几乎没有额外开销的情况下获取“接近实时的延迟数据”。该集成将显著提升 WFR-Gossip 基于延迟的决策效率,在真实网络条件下变得更加灵活和高效。
举个简单例子来说明这一逻辑:假设一条消息从 A 节点开始传播,先发给 B。我们考虑如下三节点链路:A --(20ms)--> B --(10ms)--> C
传统 Gossipsub:
B 收到消息后,会将其转发给 mesh 中所有邻居(最多 8 个),即使其中某些链路延迟较高也不例外(虽然它不会将消息回传给 A,但 A 仍可能通过其他慢链路再次收到重复消息)。
WFR-Gossip:
B 从 A 接收到消息(latency_in = 20ms),此时只会转发给 C,因为 B 到 C 的链路更快(latency_out = 10ms < 20ms),从而正确地避免了对 A 的冗余反向传播。
这套混合方法是一个实用的算法,实现了抽象数学模型的目标:每个节点仅凭本地规则的决策,成为一个协同系统中的“智能体”,共同将消息传播朝向最优状态推进,同时最小化资源浪费。
模拟:方法与结果
为了在受控环境中验证这一理论,我们使用离散事件模拟(Discrete-Event Simulation)构建了一个包含 10,000 个节点的逼真 P2P 网络拓扑。该拓扑采用无尺度图模型(scale-free graph),每个节点的 mesh 设置为 8。网络中的每条链路依据地理距离模型设定延迟,从而形成一个一致的“传播成本”景观。
我们模拟了一次区块传播事件,首先使用传统 Gossipsub 的规则(即向大约8个随机邻居转发)建立对照基线。随后,我们针对 WFR-Gossip 运行一系列实验,测试其鲁棒参数 Drobust(从1到8)的不同取值,衡量强制转发的鲁棒性与智能过滤的效率性之间的权衡。
实验结果凸显了该方法的优势:
图1. WFR-Gossip 在不同鲁棒参数 Drobust 下的性能权衡
面板 A:实线蓝线(左轴)表示 WFR-Gossip 每个区块的总出口流量(MiB);实线橙线(右轴)表示网络覆盖率(首个接收者比例 %)。
虚线蓝/橙水平线分别表示 Gossipsub 的出口带宽和网络覆盖基线。
面板 B:绿色三角形(左轴)表示第90百分位的首次到达延迟;洋红色虚线圆点(右轴)表示平均首次到达延迟。对应的虚线水平线为 Gossipsub 基线。误差条(如可见)为五次独立蒙特卡罗模拟的 ±1σ。
如预期所示,增加 Drobust 会提高网络覆盖率,但也带来更高的带宽消耗。在最新模拟中,出现了一个明显的“甜点区”:当 Drobust = 3 时,覆盖率达到约 98%,而相比 Gossipsub,带宽消耗减少了约三分之一(4.5 GiB 对比 6.8 GiB)。
当 Drobust 较低(特别是 < 4)时略低于 100% 的覆盖率,是因为 WFR-Gossip 的 eager-push 策略虽然高效,但较为严格。在实践中,这种差异可以通过 Gossipsub 的懒散 gossip(IHAVE 消息)机制弥补,最终确保全网覆盖。这种组合既保留了 WFR-Gossip 的带宽效率,又具备 Gossipsub 提供的可靠冗余保障。
值得注意的是:当 Drobust ≥ 3 时,WFR-Gossip 的传播延迟普遍低于 Gossipsub。这是因为它大幅减少了冗余消息副本,从而减轻了网络拥堵。例如,当 Drobust = 7 时,WFR-Gossip 覆盖率超过 99.5%,带宽使用与 Gossipsub 相当,但将 90 百分位延迟降低了约 15%。
以下是从 Drobust 值为 1 到 8 时,Gossipsub 与 WFR-Gossip 在部分关键指标上的对比结果,以突出二者的主要差异。用于模拟的代码可以在此处找到 [6]。
与其他现有方法的对比
WFR-Gossip vs Gossipsub 的 peer scoring
Gossipsub v1.1 通过打分参数(如 p1)优化 mesh 质量,奖励快速传播的邻居。但这些调整是逐步渐进的,且每条消息仍会转发给全部8个 mesh 节点,缺乏实时效率判断。而 WFR-Gossip 能为每条消息主动做出基于延迟的决策。模拟结果显示,在相同邻居连接下,WFR-Gossip 明显减少了冗余传播,降低了延迟和带宽使用。
WFR-Gossip vs 贪婪的延迟路由(Greedy Latency-Based Routing)
纯粹基于延迟的贪婪路由只沿最快路径转发,可能造成瓶颈、局部最小值和被操控风险。WFR-Gossip 采用混合启发式策略,通过 Drobust 提供鲁棒的多路径冗余,同时用“下坡”延迟过滤机制削减冗余路径。若配合 Gossipsub 的打分机制,还可抵御恶意 RTT 操控。
WFR-Gossip vs 结构化拓扑协议(如 DOG)
拓扑感知协议(如 Dynamic Optimal Graph, DOG [7])需要构建并维护结构化网络,增加复杂度和对节点变动的脆弱性。WFR-Gossip 无需拓扑重构,仅利用现有随机连接和轻量本地 RTT,实现简单且更强健的设计。
但其简洁性也有代价:偏好“快链路”的做法会让低带宽/高延迟节点更依赖 IHAVE/IWANT 懒散机制,从而增加延迟;依赖本地 RTT 也可能受操控。这些问题可通过参数调整和 Gossipsub 的评分机制缓解,但需在真实或恶意网络中验证效果。
WFR-Gossip vs Gossipsub 的后处理扩展(如 CHOKE、IDONTWANT)
像 CHOKE 和 IDONTWANT 是事后控制机制,在检测到冗余后限制传播。而 WFR-Gossip 是主动决策机制,基于本地 RTT 在转发时就规避冗余。因此两者可互补:WFR-Gossip 降低前期冗余,后者加强后期控制,共同提升带宽效率、降低延迟并优化整体性能。
未来工作与开放问题
在客户端(如 devnets/perfnets)和 libp2p 模拟器 [8] 中以功能开关方式部署 WFR-Gossip,以便收集更贴近实际的网络数据;
深入研究 WFR-Gossip 与 Gossipsub 新机制(IWANT、IDONTWANT、CHOKE)之间的协同效应;
探索更多“不牺牲鲁棒性”的主动优化机制,以提升效率。
🔗 原文内超链接
[1] https://github.com/libp2p/specs/tree/master/pubsub/gossipsub
[2] https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/p2p-interface.md#the-gossip-domain-gossipsub
[3] https://ethresear.ch/t/number-duplicate-messages-in-ethereums-gossipsub-network/19921
[4] https://en.wikipedia.org/wiki/Transportation_theory_(mathematics)
[5] https://arxiv.org/pdf/1602.04457
[6] https://github.com/soispoke/wfr-gossip-simulator/tree/main
[7] https://github.com/cometbft/cometbft/issues/3263
[8] https://github.com/cskiraly/das-simulator-nim?tab=readme-ov-file







