在我前两篇文章里(?介绍了XCM的设计和版本结构的基础知识。在本文中,我们将深入研究它的底层设计和执行模型。因为XCM基于XCVM指令集,希望本文可以帮助你熟悉这个机器架构。
XCVM是一个高级别、非Turing的完整虚拟机。它是基于寄存器的,并且有几个专用寄存器,其中大部分持有高度结构化的数据。与通用处理器不同,XCVM的寄存器不能随意设置为任意值,但有严格的机制来控制它们的变化。除了某些与本地链状态交互的方法之外,没有额外的“内存”。没有循环的可能,也没有显式的分支指令。
我们已经介绍了其中两个登记册:持有登记册,能够临时持有一项或多项资产,并可以通过从本地链中提取资产来填充,或者通过从可信的外部来源接收资产;以及来源登记册,在执行开始时,该登记册持有共识系统的位置,从该系统当前XCM执行起源,并可能只突变到一个内部位置或完全清除。
在其他寄存器中,三个涉及异常/错误管理,两个涉及跟踪执行权重。我们将在本文中了解它们。
执行模型
如前所述,没有显式条件指令或循环原语可以多次重新执行相同的指令。这使得预先确定程序的控制流变得相当琐碎。该属性非常有用,因为我们希望确定XCM消息在执行点之前可以使用多少执行时间(称为整个Substrate/Polkadot的权重)。
允许图灵完备语言的系统实际上不能直接从程序中计算最坏情况的执行时间,这是由于图灵的完备性。他们通过要求用户预先确定程序的执行资源来解决这个问题,然后在程序执行时对其进行计量,如果超出了所支付的金额,就中断它。有时,在事务执行之前,事情会发生变化,权重会变得不正确。令人高兴的是,像XCVM这样的非Turing-Complete的虚拟机可以避免这种度量和权重的需要。
游戏巨头EPIC Games申请Megaverse商标,计划在元宇宙内容市场投资10亿美元:2月7日消息,游戏巨头EPIC Games已申请“Megaverse”商标,其中描述除了与游戏内容相关之外,更结合各类虚拟实境内容应用,旨在扩大布局元宇宙市场。
不过,目前还无法确认EPIC Games将会如何使用Megaverse商标,也无法确认此商标名称是否与EPIC Games前身EPIC MegaGames有关。另据EPIC Games首席执行官Tim Sweeney透露,该公司还计划在元宇宙内容市场投资 10 亿美元,除了将《堡垒之夜》(Fortnite) 衔接各类元宇宙应用,更预期藉由其 Unreal Engine 打造更多元宇宙应用发展。[2022/2/7 9:35:05]
权重
权重通常表示为一个代表性硬件执行给定操作所需的整数。正如我们在BuyExecution指令中看到的,在处理某些指令时,XCVM包含了执行时间/权重的概念。
没有权重计量,但是考虑到XCVM程序最终获得的可能性小于最坏情况下的重量预测,我们有一个名为剩余权重寄存器的寄存器。因为我们可以准确地预测他们将占据多少权重,所以大多数指令不接触它。然而,有时候,最坏情况下的权重预测是一个高估的情况,只有在执行时,我们才知道有多少。虽然占块执行时间的权重估计过高的XCM消息,跟踪原始权重被高估的数量,并从帐户中减去它,允许链优化其块执行时间的配额。
流量控制和例外情况
到目前为止,我们对XCVM的处理中已经隐含了另外两个寄存器,但是了解它仍然很重要。首先,有一个程序登记册,它存储当前正在执行的XCVM程序。其次是程序计数器,它存储当前正在执行的指令索引。当程序寄存器被更改时,这将被重置为零,并在每个成功执行的指令结束时增加一个。
GavinWood:Kusama平行链预计下周一上线:波卡创始人GavinWood在波卡社区大会PolkadotDecoded表示,Kusama平行链预计下周一上线。“这个平行链指的是Shell平行链(白板链),我在过去几周里写出了它的Runtime,它非常非常简单,可能是目前为止最简单的Runtime了。它其实几乎做不了什么,唯一能做的就是等待着被批准升级。但这是比较重要的第一步,我们可以看到区块的添加和最终确认的验证过程,在我们真正在上面部署一些很重要的东西,比如Statemine平行链(这是Statemint的Kusama版本)之前,我们会做一些测试。我们发现了一些Bug,但是会很快解决。我们马上要发布0.9.2,应该很快,要么今天要么明天。我们会重点观察其在几个方面的运行情况,差不多等Shell稳定运行24小时之后,我们会将Shell链升级为Statemine。”
此外,公益平行链Statemine预计本周内上线;预计在Kusama拍卖后一两周后开始波卡拍卖。(PolkaWorld)[2021/5/20 22:25:10]
在编写代码时,处理“异常”情况的能力是至关重要的。当在远程系统上发生了一些您没有预料到的事情时,那么您就需要某种方法来管理它,即使它只是简单地将一个报告发送回源,声明同样的内容。
虽然XCVM指令集不包含任何显式的通用分支指令,但它的执行模型中确实内置了一个通用异常处理框架。XCVM还包括两个代码寄存器,每个寄存器都包含一个像ProgrammeRegister这样的XCVM程序。这两个寄存器称为附录寄存器和错误处理程序寄存器。如果您熟悉几种流行语言中的try/catch/finally异常系统,那么接下来要做的事情可能会让人想起很多事情。
Gavin Wood:未来一周左右将上线Kusama首条平行链Shell:波卡创始人兼 Web3 基金会主席 Gavin Wood 在Web 3.0训练营二期开幕仪式上表示:过去几个星期,我们在 Rococo 进行了拍卖测试,也在 Rococo 上上线了测试平行链。验证者数量增加到 900 个,达到了 Kusama 的水平,这也增强了我们的信心,我们相信即它很快就可以正式上线了。此外他还透露,Kusama上的第一条平行链将被命名为Shell。“我计划在接下来一周左右的时间里,验证者完成更新后,我们给验证者充裕的时间推进 0.9 版本,进行运行环境升级,做最后的检查,在 Kusama 上上线第一条平行链,这第一条平行链将命名为'Shell'。”[2021/5/14 22:03:23]
如前所述,XCVM程序的执行遵循其中的每一条指令,一步一步地执行。当它按照这些指令执行到程序结束时,将发生两种情况之一:要么成功地到达程序结束,要么发生错误。在第一个成功执行的情况下,错误寄存器被清除,其重量添加到剩余重量寄存器。附录登记册也被清除,其内容被放入方案登记册。如果节目登记册空着,我们就停止。否则,节目计数器复位为零。简单地说,我们扔掉当前的程序和错误处理程序,开始执行附录程序。
这个功能本身并不是很有用,但是如果与发生错误时发生的情况相结合,它就很有用。在这里,任何尚未执行的指令的权重被添加到剩余权重寄存器中。清除“错误处理程序寄存器”,将其内容放入“程序登记器”并将“程序计数器”重置为零。简单地说,我们抛出当前的程序,并开始执行错误处理程序。因为我们没有清除附录寄存器,所以除非它被错误处理程序重置,否则它将在成功完成后执行。
Gavin Wood:Substrate 3.0版本可能会在2021年上半年发布:12月31日消息,波卡Polkadot(DOT)创始人Gavin Wood在《2020年Polkadot总结》中指出,Substrate的下一个主要版本3.0版本可能会在2021年上半年发布,将给以太坊带来兼容性,以及新的改进、更多的惯用Frame PalletAPI以及一个更快的数据库后端和端到端权重体系。另外,2020年Polkadot财政库总共有超过1400万美元的资金被用于资助200多个项目;Polkadot目前的10.2亿DOT流通量中有61%被锁定在质押系统中;Polkadot目前拥有274个验证人,由大约200个独立运营商运营,并得到7000多个个人指定账户的支持;Polkadot目前有超过100个平行链正在开发中,还有超过50个寻找完整平行链的插槽。Cumulus(用以连接Substrate的平行链)正处于功能完善的初始阶段,准备与新的Rococo测试网和平行链v1代码一起使用。[2020/12/31 16:08:48]
由于其组成结构,它允许错误处理程序的任意“嵌套”:如果需要,错误处理程序也可以有错误处理函数,而附录可以有自己的附录。
有两个指令允许对这些寄存器进行操作:SetAppendix和SetErrorHandler。如您所料,其中一个设置了附录寄存器,另一个设置了错误处理程序寄存器。每个参数的预测权重都比它们的参数的权重大一些。但是,在执行时,将被替换的寄存器中XCM消息的权重添加到剩余权重寄存器中,允许回收任何未使用的附录或错误处理程序的权重。
抛出错误
有时,实际确保发生错误并定制该错误的某些方面可能是有用的。这是在编写测试代码时使用的但它可能最终会在一个活动链中找到用途,这并非不可能。这可以通过指令Trap在XCVM中完成。抛出的错误类型共享一个名称Trap。指令和错误都带有一个整数参数,允许在抛出错误者和外部观察者之间传递某种形式的信息。
声音 | 波卡Gavin Wood:将为主网上线做准备,预计在下周更新融资信息:近日GavinWood在波卡社群中透露,波卡已经在进行外部审计,并将在接下来的时间发布更多有关融资的信息。当社区参与者提出的波卡是否有关于主网上线和进一步融资的具体计划时,GavinWood称波卡的主网代码已经在进行外部审计,一旦渗透测试通过,团队将着手修复所有问题,并为主网的上线做准备。同时,关于融资问题,GavinWood表示将在下周更新最新进展,那时他将会得到更多有关信息。[2020/1/15]
举例如下:
Trap将导致跳过最终的DepositAsset并运行错误处理程序的DepositAsset,将1DOT(减去执行成本)置于Parachain2000的所有权之下。我们总是倾向于在错误处理程序代码的开头使用RefundSurplus,因为如果它正在运行,我们就知道所使用的预测权重(以及由此购买的权重)可能是过高的估计。
错误报告
能够引入代码来处理错误是非常有用的,但是一个经常被要求的特性是能够报告XCM消息返回给原始发件人。我们遇到了上一篇文章中的QueryResponse指令,它允许一个共识系统向另一个报告一些信息,剩下的就是能够以某种方式插入XCM进入这个QueryResponse,并将其发送给希望被告知结果的人。
事实证明,只有一个名为ReportError的指令可以执行此操作。它通过使用我们尚未遇到的寄存器工作:错误寄存器。错误寄存器是一个可选类型。如果已设置,则它包含两条信息:一个数字索引和一个XCM错误类型。
它的操作原理极其简单。首先,每当一条指令产生错误时,它总是被设置;错误类型被设置为该错误的类型,数值索引被设置成程序计数器寄存器的值。其次,只有在执行ClearError指令时,它才会被清除。这条指令是绝对正确的指令之一——它永远不允许自己导致错误。这就是所有-它得到设置时,一个错误发生,得到清除时,你发出适当的指令。
现在应该清楚地了解ReportError指令是如何工作的:它简单地使用错误寄存器的内容组成一个QueryResponse指令,并将其发送到特定的目的地。当然,在执行之前发生的任何错误都会导致指令被跳过,因为执行首先跳到ErrorHandler寄存器的代码,然后跳到附录寄存器的代码。但是,这方面的解决方案很简单:将ReportError放在附录中将确保它被执行,而不管主代码是否导致执行错误。
让我们看一个简单的例子。我们将一个资产(1DOT)从中继链传送到Statemint(Parachain1000),在那里购买一些执行时间,然后使用Statemint作为储备,我们将把资产存放在Parachain2000上。原始(无错误报告)消息如下所示:
对于基本的错误报告,我们将使用以下方法:
正如您所看到的,唯一的变化是引入了两个SetAppendix指令,确保Statemint和parachain2000中的错误或缺乏错误将报告给中继链。这假设中继链已经设置为能够识别和处理来自Statemint和parachain2000的QueryResponse消息,查询ID为42,权重限制为1000万。令人高兴的是,这确实是基板支持的东西,但超出了范围。
资产陷阱
当在处理资产的程序中发生错误时,那么它可能会非常有问题。可能存在BuyExecution指令本身导致错误的情况,可能是因为重量限制不正确或用于支付的资产不足。或者一个资产被送到一个无法有效处理的链。在这些情况下,消息的XCVM执行结束时,资产仍保留在HoldingRegister中,与其他寄存器一样,这些寄存器是暂时的,我们可能会忘记。
XCM允许链完全避免这种损失。该机制分两步工作。首先,持有登记册中的任何资产在获得批准后都不会被完全遗忘。如果在XCVM停止时持有登记册不是空的,那么就会发出一个包含三条信息的事件:持有寄存器的值;原产地登记册的原始值;以及这两条信息的散列。然后,XCM系统将此散列放置在存储中。该机制的这一部分称为资产陷阱(AssetTrap)。
索赔制度
该机制的第二步是能够要求持有登记册的一些以前的内容。这实际上不是通过任何专门为此目的设计的东西来实现的,而是通过一个我们尚未遇到的通用指令,称为ClaimAsset。在Rust中是这样声明的:
这个指令的名称可能会让人想起我们遇到过的某些其他“资金”指令,如WithdrawAsset和ReceiveTeleportedAsset。如果是这样,那么它有一个很好的理由:它是。像其他人一样,它试图将资产放入持有登记册。不像WithdrawAsset那样会减少帐户上的资产余额,ClaimAsset寻找这些资产的有效索赔,无论这些资产在原始登记册中的价值是多少。为了帮助系统找到有效的索赔,可以通过票证参数提供信息。如果找到有效的债权,则从链中删除该债权,并将该资产列入持有登记册。
到底什么构成索赔,完全取决于链条本身。不同的链可能支持不同类型的声明,并且Substrate允许您轻松地组合它们。但是,正如您可能猜到的那样,一种特殊的声明已经准备好了,当然,是先前删除的HoldingRegister内容。
因此,让我们来看看这在实践中是如何工作的。假设我们的用户的parachain2000向Statemint发送一条消息,在该消息中,它从其主权帐户中提取0.01DOT来支付费用,并通知它将100单位自己的本机令牌的储备资产转移到其在Statemint的主权帐户。可能是这样的:
假设0.01DOT就足够了,并且Statemint支持Parachain2000的本地资产的链上存款,那么这应该可以正常工作。然而,也许Statemint还没有建立起来承认parachain2000的原生资产。在这种情况下,DepositAsset将不知道如何处理该资产,并因此抛出一个错误。在执行了将通知parachain2000这个失败的附录之后,我们将剩下100个parachain2000的本机资产以及可能在持有登记簿中的一些DOT。让我们假设费用只达到0.005DOT,剩下的0.005DOT。
然后,Statemint的Pallet会记录一个关于这些新可索赔资产的事件,类似于:
将向Parachain2000发送一条类似如下的消息:
Parachain2000将在稍后阶段,就能够用一个相当简单的方法回收这100个单元:
在这种情况下,没有通过ticket参数提供特殊信息来帮助查找索赔。对于AssetTrap索赔,这通常是很好的,尽管对于其他类型的索赔可能需要使用它。
结论
希望本篇文章可以帮助你更好地理解?XCM的底层虚拟机以及它如何帮助您从意外情况中管理和恢复。本系列的下一篇文章将讨论XCM以及如何改进格式、采取更深入的研究XCMRust实现路径,以及我们如何使用它为链提供易于解释的能力。
头条 ▌以太坊L2网络总锁仓量为32亿美元金色财经报道,L2BEAT数据显示,截至10月11日,以太坊Layer2上总锁仓量为32亿美元.
DeFi数据 DeFi总市值:1306.91亿美元数据来源:Debank 过去24小时去中心化交易所的交易量:33亿美元 过去24小时去中心化交易所的交易量数据来源:DebankDeFi借贷平台.
金色财经区块链9月24日讯?现阶段,数字艺术的主要商业用例就是收取版税,创作者会向平台收取少量使用费用。版税使艺术家能够通过原创作品,从数字媒体中获得长期且稳定的收入.
国庆假期已结束,金色财经梳理了国庆8天的重要行业新闻,让您快速了解假期都发生了哪些大事。 政策新闻: 拜登:美国将召集30个国家共同打击非法使用加密货10月4日消息,美国白宫周五发布了总统拜登关.
近日,由上海浦东新区科幻协会和上亿传媒联合推出的2021科幻影视产业论坛纪念卡牌正式上架蚂蚁链粉丝粒销售.
每当有人提到比特币网络是多么的缓慢和昂贵,最常见的反对比特币论点是闪电网络——“比特币是更好的!”闪电网络是即时的,而且不收费!”这是一个典型的转移注意力的方法.