SPREAD:用高效匿名传播扩展GossipSub

以太坊中文 发布于 2026-07-04 阅读 21

SPREAD是一种GossipSub扩展协议,通过结合局部随机漫步和地理导向传播,在提升消息匿名性的同时降低延迟。

作者:Diogo Cardoso,Matheus Franco,Rodrigo Rodrigues

致谢: 本工作得到了 SSV Network DAO 授予里斯本大学的 资助 支持。

一份草案规范已提交至 libp2p/specs (PR #726)。

go-libp2p-pubsub 已有参考实现 (PR #717)。

概述 / 总结

GossipSub 是以太坊等生态系统中支撑关键社会协议的核心通信基础设施。Gossip 协议的若干特性使其成为一种有趣的通信基础,包括鲁棒性、可扩展性和简洁性。然而,匿名性(隐藏消息的真实来源)这一重要属性,有时被认为是避免针对发送者的定向攻击所期望的特性,但实际上众所周知 GossipSub 无法实现这一点,从而为定向拒绝服务攻击打开了大门。自然的防御手段,即像 Dandelion++ 那样以随机漫步开始传播,会带来延迟成本,而以太坊社区已判定这对于共识层不可行,并且即将到来的槽时间从 12 秒减少到 6 秒只会使这个预算更加紧张。

我们提出 SPREAD(Secure Peer-to-Peer Relay for Efficient Anonymous Dissemination,安全点对点中继以实现高效匿名传播),这是一个 GossipSub 扩展,旨在兼顾两者:它在提高对抗发送者去匿名化能力的同时,实际上还提高了传播效率。SPREAD 结合了两种机制:一是本地随机漫步,在不显著影响性能的情况下混淆消息来源;二是地理导向的传播,通过使用附近节点作为跳板来避免代价高昂的长距离跳转,从而实现低延迟的全球传播。我们已在 go-libp2p-pubsub 的分支上将其实现为一种可选择加入、向后兼容的扩展,并在下面使用实际实现对 SPREAD、GossipSub 和 Dandelion++ 进行了评估。请注意,我们的目标是提高门槛,而非完全防止去匿名化,因为源不可区分性是一种依赖于对手观察能力的量化属性,而非绝对保证。

术语与定义

好奇节点 (诚实但好奇的观察者) - 正确遵循协议但试图从观察到的流量模式中推断额外信息(例如给定消息的发起者)的节点。

扇出 (Fanout) - 在传播步骤中节点向其转发消息的对等节点数量。

随机漫步 (Random Walk) - 一种转发策略,其中每个节点将消息转发给一个随机选择的邻居(可能带有概率分支)。

虚拟坐标 (Virtual Coordinates) - 分配给节点在合成几何空间中的延迟估计坐标,允许在没有直接测量的情况下估计网络距离。

伯努利试验 (Bernoulli Trial) - 一种具有两种结果(成功/失败)的概率决策机制,由相应的概率值参数化。

拉伸 (Stretch) - 一种性能指标,定义为实际端到端投递延迟与发送方和接收方之间直接(通常为最优)通信延迟的比值。

去匿名化准确率 (Deanonymization Accuracy) - 基于攻击者控制的节点上的时序观察,攻击者正确推断消息原始发送者的次数比例。

集群 (Cluster) - 一组附近的节点,即在虚拟坐标空间中彼此靠近因此通信延迟低的节点。

眼镜蛇漫步 (Cobra Walk) (Coalescing-Branching Random Walk) - 随机漫步的一种变体,其中每个节点根据分支因子将消息转发给一定数量的随机邻居,允许漫步偶尔分支,而不是总是转发给单个对等节点。

维诺图 (Dirichlet Tessellation) - 根据一组参考点(质心)将空间划分为区域,每个区域包含比任何其他质心更靠近其质心的空间部分。

动机

尽管普遍认为 gossip 协议可以帮助保护任何给定消息的原始发送者的匿名性,但 GossipSub 的开发者和许多用户知道它并非为此设计,也无法提供此类保证。特别是,通过对少量监听节点上的消息时序进行观察,可以发动针对 GossipSub 层的简单攻击,使中心化协调器能够关联时序并推断 gossip 消息的真实来源。这种被动的、基于时序的攻击首次在比特币中得到证明,其中交易从一小部分超级节点追溯到发起它们的 IP 地址 (Biryukov 等人, Fanti 和 Viswanath),后来通过几个 epoch 监测证明传播,显示可以将以太坊验证者映射到其对等节点 ID 和 IP 地址 (Sharma 等人;Heimbach 等人Rhea)。尽管 GossipSub 使用随机转发来混淆消息路径,这可能是因为验证者的直接对等节点(即验证者在 gossip 覆盖网络中的直接邻居)始终比其他节点更早地接收并传播其消息。因此,通过部署几十个监听节点,经过几个 epoch 后,其中一个监听节点极有可能成为直接对等节点(并在后续若干个 epoch 中保持)。因此,通过跟踪多个共识 epoch 中第一个听到消息的监听节点(以及该消息来自哪个网络地址),协调器最终能够以高置信度可靠地将验证者映射到其网络身份。一旦被识别,验证者可能会被选择性攻击(例如通过拒绝服务),导致因错过职责而被罚没或遭受经济攻击。关键的是,这种去匿名化不依赖于任何特权访问,只需在少量行为良好(诚实但好奇)的观察者处监听流量即可实现。

这个问题源于 gossip 协议设计中的关键张力:增加扇出,以及更一般地提高传播速度,会降低匿名性;而通过低扇出限制暴露则会在牺牲传播速度的情况下提高隐私性。不幸的是,GossipSub 未能取得合理的平衡:它泄漏了足够的结构信息以实现去匿名化,同时由于对延迟不敏感的路径放大了延迟和开销,仍然效率低下。

先前的研究提出了针对此类攻击的防御措施,最著名的是 DandelionDandelion++,它们通过以随机漫步混淆阶段开始传播,提供了更强的、经过形式化分析的发送者匿名保障。然而,这些保障带来了显著的延迟成本,这已被证明是它们在延迟敏感场景中采用的根本障碍。事实上,以太坊社区得出结论,“由于延迟限制……这个提议 [Dandelion++] 对于以太坊共识层是不可行的(至少对于任何强匿名保障)”(EthResearch 讨论)。这种张力势必会加剧:随着以太坊计划将槽时间从 12 秒减少到 6 秒 (EIP-7782),gossip 层面临着更严格的性能要求,导致当今的部署必须同时提供所需的性能和期望的发送者匿名防御,这是一个复合挑战。

为了应对这一挑战,我们提出 SPREAD,一种新的 gossip 协议,将作为协议扩展实现。与 GossipSub 相比,它提高了对抗发送者去匿名化的门槛,同时实际上提供了更高效的传播。我们的方法基于两个原则:通过随机漫步混淆消息来源实现匿名性,以及通过拓扑感知的跳转选择实现低延迟。我们将随机漫步跳转(优先考虑低延迟)与广域跳转(尽可能与附近节点通信作为跳板,以避免代价高昂的长距离路径)分开。这种设计适合需要低延迟和发送者隐私的应用,包括区块链验证者消息传递、匿名通信系统和抗审查平台。

SPREAD 的设计:见解与概述

最近 Guerraoui 等人 的形式化工作表明,为匿名性设计的 gossip 协议必须包含强大的随机漫步组件,其中每个节点通常将消息转发给单个覆盖网络邻居,以使源的标识难以确定。例如,Dandelion 协议家族 采用了这种技术,它们以基于随机漫步的匿名阶段开始,然后概率性地切换到高扇出的传播阶段。

然而,这带来了一个问题:在随机漫步阶段,每个时间步消息最多只发送给一个对等节点,个别步骤可能会不幸地穿越一条缓慢或遥远的路径。这是有问题的,因为单次慢跳就足以显著损害平均端到端性能(通过拉伸或覆盖网络与直接消息连接之间的比率来衡量)。然后,以太坊等区块链将其多步协议分层在 gossip 基础之上的事实放大了这个问题。此外,为了提高性能而采取的对策,即提前切换到更高效的模式(消息并行发送给多个对等节点),不仅仍然容易受到初始阶段的一次长跳影响,而且与预期的匿名保障直接冲突。

为了有效权衡这一矛盾,我们利用一个见解:节点的地理分布通常自然地形成对应于世界上人口最稠密和经济最发达地区(例如美国东海岸和西海岸、欧洲、亚洲等)的集群。这使得 SPREAD 的设计能够将节点组织成集群,其特点是同一集群内节点之间的网络延迟低,从而允许在集群内进行快速的多跳传播。有了这一设计决策,我们可以利用集群内通信进行随机漫步,从而在不对性能造成显著损失的情况下建立隐私,同时偶尔转向集群间通信以实现全球传播。

第二个挑战是,如果不仔细管理,集群间的消息步骤也可能非常损害端到端性能。例如,我们希望避免必须通过亚洲或中东的覆盖网络跳转将消息从欧洲发送到美国东海岸。为了避免这种情况,我们需要设计高效的广域传播,因为这一步对性能至关重要,而我们的协议已经通过集群内通信实现了匿名性。为此,SPREAD 尝试让集群间的消息跳转在与相邻集群的节点之间进行,以便它们可以作为跳板到达更远的集群。在理想化的路由场景中,存在一个单一的全局视图,展示集群以及它们如何通过高级覆盖网络相互连接,这对应于 Dirichlet 镶嵌,根据集群质心集合将空间划分为区域。这使得理想化路由只能根据 Dirichlet 镶嵌向相邻集群中的覆盖网络对等节点发送集群间消息。

dataset_voronoi

图 1:互联网主机数据集的地理坐标,附有显示 Voronoi 单元的聚类信息。理想化的广域 gossip 步骤仅发生在相邻单元之间,但这需要全局协调的单元划分视图。

然而,我们的目标是拥有一个完全去中心化的协议,不依赖于这些集群及其高级连接的全局视图。为此,我们决定通过让每个节点构建其自己集群的本地视图来近似理想化路由。我们的主要见解是使用一种虚拟坐标方案,该方案安全地为每个节点分配一组欧几里得坐标 [Vivaldi, Newton] 以近似理想化路由。有了这样的坐标,每个节点将其集群视图定义为虚拟坐标空间中其覆盖网络邻居中最接近的 t%。这使得每个节点能够本地确定构成其自身集群邻居成员的邻居子集。此外,可以借助虚拟坐标以完全去中心化的方式近似理想化的集群间路由。受自然导航启发的想法是:只要在非集群节点集合中存在一个与远端节点相当一致(直观上意味着存在一个更近的附近目的地可以作为跳板)的更近邻居,就总是避免直接跳转到更远的邻居。在这种情况下,“一致”意味着指向更近节点的方位角在指向远端节点的方位角的可配置角度区间内(此方位角由欧几里得空间中的虚拟坐标给出)。同样,这使得每个节点能够将其非集群覆盖网络对等节点集合本地分为两组:那些存在更近“跳板”成员的节点(因此不应用于集群间或任何类型的转发,称为 occluded_remote),以及那些不存在的节点(因此有资格进行集群间跳转,称为 unobstructed_remote)。

协议概述

该协议包含两个并行运行的组件:一个用于维护覆盖网络对等节点(或邻居)及其各自安全虚拟坐标的算法,以及用于发送和传播 gossip 消息的主协议。节点 i 的覆盖网络邻居根据之前描述的标准自动分为三个子集:cluster_i、occluded_remote_i 和 unobstructed_remote_i。

有了这样的覆盖网络状态,我们现在可以基于直觉定义广播消息的简单协议:结合集群内随机漫步(确保匿名性)和通过无遮挡远程邻居进行集群间高效传播。当接收到要传播的消息时,通过简单地抛掷一枚根据系统参数偏置的Coin来决定采用这两种替代方案中的哪一种。接下来解释协议的伪代码,重点介绍在集群信息和覆盖网络邻居形成就绪后如何广播消息。

1: # 常量:
2:  ρintra   # 分支概率(集群内)
3:  ρinter   # 集群间传播概率
4:  fanoutintra   # 分支时集群内对等节点数量
5:  fanoutinter   # 集群间传播的对等节点数量

6: # 状态变量:
7: neighbors_i # 覆盖网络邻居集合,划分为:
8: cluster_i       # Pi 集群中附近邻居的子集
9: unobstructed_remote_i  # 无法通过另一个邻居高效到达的远程邻居子集
10: occluded_remote_i      # 可能通过另一个邻居到达的远程邻居子集

11: 收到或发布消息 m 时执行
12:  INTRACLUSTERSPREAD(m)
13:  INTERCLUSTERSPREAD(m)

14: 过程 INTRACLUSTERSPREAD(m)
15:  如果 Bernoulli(ρintra) = 0 则
16:      将 m 发送给 cluster_i 中均匀随机选择的 1 个对等节点
17:  否则
18:       将 m 发送给 cluster_i 中均匀随机选择的 fanoutintra 个对等节点

19: 过程 INTERCLUSTERSPREAD(m)
20:  如果 Bernoulli(ρinter) = 1 则
21:      将 m 发送给 unobstructed_remote_i 中均匀随机选择的 fanoutinter 个对等节点

协议迭代包含两个步骤:集群内和集群间传播(第 12 到 13 行)。集群内传播受 cobra walk(汇聚分支随机漫步)算法 (Dutta 等人) 启发,该算法由随机漫步组成,根据本地伯努利试验的输出可能分支(第 15 行)。分支的概率记为 rhointra。当输出为零时(第 16 行),节点将简单地在其集群中均匀随机选择一个对等节点,即代表随机漫步阶段。否则,当输出为 1 时(第 17 行),节点将消息传播给在其自身集群中均匀随机选择的 fanoutintra 个对等节点,实现更快的集群内传播。集群间传播负责全局传播,并根据另一个本地伯努利试验偶尔发生(第 20 行),该试验的参数为 ρinter。当试验输出为零时,节点不与其他集群交互,将所有通信保持在其自身集群内。当输出为 1 时(第 21 行),节点将消息传播给不远(即坐标空间中未被更近的节点“隐藏”,该节点可以充当跳板)的邻居节点,均匀随机选择总共 fanoutinter 个对等节点。注意,对等节点会多次传播同一条消息。算法不包含停止此类重复行为的逻辑,原因是为了保证匿名性。特别是,对于节点仅传播一次消息的协议,Bellet 等人 已经表明攻击者通过跟踪通信时间戳更有可能识别源。然而,对于持续生成新消息的实际应用,必须提供终止机制以避免网络拥塞。一种简单的方法是让节点传播同一条消息(该消息可能通过不同的邻居到达,因为消息被路由)固定次数,之后停止。通常,此参数控制协议的可信度,对于实际网络规模,小值通常就足够了,如 Kermarrec 等人 所述。尽管如此,可以添加额外的可靠性机制,并且实际上已经在 GossipSub 等框架中存在,例如心跳消息(广告已见消息列表)和“拉取”协议请求以获取缺失消息。

这种消息拉取机制在另外两个场景下对鲁棒性也很有价值。首先,在成员变动下,一连串的节点故障或离开可能会阻碍直接传播的有效性,而心跳和拉取机制允许节点恢复其错过的消息。其次,它有助于防御拜占庭节点:虽然简单的加密可以防止此类节点篡改消息内容,但它们仍然可以故意延迟或拒绝转发消息,危及进展,而心跳和拉取可以对抗这种情况。

使用协议扩展以及与 GossipSub 对等节点共存

SPREAD 是 GossipSub 的一个可选择加入、向后兼容的扩展。它通过 GossipSub 现有的握手字段进行通告,并且仅当两个对等节点都支持时才在连接上激活。SPREAD 消息在标准 RPC 信封中带有一个额外字段标记,因此不支持该扩展的对等节点只需忽略此标记并回退到标准 GossipSub。这使得混合部署成为可能,并支持增量采用路径,在整个网络升级之前即可获得部分匿名性和性能优势。集群构建依赖于由 Vivaldi 过程(使用 Newton 检查保证安全)维护的虚拟坐标,这是 SPREAD 对节点通信配置所做的唯一添加。

评估

我们从两个互补维度评估 SPREAD:其抵抗去匿名化攻击的能力以及其在广域网络中传播消息的效率。我们将其与部署在以太坊中的 GossipSub 以及旨在提高匿名性的研究提案 Dandelion++ 进行比较。由于 SPREAD 是作为 go-libp2p-pubsub 的扩展实现的,我们能够评估实际生产代码:我们在 simnet 上运行它,这是一个数据包级模拟器,通过具有可配置延迟和带宽的虚拟链路连接实际实现。为了反映实际部署,我们从 全球互联网数据集 中提取网络拓扑,该数据集包含地理分布节点之间的真实往返时间测量,我们对多个拓扑进行采样并聚合结果。Dandelion++ 在同一栈上实现,因此所有三个协议共享相同的实现,仅在传播策略上有所不同。

为了公平比较,我们配置三个协议,使每个节点期望转发给相同数量的对等节点,即它们共享相同的每节点带宽预算。我们使用 GossipSub 的默认网格大小 6 作为目标期望扇出,并调整 SPREAD 的四个参数和 Dandelion++ 的参数以匹配它。我们通过第一个时间戳估计器下的去匿名化准确率指标来衡量匿名性:对于给定比例的好奇节点,我们采样多个攻击者放置,对于每条消息,猜测其发送者为最早时间戳将其投递到好奇节点的节点;准确率是正确猜测的比例。我们通过绝对投递延迟和拉伸指标来衡量性能,拉伸定义为消息的实际端到端投递时间与其发送方和接收方之间直接通信延迟的比率。

匿名性

随着攻击者控制网络更大比例,所有协议都变得更加脆弱,但程度显著不同。GossipSub 暴露最多:只有 5% 的好奇节点时,攻击者已在超过 35% 的情况下成功,在 20% 时上升到 54%。Dandelion++ 实现了最强的匿名性,在 5% 好奇节点时保持在 10% 以下,即使在 20% 时也仅约 20%,这得益于其随机漫步混淆阶段。SPREAD 介于两者之间:在 5% 好奇节点时,其准确率在 20% 左右,在 20% 时达到约 45%。因此,它相对于 GossipSub 降低了攻击者的成功率,同时为了获得显著更好的传播效率,牺牲了与 Dandelion++ 相比适度的匿名性差距。

attack_results_2

图 2:对于 GossipSub、Dandelion++ 和 SPREAD,去匿名化(攻击)准确率随好奇节点百分比的变化。

性能

SPREAD 在三个协议中实现了最高效的传播。在拉伸阈值 3 时,超过 90% 的投递在 SPREAD 下完成,而 GossipSub 约为 83%,Dandelion++ 仅为 50%;这种差距在尾部持续存在,SPREAD 和 GossipSub 远在 Dandelion++ 之前就接近完全覆盖。总体而言,SPREAD 的平均拉伸比 GossipSub 低约 23%,比 Dandelion++ 低约 67%,并且它更显著地缩小了重尾,分别将第 99 百分位拉伸降低了约 39% 和 74%。绝对延迟也遵循相同的顺序:SPREAD 一半的投递在 100 毫秒内完成,而 GossipSub 为 40%,Dandelion++ 为 10%。这种尾部行为在当多步协议分层在 gossip 之上时(例如在以太坊中)尤其重要,因为每增加一步都会放大单跳延迟惩罚。

stretch_cdf_2

图 3:三个协议在所有发送方-接收方对上的拉伸累积分布。

cdf_latency

图 4:三个协议在所有发送方-接收方对上的绝对投递延迟累积分布。

调优

最后,我们研究 SPREAD 的四个参数如何权衡匿名性与性能。在所有参数中,增加扇出或分支概率会降低拉伸,但同时会提高攻击准确率,反之亦然,这证实了 SPREAD 可以在一个连续统中进行调优:较低的值最大化隐私,而较高的值将平衡转向性能。集群内参数主导拉伸分布,而集群间概率主要作为一个匿名性旋钮,性能回报递减。上述比较中使用的配置有意针对此频谱中的一个平衡点,而非任一极端。

tuning_stretch

图 5:在 10% 好奇节点下,SPREAD 单参数变化时的平均拉伸与去匿名化准确率。每条线连接一个参数的连续值。

总体而言,这些结果表明,以太坊当前设计的两个维度可以同时改进:切换到 SPREAD 相对于 GossipSub 降低了去匿名化准确率,同时也实现了更低的平均和尾部拉伸。与 Dandelion++ 相比,SPREAD 放弃了一些匿名性,但避免了使强匿名性提案在延迟敏感环境(如以太坊共识层)中不切实际的延迟开销。

  • 原文链接: ethresear.ch/t/spread-ex...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论