声明:本文旨在传递更多市场信息,不构成任何投资建议。文章仅代表作者观点,不代表火星财经官方立场。
边肖:记得要集中注意力。
来源:波尔卡世界
原标题:《Polkadot 的跨链消息传递方案(XCMP)》
作者:法特梅什拉济,洛根塞瑟,阿利斯泰尔斯图尔特,罗布哈伯米尔,加文伍德
最近几个月,Web3基金会的研究团队一直在对跨链消息传递(XCMP)的功能进行文本概述。它是Web3基金会ace项目Polkadot的关键组成部分。我们很高兴与您分享我们的工作!
跨链消息传递(XCMP)方案是Polkadot协议的一个子集。它定义了除了共享中继链的安全性之外,在没有其他信任假设的情况下,消息如何在并行链之间传输。阐述了并行链的消息传递协议,很大程度上依赖于Polkadot独特的中继链架构和设计。
该协议包括:
就共识而言:消息的排队和排序机制。
结合中继链的其他部分,尤其是爷爷最后的决定机制:数据可用性。
结合并行链验证功能:消息输入输出。
此外,本文还回顾了交付,如何实现一致的历史,以及防止拒绝服务攻击的想法。最后,我们用SPREE回顾了XCMP,总结了XCMP实现的特性。
语义和网络细节(比如对等发现)在本文中没有提及。
介绍
圆点“1.0版”的一个关键特性是让原本孤立的并行链以安全和不信任的方式互相发送消息。
为此,我们用与定义事务相同的方式定义消息。两者都指来自接收链外部的数据,两者都暗示并要求链根据其内部逻辑来响应数据。考虑到实际系统的延迟水平,链不能拒绝或混淆数据的含义。例如,在比特币的背景下,这一属性意味着比特币中有缺陷或恶意的矿工无法重新分配资金,因此它是加密经济良好共识体系的基础。
事务消息和事务消息的关键区别在于,事务包含一个签名来证明数据的来源(从而证明指令的权威性)。至于消息,只通过Polkadot的反拜占庭加密经济验证基础设施来证明来源,这在很大程度上与以太坊契约之间的消息传递方式相同。
例子
在详细讨论XCMP的每个组件之前,让我们举一个例子来说明如何将智能合约的并行链(图1中的A)上的出站消息连接到分布式金融(DeFi)的并行链(图1中的B)的入站队列,以便从DeFi的并行链的整理器进入下一个候选块。
在中继链300的块高度,智能合同并行链为端点“32”发起消息,该消息是DeFi并行链的并行链ID。消息将首先包含在智能合约并行链的出站或出站队列中。
智能契约并行链的所有节点将开始在网络中八卦消息(参见下面的“交付”一节)。如果智能契约链中的某些节点也是DeFi链的完全节点,而这些节点通过转发消息充当两个八卦网络之间的粘合剂。如果没有要遍历的网络共享节点,则调用回退(参见下面的回退部分)机制。
一旦消息到达DeFi并行链的收集器,它们将接收该消息(以及它接收的任何其他消息),并将其输入入站或入口队列,以便在其下一个候选块中进行处理。
图1:显示了两个并联链A和B对应的采集器和所有节点,两个节点同时是并联链A网络和并联链B网络的所有节点。
DeFi并行链上的收集器将生成干线链块301的候选块。这个候选块需要证明它从A块执行的消息是正确的消息。中继块300包含A中的块的并行链路块报头,即,包括可用于认证消息的消息根散列的少量数据。
该候选块将包括中继链轻客户端证明消息根在中继链中,并将该证明与发送链发送的消息相结合。
DeFi并行链的并行链验证器将能够使用这些证明来验证来自DeFi并行链的建议候选块的完整性。随后,智能契约链的原始消息被包含在DeFi并行链中,该并行链不需要额外的节点来提供安全性,并且依赖于来自Polkadot的共享安全性。
以及对消息进行排队和分类。
Polkadot中并行链的每个块可以生成一个空消息列表,并将其发送给其他块。这些列表被称为出口队列。一旦消息被发送,它就进入并行链的入口队列。并行链必须按顺序处理条目列表。
收集器或验证器尝试为并行链的出口队列收集消息。它调用并行链的入口,在传播池中搜索相关消息,等待没有被八卦的消息。
传递信息
假设每个平行链具有所有节点的连接网络。假设每个完整节点都知道系统中其他完整节点的子集,我们称之为邻居节点。请注意,我们对这些网络的拓扑和直径没有任何假设。
发送消息最简单的方法是使用八卦协议。回想一下,同龄人经常互相交流对当前假期的看法。为了实现更高效的传递,未发送的消息将只被传递到具有相同视图的相邻节点。
如果两个网络之间有公共节点,消息将从一个平行的链式网络传播到另一个。
图2:显示了Gossip完成的消息传递过程。让我们假设这个消息是由Pink collator发送的,它产生了最新的并行链块。
回滚传输
但是,如果接收方的并行链验证器意识到消息没有在接收方的并行链中传播,那么它们将向发送方的并行链的并行链验证器请求消息。他们一旦收到这些信息,就会在接收的平行链网络中八卦。
图3:显示了当发送和接收并行链不共享任何完整节点时的回滚交付。
回滚交付机制如图3所示。我们假设并行链A要向并行链C发送一条消息,但是并行链C并没有与A共享所有节点,一旦并行链C的并行链验证器注意到消息还没有到达,它们就会向发送并行链验证器发送请求,由发送并行链验证器负责保存其并行链的外发消息。一旦请求的响应到达,并行链C的验证者就会在并行链C中八卦。
获得一致的历史记录。
我们希望从XCMP中得到的一个关键特性是标准化并行链块,也就是那些我们最终认可的并行链块已经发生了。这意味着在当前的并行链块中,它只作用于那些从并行链块发送的消息,这些消息既规范又早于当前的并行链块。
中继链定义了所有并行链的历史。例如,来自并行链B的块报头在中继链块301中,可以说中继链块301作用于块300之前的所有消息。如果它对块300之前的所有消息起作用,它将对由并行链A的块发送的消息起作用,并且它将仅在并行链A的块报头出现在中继链300的块中或更早时起作用。
这意味着中继链需要在验证消息方面发挥作用。但是,由于我们不能在这些并行链块头中放入大量数据,中继链本身应该没有消息的有效载荷。相反,我们通过使用嵌套的Merkle树来有效地维护一致的历史。对应于发送的消息的并行链块头将包含消息根散列,它是Merkle树的根。依次地,这个Merkle树的叶子是从这个并行链到另一个并行链的消息散列链的块头。
这意味着存在一个包含每个消息的散列的散列序列,以便可以验证从一个并行链发送到另一个并行链的所有消息。这允许收集器通过首先显示消息根在中继链中,然后证明这些是来自消息根散列的消息,证明它们处理消息并且只处理它们应该处理的消息,来构造由许多散列组成的证据。
有关此主题的更多信息,请参见:
https://research.web3.foundation/en/latest/polkadot/XCMP.html
以及输入和输出验证。
回想一下,Polkadot由一条中继链和若干条并联链(暂定最多100条)组成。
并行链块头包含外发消息的消息根。为了基于特定的中继链块生成并行链块,收集器需要检查在中继链块和包括并行链的最后一个并行链块头的中继链之间构建了哪些并行链头。对于这些消息,并行链需要对相应的消息数据进行操作。
图4:显示了在第0、1和2轮中为三个并行链A、B和C构造的并行链块,以及在这些并行链的每一轮中发送的消息。
状态转换验证函数(STVF)使用验证函数来验证输入消息是否被执行。验证函数是WebAssembly的一部分,它检查并行链的状态转换是否实际有效。它将并行链的新状态和一组输出消息与并行链的先前状态摘要、并行链块数据和从其他并行链或中继链准确路由的一组输入消息相关联。
图4示出了一个示例,其中对于回合0、1和2,显示在三个并行链A、B和C之间生成的并行链块和消息。假设平行链B在第0轮不产生任何平行链块,平行链C在第1轮不产生任何平行链块。第一轮产生的并行链块B1需要将消息m1作为输入消息,并通过在第一轮发送消息m3来回复并行链A。在第二轮中生成的并行链块C1需要在其未处理的条目队列中获取消息m2和m4。
消息的可用性
一旦消息包含在退出队列中,收集器和发送并行链的所有节点都会保存它们。当发送并行链块的头包含在中继链中时,并行链验证器也将保留该消息。收集器和接收并行链的所有节点还需要知道并行链之间发送的消息的有效负载。需要知道消息存在的所有其他实体只能存储哈希,哈希可用于验证消息。
为了确保可用性,我们要求所有验证者持有擦除编码的片段,可以恢复任何并行链消息。这些擦除代码片段由发送并行链的并行链验证器生成和分发。三分之一的纠删码片段足以恢复所有消息。最终确认需要投票者(验证者)收到这些纠删码片段,否则将会受到投票惩罚。因此,在最终确认时,2/3的擦除代码片段必须可用;因此我们可以确保最终消息也是可用的。
防止DoS攻击
注意,XCMP的目的不是指定消息的标准格式。但是,每个并行链向另一个并行链发送的消息的总大小是有限制的。此外,gossip协议使用边界传输来避免大量信息。
对于不经常在中继链中放置块的并行线程,未处理的消息队列可能会显著增长。为了限制这一点,发送并行链将为该链维护一个具有大小限制的退出队列。只有当它知道收到旧消息时,它才能删除它们。接收链发出一个水印,指示它在这个并行链中已经处理了多少块。发送链可以使用此水印来简化其退出队列。
此外,我们计划启用接收并行链来阻止另一个并行链发送消息(此功能尚未实现)。并行线程也可以禁用XCMP功能,以避免处理大量消息。
XCMP和SPREE
spree(Shared Protected Runtime Execution Enclaves)是类似于运行时模块的逻辑段,但它们位于中继链上,它们的功能可以由并行链选择。
这些逻辑片段是通过治理机制或并行链上传到Polkadot的WebAssembly代码块。一旦这些逻辑被上传到Polkadot,所有其他的并行链都可以决定加入这个逻辑。SPREE模块会保持自己的存储独立于并行链,但是可以通过带并行链的接口调用。并行链将同步向SPREE模块发送消息。有关SPREE的更多信息,请参考其wiki文章:
https://wiki . polkadot . network/docs/en/learn-spree .
这些逻辑片段可以将XCMP消息寻址到SPREE模块,并保证当对该消息执行操作时,它将使用来自该SPREE模块的与任何其他并行链相同的代码。SPREE模块对于整个XCMP架构非常重要,因为它们为在目标并行链上执行代码的特定解释提供了保证。虽然XCMP保证了消息的传递,但它不保证代码的执行,也就是说,接收并行链将如何解释消息。SPREE模块的代码更新会和平行链同步。除了安全性方面的好处,这意味着消息格式可以改变,而无需跨多个并行链协调更新。
总之,虽然XCMP完成了去信任消息的传递,但是SPREE是消息的去信任解释,也是XCMP有用性的关键部分。发送到SPREE模块的XCMP消息,让调度消息的开发者和用户清楚地知道如何处理消息。
XCMP属性摘要
XCMP方案可以实现以下属性:
解除信任:因为同一组验证器确保一个并行链与另一个并行链的安全性,同时确保正确的消息传递,所以XCMP所需的信任不会超过单个区块链所需的信任。
一致性:我们绝对保证收到的消息与发送的消息完全相同,即使有任何链重组。
有效性:Polkadot保证消息不会丢失并保持可用。这是通过分发可用于重建消息的擦除代码片段来实现的。
保持正确的顺序:通过输入/输出验证,可以保证保持并行链块输出消息的正确顺序。
效率:该协议避免了过多的带宽占用,并允许消息尽快到达。