简介:上一篇波尔卡多查溪岸啤酒(XCMP),干杯!本文主要介绍了XCMP的一些基本内容,以及XCMP消息的路由方法。
“一般来说,XCMP主要分为两部分:XCMP消息的分发和XCMP消息的访问。”本文主要介绍XCMP消息的访问。
文末有惊喜:剩下的三个问题准备好接手了吗?
如果你能理解上一篇文章的内容,恭喜你,已经很厉害了!
但是,请做好心理准备,因为接下来的内容会比较复杂,我们会尽量用最清晰的方式解释。
XCMP消息访问从接收链路接收到消息后,接下来的流程就是处理消息,然后把消息和相关证书放到一个新的块中交给验证者,最后确认这个块。这个过程很复杂,涉及许多新的数据结构。
我们来看看接下来要用到的名词的一些定义:
第十段
表示平行链x或平行螺纹x。
因为并行链需要购买专门的Slot槽来访问Polkadot,槽数少且贵,所以更精简的方式是使用并行线程。并行线程访问Polkadot不需要专门买一个槽,而是按块付费。并行线程和并行链在开发上基本相同,也可以使用Polkadot的各种功能。
平行链
当我们说平行链时,我们实际上是指由平行链收集器节点组成的区块链网络。如果提到验证者,一般会特别指出这是验证者节点。
好了,让我们借助一个看起来有点复杂,但实际上很清楚的图来解释XCMP消息的访问。
上图是我们自己总结的XCMP消息访问全景图,基本上概括了XCMP消息访问的所有内容。
该图描述了Para B想要向Para A发送消息m2020.虽然Para也可能表示并行线程,但我们还是以并行链为例(并行线程也差不多)来解释一下这个图,解释一下XCMP的消息访问流程。
在并行链B向并行链A发送XCMP消息之前,需要先打开一个从链B到链A的通道,然后下面的流程是:
1.并行链B发送消息m2020(将其放入退出队列)并将该消息包含在新发送的块(假设为块#3)中。
2.作为发送链,并行链B会为每个接收链维护一个MQHC(消息队列哈希链),可以看作一个链表(如图,并行链B建立了到A、C、D、E的通道,发送跨链消息,所以并行链B有四个MQHC)。
MQHC链的每个元素对应一个跨链消息,元素的结构是三元组(parent_hash,message_hash,block_number)。Parent_hash是该元素的父元素的hash,message_hash是跨链消息的hash,block_number是父元素消息发出时中继链的块号(可以作为全局时间)。并行链B的所有MQHC(此处为4)的头元素将作为Merkle树的叶节点组成一棵树,其根为Message Root,简称MR。先生有一个非常强大的角色。如果有一个MQHC元素的MR,plus Merkle路径,可以验证MQHC上的元素,加上发送链的消息队列中的原始消息,可以验证所有已发送但未处理的消息。MR将被存储在并行链B的块头中(这只是块#3的块头)。除了MR,块#3的块头中的bitfield和watermark也是与XCMP相关的数据。Bitfield是一个位域数组,每一位的意义是发送链是否向这个块中该位代表的接收链发送了跨链消息。假设比特域的比特1-4表示由链B发送到链A、C、D和E的跨链消息,则块头中的比特域=1111表示该块包含到这四个链的跨链消息。水印可以理解为跨链消息的序列号,但这个序列号不是一维的,而是二维的。水印的结构是(block_number,para_id),block_number中继链的块号,para_id是并行链的id。由两个水印组成区间可以确定一个消息集。例如,如果w1=(100,A)和w2=(300,A),则间隔[w1,w2]表示在从中继链的块#100到块#300期间,链B发送到para_id=A的该链的所有消息。3.当消息m2020被并行链B包含在块中并最终被验证者验证确认后,其块头将被存储在中继链的块中(如本例中B的块头#3)。这样中继链就得到了链b的block #3的MR、bitfield、watermark三个关键数据结构,根据这三个数据结构,中继链会做一些有趣的事情。
4.中继链上有一个叫CST(信道状态表)的数据结构,所以中继链会使用新提交的并行链块头中的MR来更新其CST中对应的行。
CST的功能是跟踪由发送链发送到接收链的消息的状态,从而提供一个通道的MQHC的链表头的证明。CST作为一个表,它的行标签是发送链的ID,它的列标签是接收链的ID。每个条目实际上可以代表一个通道,条目的结构是一个二元组(sender_mr,block_number)。通过条目的block_number列对应的para_id就很容易知道可以获得水印。Sender_mr表示信道的最新mr,block_number是最后一次更新条目时中继链的块号。CST实际上是按行存储的,一行会有很多项。因为是同一行,所以这些条目的发送链是一样的;并且因为传输链都是相同的,所以对等列表中最新的MR也是相同的。因此,当新的并行链块头到达时,CST逐行更新。CST其实除了表还有第二个部分,就是map (para_id=row_root)。Row_root是由CST行中的条目组成的Merkle树的根。这样,只要一行的一个条目发生变化,它的row_root就会发生变化。Row_root将继续构造一棵Merkle树作为叶子,它的根是XCMP_Root,它将与主干链的状态根相关联。5.当并行链A开始构建新的PoV块时,它将需要其所有消息的证明。
链A需要从中继链获取:以A为发送链的MR的轻客户端证明和以A为接收链的所有通道的水印的轻客户端证明,并且这些证明需要同时构建,这样这些证明才能全部基于同一个状态根;的中继链;轻客户端证明由Merkle证明转换而来。因为从中继链的状态根路径到CST的条目实际上分为两部分,先从状态根到row_root,再从row_root到条目。所以列表中从状态根到MR的整个Merkle证明称为“嵌套证明”。可以通过中继链获得信道的最新消息根MR。如上所述,位于MQHC列表头部的MR,Merkle root,MQHC和对应消息的原文可以验证该通道当前未处理的消息。这样,这个构造块将处理所有尚未处理的消息。因此,链a还需要从MR到MQHC元素的所有消息的merkle根,以及消息的原始文本。这样,包含消息hash的MQHC元素——消息根Mr ——组成的CST条目——的row_root ——State Root就可以整合成一个总证明,从中继链的状态根到跨链消息的hash。最后,PoV块需要包含所有原始消息、它们对应的MQHC元素以及它们的完整证明。还有一些细节:
1)在并行链状态下,不仅要存储MQHC的链表头的Merkle证明,还要存储MQHC的所有元素的Merkle证明(它们也已经是链表头了)。
2)如果确认消息被执行,MQHC中的链表可以丢弃被执行消息的对应元素(但不一定要求立即丢弃,因为可以存储一段时间发挥冗余作用)。
Polkadot官方网站上有一个简单的例子,用于构建上面第5点中的——并行链PoV块。
以上图中的链条b为例。链B向链A发送跨链消息,根据信道状态表,链A上一次处理链B发送的消息是在中继链块号为rc_1,上一次水印1为(rc_1,A),当前水印2为(rc_6,A)时。
假设要在链A中生成一个新的块,它必须处理[水印1,水印2]之间的所有跨链消息。链A封锁所需数据为(以下1、2、3为全部证明):
1)从State Root到CST row_root的主干链的Merkle证明(红色部分);
2)由CST row _ root到(MR,block_number)组成的条目的Merkle证明(蓝色部分);
3)从Mr到MQHC列表头的Merkle校样(橙色部分);
4)所有消息对应MQHC的元素(图中左下方的绿色矩形);
5)所有消息的原文(图中左下方绿色信封);
最后,当并行链构造PoV块时,验证器将对其进行验证,如果通过验证,将释放该块。然后,块报头将转到中继链,中继链将更新其状态。发送链也可以通过查询中继链知道它发送的消息已经被最终处理。
摘要
这篇Polkadot XCMP干货文章到此结束。这杯茶(x)、溪(c)、岸(m)、啤酒(p)是什么味道?
XCMP的内容,尤其是本文提到的XCMP的消息访问部分,还是比较复杂的,使用了很多新创建的概念,比如消息哈希链表(MQHC)和各种类型的Merkle树(消息树,由CST项组成的树,由CST行组成的树,状态树等。).一时间真的很难理解。建议你多看几遍(重点:可以仔细看看我们画的XCMP消息访问图)。
设计之所以这么复杂,是为了XCMP的设计目标:快速、有序、可验证、无遗漏。
XCMP的设计主要分为消息分发和消息访问。现在我们来回顾一下Polkadot是否实现了它的设计目标:
消息分发:直接通过并行链发送消息,不需要中继链实现快速。
消息访问:通过水印及其相关机制达到有序无遗漏的目的;可验证通过MQHC,各种Merkle树和证明。
综上所述,Polkadota XCMP的设计基本达到了目的。但由于XCMP设计的复杂性,目前仍在实现中,未来可能会有一些变化,让我们一起关注一下。
课后小练习一共准备了五个小题目。
(都是单选,包括上一篇文章的两个题目。收集你的五个答案,给橘子。前五名没事的朋友都有惊喜和礼物。)
1.以下内容中,什么不是Polkadot XCMP设计的目标?
[a]快
[b]消除跨链消息的“饥饿”现象
c .高效率
[d]可核实的
2.根据本文内容,目前Polkadot XCMP中不可能的消息路由方式是什么?
[W]发送链将跨链消息发送到它自己的完整节点,该完整节点将消息转发到接收链。
【X】接收链的收集者去找发送链的钓鱼者获取跨链消息,然后在这个链的网络中八卦这个消息。
[y]发送链向中继链的所有节点发送跨链消息,中继链的所有节点将消息转发给接收链。
[Z]接收链的验证者主动去找发送链的验证者获取跨链消息,然后在本链的网络中八卦这个消息。
3.以下关于MQHC的说法有什么错误?
[h] MQHC会存储在并行链的块头中,由于中继链在并行链的块头上,中继链也会存储MQHC。
[I] mqhc表示消息队列哈希链,MR表示消息根。
【J】J】MQHC的链表头作为叶节点形成的树的根称为消息根。
[k]当Merkle Proof、MQHC链表头和链表头中包含的原始消息有MR和MQHC链表头时,可以证明链表头中原始消息的存在性和正确性。
4.以下关于CST的陈述哪一项是正确的?
【L】CST的全称是通道发送表。
[M] CST按列存储,每列的条目对应同一个接收链。
[n] CST除了一个表之外还有第二部分mapping (para_id=row_root),其中row_root将继续构造一棵Merkle树作为叶子,它的根是XCMP_Root。
[o]当新的并行链块头到达时,中继链将根据块头中的事务树的根更新CST。
5.以下关于接收链构造PoV块的说法,哪一项是错误的?
[a]从中继链的状态根路径到CST的条目分为两部分,先从状态根到row_root,再从row_root到条目,所以直接从状态根到条目中MR的整个merkle证明称为“嵌套证明”。
【B】B】PoV块的块移除一步完成,没有明显的先构建后验证确认的分割阶段。
[c]基于状态根的证明需要同时构建,这样这些证明才能基于中继链中的同一个状态根。
PoV块至少需要包含:所有原始消息、它们对应的MQHC元素以及它们的完整证明。
作者简介
楼松
来自致力于“建设区块链互联网络,开辟价值孤岛”的BitXHub团队
研究方向:Web3