GossipSub: Attack-Resilient Message Propagation in the Filecoin and ETH2.0 Networks
GossipSub 的组成
在 GossipSub 论文中,它由两部分内容构成:构建网格网络(mesh construction)和评分函数(score function)。其中网格网络主要用于构建快速、资源利用率高、扩展性好的数据传输网络。score function 使得节点拥有抵抗恶意行为的能力。
构建网格
每个节点都会选择一部分邻居节点并与之构成局部网格(local mesh)。所有节点的局部网格的并集构成了全局网格(global mesh)。当一个节点转发一条消息时,只会将消息转发给至局部网格,接收节点也会将消息继续转发给它的局部网格。需要注意的是,并不是每个节点都需要构建局部网格,因为节点仍然可以通过 gossip 协议请求缺失的数据。
每个节点局部网格节点的数量(也称之为度数) $D$,即该协议的放大因子。局部网格的初始构建根据节点发现机制进行。$D$ 的取值介于 $D{low}$ 和 $D{high}$ 之间。当节点网格的度数超过 $D{high}$ 时,该节点处于过度订阅(over-subscribed)的状态,并且需要在网格中剪除一些节点。当节点网格的度数超过 $D{low}$ 时,该节点处于低订阅(under-subscribed)的状态,需要将新节点加入到网格中。
在将新节点加入网格中时,需要对节点进行筛选,其中 $D_{score}$ 专门用于对每个节点进行排序。
另外一个相关的概念是 $D_{out}$ ,它表示节点主动建立的连接数,这个主要是用于防止节点受到日食攻击。
GossipSub 消息类型
- GRAFT:发送方告知接收方被纳入发送方的网格中。
- PRUNE:发送方告知接收方被剔除发送方的网格中。
- PRUNE-Peer Exchange (PX):发送方向接收方发送一些网格节点以帮助接收方构建自己的网格。
- IHAVE:gossip 消息,发送方告知接收方一些可以获取的数据。
- IWANT:gossip 消息,发送方根据接收方的 IHVAE 消息请求数据。
- heartbeat:心跳消息,用于维护 mesh 和 gossip 消息,1 秒 1 次。
通过消息类型可知,节点向局部网格发送消息时,直接发送消息内容本身。如果是向非网格节点发送,则会发送 IHAVE 消息。
Gossip 过程
节点 Gossip 的时候,随机选择一些节点。选择的节点可能是网格节点,也有可能不是。
Gossip 通过心跳发送,节点存储在 1 秒内所有见过的消息,然后通过心跳包发送给其他节点。
当前 GossipSub 中,gossip 的内容通过 3 轮次连续的 heartbeat 消息发出去的。每次 gossip 的时候,只选择一部分节点进行 gossip,经过 3 轮的 gossip使得所有节点都能拿到数据。为什么这么设计?文章后续有交代。
Score 函数
其中 $TC$ 表示 TopicCap,具体概念文中没有做解释。$t_i$ 表示话题权重。下文参数的介绍是基于个人理解,本章中实际上介绍不是很清楚。
- $P_1$: 网格中的存在时间。
- $P_2$: 第一条消息的发送量。
- $P_{3a}$: 网格消息发送率,即网格内节点在一定时间窗口内提交的消息量。
- $P_{3b}$: 网格消息发送失败率。即网格中节点没有成功发送的消息数量。
- $P_4$: 非法消息数,用于惩罚发送非发消息的恶意节点。
- $P_5$: 特定应用的分数。
- $P_6$: 同一 IP 地址连接的数量,避免女巫攻击。