其他
互联网计算机的新 P2P 层引入了用于状态同步的 QUIC
介绍
互联网计算机区块链依赖于点对点(P2P)协议,该协议在每个子网的节点之间分发消息,这些消息由互联网计算机协议的客户端生成,这些客户端各自实现了更高层的协议,例如互联网计算机共识协议或状态同步协议,本文稍后将详细解释。
本质上,每个客户都有非常不同的要求和行为,到目前为止,所有协议客户端都使用单个 P2P 组件来进行所有子网内通信,这种方法导致代码复杂且性能不佳,使得在实现中引入更改变得更加困难。
用于状态同步的新 P2P 层解耦了不同客户端的 P2P 通信,简化了代码,并且可以为互联网计算机引入新功能和改进的网络,其中部分是通过采用 QUIC 传输协议来实现的,该协议取代了当前使用的 TCP,在互联网计算机的设置中,QUIC 比 TCP 具有许多优势 —— 首先也是最重要的是,多路复用多个流的能力。
在这篇博文发表时,NNS(管理互联网计算机的 DAO)已经开始推出用于状态同步的新 P2P 层,作为对社区提议为八个子网采用副本版本 cabe2ae3 的响应,这意味着新的 QUIC 传输现在在所有互联网计算机子网上都处于活动状态,然而,状态同步目前仅在较小的子网集中使用新的 P2P 层。
本文详细解释了技术变化,以及如何利用新的 QUIC 功能为互联网计算机创建新的、改进的 P2P 层。
互联网计算机的点对点协议
互联网计算机的点对点(P2P)层负责节点子网内的消息传递,每个子网运行一个单独的 P2P 网络,每个子网内的节点使用该网络相互发送消息。
在这一层之上,有多个组件使用 P2P 层在对等点之间交换消息,其中最著名的是互联网计算机共识协议(引用 ICC 论文),其他组件(包括状态同步协议)也使用 P2P 层与同一子网上的对等方交换消息。
互联网计算机的状态同步协议
图 1:互联网计算机的状态同步协议
在非常高的层面上,互联网计算机的状态同步协议使节点(例如落后的节点)能够同步子网的复制状态,而无需(重新)执行相应子网区块链中的所有区块,相反,他们可以立即下载所需的状态,并使用此状态同步协议验证其相对于子网链密钥的真实性。
状态同步协议的工作原理如下:最新节点每数百轮(通常是 500 轮)创建一个所谓的检查点,这涉及将复制的状态写入磁盘、计算该状态的哈希值,以及通过将哈希值包含在所谓的追赶包(CUP)中来尝试就该状态达成共识。
哈希值的计算方式使得不可能得出具有相同哈希值的两个不同状态,这意味着对于特定高度存在商定的 CUP 也意味着:1) 大多数节点都同意在特定高度的状态上,并且 2)大多数节点实际上能够将该状态作为状态同步的一部分。
该过程如图 1 所示:节点定期向同一子网上的对等节点通告它们在本地可用的所有状态版本(称为 advert),这个版本本质上就是状态对应的区块的高度,以及这个状态的哈希值,如果节点看到比其本地状态更新的 CUP,则它可以断定自己已经落后,并且可以在下次看到该状态的广告时向其对等方请求与该 CUP 相对应的状态。
该协议还确保节点可用的状态中未更改的部分不会重新下载,而是可以直接由节点使用,状态可以被视为文件树,其中每个文件又被分割成块,恢复节点可能已经拥有许多块,但可能不是全部,一个节点可以同时从多个对等点请求块,类似于 BitTorrent。
恢复节点首先请求一个称为清单的特殊块来自发送触发状态同步的广告的对等方,该清单包含与该状态对应的所有文件和块的列表,每个文件和每个块还包含一个哈希值和一些元数据,与 Torrent 文件类似,清单不包含对等点信息,其内容不依赖于任何特定对等点,清单的哈希值是包含在 CUP 中的哈希值。
一旦清单的哈希值与 CUP 中包含的哈希值进行了验证,就可以得出结论:清单中的文件和块哈希值是真实的,并且可以通过将文件和块的哈希值与清单中包含的哈希值进行比较来验证文件和块,这种机制确保节点不能互相欺骗来下载和使用假状态块。
下载清单后,恢复节点确切地知道它丢失了哪些块,然后,它可以向其他对等点(所有通告相同状态的对等点)触发多个同时下载请求,以尽快获取丢失的块。
使用 QUIC 简化 P2P 状态同步
图 2:用于状态同步的新 P2P 层的设计
到目前为止,状态同步协议已经使用了互联网计算机现有的 P2P 层,如上所述,该 P2P 层多路复用来自多个客户端的消息,并在同一子网上的对等点之间传播。
然而,它是为分发相对较小的消息而设计的,这是大多数客户端的要求,但不是状态同步协议的要求,因此,到目前为止,我们只有一个单一的整体 P2P 协议来尝试解决所有客户端的问题,然而,这使得代码变得比必要的更加复杂并且更难以改进。
出于这些原因,将 P2P 层分为两层非常有意义:一层用于状态同步,另一层用于其余(现有)客户端,加上我们不断努力简化和增强其他客户端的 P2P 层,这将形成一个更简单、更高效、更安全的新 P2P 层。
用于状态同步的新 P2P 层(如图 2 所示)不会更改状态同步协议,而仅更改其下面的网络层并使用新的传输组件,传输组件是 P2P 用于创建和维护对等点之间的连接的组件。
对于用于状态同步的新 P2P 层,我们创建了一个新的传输组件,它支持两个异步 API 函数:
push(消息,peer_id) rpc(消息,peer_id)->response
由于传输使用 TCP,且具有单个流,因此如果不在传输中保持状态并跟踪请求和响应,就不可能将请求与响应相关联,新的传输组件使用 QUIC(IETF 草案链接)传输协议,QUIC 是一种现代传输协议,在用户空间的 UDP 之上实现。
与 TCP 相比,它具有许多优点,在我们的案例中,最重要的优点是能够通过一个连接复用多个流,其他一些区块链已经使用 QUIC。
在这个新的传输组件之上,将运行两个新的 P2P 组件:一个用于状态同步,另一个用于其他客户端(见下文)。
用于状态同步的新 P2P 组件使用新的传输层,如下所示:它定期调用当前状态的 Push(),将它们通告给所有对等点,当收到此类广告时,如果节点发现它落后了,它会使用 rpc() 调用从对等方请求特定块。
图 3:通过 QUIC 连接进行多路复用
切换到 QUIC 的好处
QUIC 流复用使我们能够将 P2P 层代码转变为完全异步,从而更好地利用可用的CPU和带宽资源,它还帮助我们避免请求处理中的队头阻塞,并提高代码的可靠性。
使用 QUIC 的另一个好处是,由于连接的多流结构,每个响应都与相应的请求相关联,而无需在应用层维护状态。
为其他客户端使用新传输
如上所述,我们还致力于改进其他客户端使用的 P2P 层,我们的计划是让它使用新的传输组件,因此最终将来自所有客户端的消息复用在同一个 QUIC 连接上,从而废弃 TCP 传输,使用 QUIC 可以帮助动态地确定不同客户端流量的优先级。
例如,由于状态同步可能是一项占用大量带宽的操作,因此我们可能希望将其优先于其他客户端,以便它尽快完成,然而,如果同一子网上的许多节点都在进行状态同步,我们可能还想确保共识协议优先于状态同步,否则可能进展不够快。
目前正在实施的改进后的 P2P 共识层在 P2P 和共识层的可扩展性、性能和可靠性等多个方面显著改进了现有的 P2P 层,我们将很快分享有关此主题的更多信息。
改进状态同步协议的方法
通过对 P2P 层的更改,可以更轻松地对其进行扩展以适应状态同步协议中的新功能,其中一项功能是节点能够从不具有完整状态的对等方下载块,这将显著提高协议的性能,特别是当同一子网中的多个节点需要同步其状态时。
阅读 PODC 2022 中有关互联网计算机共识协议的论文:
dl.acm.org/doi/abs/10.1145/3519270.3538430
开始在互联网计算机上构建:
了解有关互联网计算机的更多信息:internetcomputer.org,在 Twitter 上关注技术更新:@DFINITYDev。
作者:Yotam Harchol翻译:Catherine
- 往 期 推 荐 -
你关心的 IC 内容
技术进展 | 项目信息 | 全球活动
长按关注 IC 微信公众号
掌握最新资讯
*添加小助手微信 comiocn 进交流社群