Skip to main content

Gossip Service(八卦服务)

Gossip服务在控制平面中充当一个网关的角色。 验证节点使用该服务来确保集群中的所有其他节点都可以获取信息。 服务通过Gossip协议来广播相关的消息。

八卦传播概览#

节点之间不断共享签名数据对象,以便管理集群。 例如,它们相互共享联系消息、区块高度和投票。

每十分之一秒,每个节点发送一个“推送”消息和/或“拉取”消息。 推送和拉取消息可能会引发响应,推送消息可能转发到集群中的其他节点。

Gossip在已知的UDP/IP端口或已知范围内的端口上运行。 一旦集群被触发,节点就会互相通告在哪里找到它们的对等端点(一个 socket 地址)。

Gossip 记录#

通过gossip共享的记录是任意的,但是需要根据需要进行签名和版本控制(带有时间戳) ,以便对接收它们的节点有意义。 如果一个节点从同一个源接收到两条记录,它将用带有最新时间戳的记录更新自己的副本。

Gossip 服务接口#

推送消息#

节点发送一个push消息,告诉集群它有要共享的信息。 节点向 PUSH_FANOUT 发送消息到对等节点。

当节点接收到消息后,做如下检查:

  1. 复制:如果这个消息之前发送过,节点丢掉数据并返回 PushMessagePrune 如果这个数据是从低权重的节点发送的

  2. 新数据:如果这个数据是新来的

    • 将带有新版本的新消息存储在群集当中,

      清除以前的旧值

    • 把消息存储在pushed_once当中(

      用来检测重复的消息,在PUSH_MSG_TIMEOUT * 5后擦除)

    • 将消息重新传输到自己的对等节点

  3. 过期:当超过PUSH_MSG_TIMEOUT这个时间间隔时,节点丢弃相关的消息

推送消息到对等节点,消息剪枝#

节点从已知节点的活跃集合中随机选择其推送节点。 节点将此选择保留相对较长的时间。 当接收到修剪消息时,节点丢弃发送该消息的推送对等方。 Prune表示有另一个比直接推送更加复杂的路径到达该节点。

每隔PUSH_MSG_TIMEOUT/2毫秒,推送的节点集合都会进行更新,保证推送节点是比较新的。

拉取消息#

节点发送一条"拉取"消息,询问集群是否有新信息。 拉取消息随机发送到单个对等点,包括节点已经拥有的内容的Bloom过滤器。 接收“拉取”消息的节点对其bloom过滤器进行迭代,并构造一个“拉取”响应,该响应包含未命中过滤器且适合消息的内容。

节点通过迭代当前值来构造pull Bloom过滤器。

节点处理pull响应中的记录的方式与处理push消息中的新数据的方式相同。

消息剪枝#

节点保留较早的消息(通过推送和拉取更新的数据) 和过期的值(比GOSSIP_PULL_CRDS_TIMEOUT_MS更旧的值)purged_values(最新拥有的)。 节点修剪purged_values5*GOSSIP_PULL_CRDS_TIMEOUT_MS这个时间间隔长。

日食攻击#

日食攻击是试图接管大量节点的节点集合。

下面两个方面的因素是我们实现中需要考虑的。

  • 拉取消息会从网络中随机的选择一个节点。 对拉取消息继续的日食攻击会影响节点的随机选择,从而只选择恶意节点进行数据同步。
  • 节点维护一组活跃的节点用于随机扩散消息。 日食攻击者会影响活跃的节点集合,这样发送的消息会传播到恶意节点。

Time and Stake based weights(基于时间和质押的权重)#

权重是基于上次当选的时间质押权重自然对数而组成。

采用ln的权值可以使所有节点在合理的时间内获得更公平的网络覆盖机会。 它有助于规范化节点之间可能存在的质押权重差异较大的情况。 通过这样,与质押权重较大的节点相比,质押权重较低的节点只需等待几倍的ln(质押) 时间就可以被选中。

攻击节点无法影响这些参数。

拉取消息#

上述计算权重的方法作为拉取信息来选择节点。

推送消息#

剪枝只能从潜在连接中删除。

就像拉取消息一样,节点是根据权重来添加到活跃的节点集合中的。

PlumTree的主要区别#

本文描述的主动推送协议基于Plum Tree。 主要区别是:

  • 推送的消息带有发送节点的时间戳。 当时间戳过期后数据就被删除了。 跃点限制很难在对抗性环境中实施。
  • 延迟推送之所以没有实施,是因为它不清楚如何阻止对手伪造消息指纹。 一个简单的方法允许对手根据它们的输入优先级进行拉取。