图片

互联网计算机区块链依赖于点对点(P2P)协议,该协议在每个子网的节点之间分发消息(工件),该协议是一组运行互联网计算机区块链的协议,包括互联网计算机共识协议、DKG(分布式密钥生成)协议或状态同步协议。

每个这样的协议都会生成工件,并且需要 P2P 层将这些工件分发给子网中的对等点,我们将这些协议中的每一个都表示为 P2P 客户端,它们是作为 P2P 层之上的更高层组件实现的。

图片
图 1:互联网计算机的总体架构

在引入用于状态同步的单独 P2P 层之后,正在为互联网计算机协议栈中的所有其他 P2P 客户端引入新的 P2P 层,这个新的 P2P 层提供了改进的网络性能,确保了共识协议所需的保证,并且更容易检测节点的不当行为。

新提出的 P2P 层使用最近推出的基于 QUIC 的新传输层,因此,随着迁移到这个新层,互联网计算机的 P2P 层将完全停止使用 TCP,向 QUIC 的转变也意味着向 P2P 层的完全异步实现的转变。

每个请求都作为新的 QUIC 流发送,并独立于其他请求进行处理,这可以防止潜在的队头阻塞问题,至少在理论上,这些问题可能会导致活性问题。

新的 P2P 层引入了一种新颖的抽象数据结构(称为时隙表)的使用,这使得更容易控制工件到对等点的分发,同时根据连接质量保持向每个对等点足够的发送速率,并且不会影响其他同行,它还可以更轻松地检测同伴的不当行为。

随着提议的新 P2P 层被接受,每个客户端将使用 P2P 协议的单独实例,其中状态同步将使用专门为其设计的实例,其余客户端将使用新 P2P 层的单独实例将在这篇文章中详细描述。

新提出的 P2P 层的推出始于一系列 NNS 提案的采用,该提案将 HTTPS-outcalls 工件分发转变为使用新的 P2P 层,之后,所有剩余的客户端都将被转移,包括共识协议,最终使旧的 P2P 层过时。

背景:互联网计算机的 P2P 层

在非常高的级别上,P2P 协议负责将每个客户端的已验证工件池中存在的任何工件分发到同一子网中的对等点,已验证的工件池由客户端根据其向同行广播这些工件的需要来填充。

图片
图 2:P2P 层与其客户端之间的接口

图 2 显示了 P2P 与其之上的客户端之间的接口,客户端可以在每次调用 on_state_change() 时任意更改工件池。

每个此类调用最终都会返回一组 ChangeAction,这些 ChangeAction 对应于在该客户端的已验证工件池中添加和删除工件,P2P 层应使用此信息将经过验证的池的内容传播到对等点。

互联网计算机现有的 P2P 协议基于从每个节点到其对等点的工件流,每当将工件添加到经过验证的池中时,就会向所有对等方广播广告,广告是描述工件的小消息。

发送它而不是工件本身作为节省带宽的措施,以便接收者可以决定是否要下载(可能很大的)工件,发送节点维护一个到每个对等点的 TCP 流,在该流上发送广告(以及后来根据请求的工件)。

P2P 层应保证诚实节点和可操作节点之间的工件传递,并且应对潜在恶意节点的恶意行为具有弹性。

P2P 层所有与共识相关的客户端有两个重要属性:

  • P1 - 活动工件的有限数量:经过验证的工件池在任何时间点的大小都是有限的,共识协议使用检查点来定期清除工件,因此池的最大大小 C 可以作为检查点间隔(以块数衡量)和子网大小的函数来计算。

  • P2 - 工件的显式到期:如果工件从池中删除(被清除),则不再需要将其传播给同行,或者,从接收方来看,如果没有对等方拥有某个工件,则保证接收方不需要该工件,即使在它被所有其他对等方删除时它未能接收到该工件。

这里强调这两个属性,因为它们支持重要的设计决策,这些决策将很快得到解释。

网络背压

在传统的客户端 - 服务器应用程序中,背压的概念被广泛使用:如果接收方减慢消费消息的速度,发送方的缓冲区就会填满,然后发送方的网络层必须采用以下三种路径之一:

  • 将背压传播到应用程序层,使应用程序减慢数据生产速度

  • 缓冲消息(可能无限期)

  • 丢弃出口消息

在区块链上,这变得更加复杂,想象一下,发送者经历了来自某个对等方的背压,这位同伴可能是诚实的,也可能不是,采用上述任何一种方法都会导致严重的问题:

  • 减慢数据生产速度意味着减慢区块链速度,允许此行为将成为拒绝服务(DoS)攻击媒介;

  • 缓冲区(可能是无限期的)也将成为攻击媒介;

  • 丢弃出口消息可能意味着无法保证向诚实但缓慢的节点传送消息。

由于选项 1 和 2 的安全风险,大多数区块链选择了选项 3,然而,选项 3 存在区块链活跃性的风险(即,如果丢弃足够多的消息,则可能会卡住),为互联网计算机提出的新的 P2P 层克服了风险,而不会丢失消息。

新的 P2P 层

新的 P2P 层的工作方式与现有的非常不同,首先,它并不总是使用广告,如果工件足够小,它们将立即发送,没有任何广告;其次,它不使用单个流,而是通过同一 QUIC 连接使用多个流;第三,因为它不使用单个流,所以它以非常不同的方式管理工件的发送;第四,它引入了一种略有不同的协议,用于同一子网中的对等点之间的通信。

让我们退后一步,看看 P2P 层在为共识协议和具有类似需求(即非状态同步)的其他客户端提供服务时的目的,目的是,对于每个诚实的节点,确保对等节点可以接收该节点在其经过验证的工件池中拥有的任何内容,当然,同时保持一切安全、可扩展和高性能。

新的 P2P 层通过引入一种称为槽表的新颖抽象数据结构来实现此目的,该结构用于跟踪经过验证的工件池的内容以及更新对等点有关该内容的过程,槽表数据结构很简单,但它准确地提供了满足要求所需的内容。

槽表数据结构

时隙表是一个抽象的数据结构,由发送端的每个节点维护,并且由接收端的每个节点推断,发送端的时隙表的大小与验证池中的活动工件的数量完全对应,如果您还记得上面的属性 P1,这意味着槽表受限于某个常数 C。

每当将工件添加到验证池中时,它就会添加到发送端槽表中的空槽中,槽更新消息正在发送给所有对等点,告诉他们槽的内容已更改,在接收侧,每个对等点根据新时隙更新消息的到达来跟踪其每个对等点的时隙表的状态。

但请注意,网络拥塞和背压可能会导致这些更新延迟,因此,接收方的视图仅最终与发送方时隙表一致。

除了工件信息之外,每个槽还具有版本号,该版本号会随着验证池的每次更新而全局递增,以便接收者在收到更新消息时可以通过仅接受版本号高于其版本号的更新来知道它是新更新还是旧更新。

图片
图 3:槽表抽象数据结构示例

图 3 显示了此过程的示例:发送方生成工件 A 到 F,它还会在此过程中删除其中一些工件,由于删除不一定会传播到对等方,因此它们在其对等方槽表的视图中可能仍具有已删除的工件,这是正确的,因为槽的内容最终会更新并且会传播。

对于发送端的每个槽,都会生成一组新的异步任务(即绿色线程)—— 每个对等点每个槽一个任务,由于任务非常轻量级,因此对于更大的子网也可以扩展,每个任务负责可靠地推送相应槽和相应对等点的槽更新消息。

这意味着任务会重试推送更新,直到收到确认,每当槽的内容发生变化时,任务就会停止尝试推送旧内容,而是开始尝试推送新内容,慢速对等点可能会缓慢获取更新,但不会干扰更快的对等点。

这种方法有点像是上面反压讨论中方法 2 和 3 的结合(在网络层缓冲消息并丢弃消息),它解决了反压问题,同时又不放弃弹性和活跃性。

这种方法的正确性源于前面提到的客户端的属性 P1,即活动工件的有限数量,它保证了C槽在任何情况下都是足够的,因此槽可以被重用。

上述协议不仅允许对等点同步其已验证工件池的内容,而且还允许节点确保其对等点一次通告的工件数量不会超过 C 个,如果更新消息的槽号大于 C,则接收方可以立即推断出发送方的不当行为。

当节点在接收端注意到某个工件不再存在于其任何对等方的槽表中时,该节点可以安全地从未经验证的工件池中删除该工件(如果它仍然存在),或者停止任何尝试如果尚未检索到此工件,请检索它。

属性 P2:前面提到的工件的显式过期,保证任何对等点不再需要此类工件,因此,槽表还对未经验证的工件池的大小施加了隐式限制:未经验证的池最多只能包含来自诚实对等方的 C 个工件(因为它们在经过验证的池中应该具有大致相同的内容),并且,每个恶意对等点至多 C 个工件,因为它可能会使用 C 个完全不同的工件向 IC 发送垃圾邮件。

不到 1/3 的节点可能是恶意的,因此未经验证的池的总大小不能超过 C*4*n/3 个工件。

您可能已经注意到,上述设计描述仅涉及工件,并未提及广告,原因是广告仅仅是为了提高带宽利用率的优化,新的 P2P 层仅对大型工件使用广告(当前阈值设置为 1KB)。

小于阈值的伪影在时隙更新消息中发送,因此不必稍后由接收器显式请求,对于大于阈值的工件,会生成广告并在更新消息中发送,然后,接收者客户端可以决定是否要请求它以及从哪个对等点请求它。

提高性能

使用 QUIC 的异步实现以及较小工件的直接推送提高了网络性能,因此也提高了共识性能。

图片图片
图 4:(顶部,现有 P2P 层/底部,新 P2P 层)在 60 个节点的子网上,在有或没有重子网负载的情况下,随时间变化的块率,并人为增加了链路延迟,垂直线表示高负载的结束。


图 4 显示了我们为比较现有 P2P 层和新 P2P 层的性能而进行的一项实验的结果,在本实验中,我们在一个数据中心中以每秒 200 x 100 KB 请求的负载运行了一个 60 节点的子网,并测量了共识区块率。

图表显示了随着时间的推移,每个节点都有一条线的块率,我们在两个实验中的所有网络链路中人工添加了 80 毫秒往返的链路延迟,以模拟地理上分布的子网。

上图显示了现有 P2P 层的块率,虽然子网成功取得进展,但在负载较高时,出块率非常不稳定,一旦负载结束,它就会恢复正常,但在高负载期间,这意味着子网范围内的块率较低,因此用户感知的延迟较高。

下图显示了新提出的 P2P 层的块率的健壮性,即使在重负载下,子网仍以非常稳定的块速率运行。

结论

用于共识和类似客户端的新 P2P 层提高了互联网计算机的性能,实现了更好的可扩展性,降低了代码复杂性,并改善了不完善网络条件下的行为。

它已经在某些子网上启用,仅适用于与 HTTPS 呼出相关的工件,并且 DFINITY 基金会很快将提交为其他客户端启用它的建议。

如果被接受并执行,互联网计算机的整个 P2P 层将转向使用 QUIC 而不是 TCP,从而使互联网计算机的网络层更加健壮、可扩展和高性能。

了解有关互联网计算机的更多信息:

图片图片

#内容挖矿 #P2P #ICP

你关心的 IC 内容

技术进展 | 项目信息 | 全球活动

收藏关注 IC 币安频道

掌握最新资讯