宇宙链 宇宙链
Ctrl+D收藏宇宙链
首页 > 火必下载 > 正文

Gavin Wood:XCM 第三部分 执行和错误管理

作者:

时间:1900/1/1 0:00:00

在我前两篇文章里(?介绍了 XCM 的设计和版本结构的基础知识。在本文中,我们将深入研究它的底层设计和执行模型。因为XCM 基于 XCVM (一个非常高级的虚拟机)指令集,希望本文可以帮助你熟悉这个机器架构。

XCVM 是一个高级别、非 Turing 的完整虚拟机。它是基于寄存器的(而不是基于堆栈的),并且有几个专用寄存器,其中大部分持有高度结构化的数据。与通用处理器不同, XCVM 的寄存器不能随意设置为任意值,但有严格的机制来控制它们的变化。除了某些与本地链状态交互的方法(如我们已经看到的 With draw Asset 和 Deposit Asset 指令)之外,没有额外的“内存”。没有循环的可能,也没有显式的分支指令。

我们已经介绍了其中两个登记册:持有登记册,能够临时持有一项或多项资产,并可以通过从本地链中提取资产来填充,或者通过从可信的外部来源(例如另一个链)接收资产;以及来源登记册,在执行开始时,该登记册持有共识系统的位置,从该系统当前XCM执行起源,并可能只突变到一个内部位置或完全清除。

在其他寄存器中,三个涉及异常/错误管理,两个涉及跟踪执行权重。我们将在本文中了解它们。

如前所述,没有显式条件指令或循环原语可以多次重新执行相同的指令。这使得预先确定程序的控制流变得相当琐碎。该属性非常有用,因为我们希望确定 XCM 消息在执行点之前可以使用多少执行时间(称为整个 Substrate / Polkadot 的权重)。

允许图灵完备语言的系统(如 Ethereum )实际上不能直接从程序中计算最坏情况的执行时间,这是由于图灵的完备性。他们通过要求用户预先确定程序的执行资源来解决这个问题,然后在程序执行时对其进行计量,如果超出了所支付的金额,就中断它。有时,在事务执行之前,事情会发生变化,权重会变得不正确。令人高兴的是,像 XCVM 这样的非 Turing - Complete 的虚拟机可以避免这种度量和权重的需要。

Gavin Wood:波卡平行链可能超过100条,生态中可能还会出现第三条中继链:近日,Polkadot创始人Gavin Wood在The Defiant播客中聊到“同为分片,波卡和以太坊2.0的区别”等话题。

Gavin称,我觉得两者在产品层面上的主要区别就是,在Polkadot中,你可以租到整个分片,而以太坊(2.0)则一直在试图坚持以太坊模型,只不过让这个模型变得更具可扩展性,扩展性基本是来自拥有更多的工作流,让一些智能合约运行在这个分片上,一些智能合约运行在另一个分片上。而Polkadot的想法产生于‘如果这些分片不一定非要是智能合约呢?如果它们可以是任何的链会怎样呢?如果说它们中的一个只专注于域名注册,另一个只专注于DeFi,另一个只专注于NFT呢?’这样做会不会有什么优势呢?

对于我来说,答案当然是有优势,因为有很多高吞吐量的应用,有时候你知道你肯定需要为这一个应用处理很多的交易,比如DeFi,那么专业化就很有必要,因为你对性能的要求极高,但同时你又有机会去做实验,你可以在不同的链上尝试不同的想法,不会拘泥于一个智能合约的模型,你甚至可以有多种不同的做智能合约的方式。其实现在也有不同的链在推动不同的智能合约模型,有的可能是非图灵完备,有的有存储手续费有的没有。我认为实验是让区块链伟大的地方,Polkadot可以同时进行100来个实验,这是让我很激动的一点。

针对波卡生态是否会有其他中继链,Gavin表示,可能还会有另外一两个,其中一个他看到的趋势是联盟类型的链,也就是专门为产业、企业、组织打造的链。他们可能想要联合起来并互相沟通,但是却不想成为某条公链的一部分,可能觉得没有必要加入另一条链的经济系统。对于这些链来说用Polkadot就更合适,因为Polkadot不会介入到所有交易中。所以理论上说,我们可能会看到一些中继链通过桥连接到Polkadot中继链,这些也可以被看作是广义上的Polkadot生态。(PolkaWorld)[2022/3/11 13:51:12]

权重通常表示为一个代表性硬件执行给定操作所需的整数。正如我们在 Buy Execution 指令中看到的,在处理某些指令时, XCVM 包含了执行时间 / 权重的概念。

Gavin Wood:监管往往会更多地针对被认为非常中心化的项目:金色财经现场报道,10月26日,由万向区块链实验室主办的第七届区块链全球峰会在上海举行,Polkadot创始人Gavin Wood表示,我认为对行业项目来说,监管要求往往会更多地针对被认为是非常中心化一些项目。比如银行,如果这样的理论和想法是对的,意味着整个生态系统,很多项目会不复存在,至少从长期来说情况是如此。就时间表来说,还需要一年、两年甚至三年的时间,才会看到对于这些中心化,或基于中心化的项目有实质性的监管行动。但是如果我们放眼长远的话,很多项目需要做出改变。[2021/10/26 20:57:54]

没有权重计量,但是考虑到 XCVM 程序最终获得的可能性小于最坏情况下的重量预测,我们有一个名为剩余权重寄存器的寄存器。因为我们可以准确地预测他们将占据多少权重,所以大多数指令不接触它。然而,有时候,最坏情况下的权重预测是一个高估的情况,只有在执行时,我们才知道有多少。虽然占块执行时间的权重估计过高的 XCM 消息,跟踪原始权重被高估的数量,并从帐户中减去它,允许链优化其块执行时间的配额。

到目前为止,我们对 XCVM 的处理中已经隐含了另外两个寄存器,但是了解它仍然很重要。首先,有一个程序登记册,它存储当前正在执行的 XCVM 程序。其次是程序计数器,它存储当前正在执行的指令索引。当程序寄存器被更改时,这将被重置为零,并在每个成功执行的指令结束时增加一个。

在编写代码时,处理“异常”情况的能力是至关重要的。当在远程系统上发生了一些您没有预料到(或者实际上无法预测)的事情时,那么您就需要某种方法来管理它,即使它只是简单地将一个报告发送回源,声明同样的内容。

Gavin Wood正式将平行链功能添加到Kusama网络:波卡创始人Gavin Wood已正式将平行链模块部署到Westend和Kusama Runtimes中,这意味着Parity已经把平行链的功能加到Kusama网络,下次Kusama升级将会支持平行链。这是Kusama平行链上线的第一步,接下来即将进行治理投票等部署白板链、公益平行链等,随后会启动支持项目方的平行链注册,也就是启动平行链插槽拍卖。(Polkaworld)[2021/5/2 21:17:58]

虽然 XCVM 指令集不包含任何显式的通用分支指令,但它的执行模型中确实内置了一个通用异常处理框架。XCVM 还包括两个代码寄存器,每个寄存器都包含一个像 Programme Register 这样的 XCVM 程序。这两个寄存器称为附录寄存器和错误处理程序寄存器。如果您熟悉几种流行语言中的 try / catch / finally 异常系统,那么接下来要做的事情可能会让人想起很多事情。

如前所述, 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 。指令和错误都带有一个整数参数,允许在抛出错误者和外部观察者之间传递某种形式的信息。

现场 | Polkadot创始人Gavin Wood:波卡治理采取的是某种程度的委托民主:金色财经现场报道,由Web3基金会主办的Web3大会10月30日在上海举行。Parity & Polkadot创始人Gavin Wood在闭幕AMA中讲到波卡的智力模型,他表示波卡的治理采取的是某种程度的委托民主。因为不需要完全民主,不是每一件事都需要投票。一方面,一个区块链经济系统考虑50%或者更多的利益相关者,区块链系统才会稳定。另一方面,许多利益相关者不会参与每一个决策,他们委托给其他人。同时为避免某个财团通过拥有大多数DOT,进而控制主要理事会席位,波卡采取了NPOS机制。[2020/10/30 11:15:18]

举例如下:

能够引入代码来处理错误是非常有用的,但是一个经常被要求的特性是能够报告XCM 消息返回给原始发件人。我们遇到了上一篇文章中的 Query Response 指令,它允许一个共识系统向另一个报告一些信息,剩下的就是能够以某种方式插入 XCM 进入这个 Query Response ,并将其发送给希望被告知结果的人。

事实证明,只有一个名为 Report Error 的指令可以执行此操作。它通过使用我们尚未遇到的寄存器工作:错误寄存器。错误寄存器是一个可选类型(可以设置或清除)。如果已设置,则它包含两条信息:一个数字索引和一个 XCM 错误类型。

它的操作原理极其简单。首先,每当一条指令产生错误时,它总是被设置;错误类型被设置为该错误的类型,数值索引被设置成程序计数器寄存器的值。其次,只有在执行 Clear Error 指令时,它才会被清除。这条指令是绝对正确的指令之一 —— 它永远不允许自己导致错误。这就是所有-它得到设置时,一个错误发生,得到清除时,你发出适当的指令。

现在应该清楚地了解 ReportError 指令是如何工作的:它简单地使用错误寄存器的内容组成一个 QueryResponse 指令,并将其发送到特定的目的地。当然,在执行之前发生的任何错误都会导致指令被跳过,因为执行首先跳到 Error Handler 寄存器的代码,然后跳到附录寄存器的代码。但是,这方面的解决方案很简单:将 ReportError 放在附录中将确保它被执行,而不管主代码是否导致执行错误。

让我们看一个简单的例子。我们将一个资产 (1DOT) 从中继链传送到 Statemint (Parachain 1000),在那里购买一些执行时间,然后使用 Statemint 作为储备,我们将把资产存放在 Parachain 2000 上。原始 (无错误报告) 消息如下所示:

对于基本的错误报告,我们将使用以下方法:

正如您所看到的,唯一的变化是引入了两个 Set Appendix 指令,确保 Statemint 和 parachain 2000 中的错误或缺乏错误将报告给中继链。这假设中继链已经设置为能够识别和处理来自 Statemint 和 parachain 2000 的 Query Response 消息,查询 ID 为 42 ,权重限制为 1000 万。令人高兴的是,这确实是基板支持的东西,但超出了范围。

当在处理资产的程序中发生错误时(大多数程序都是这样做的,因为它们经常需要用 Buy Execution 来支付执行费用),那么它可能会非常有问题。可能存在 Buy Execution 指令本身导致错误的情况,可能是因为重量限制不正确或用于支付的资产不足。或者一个资产被送到一个无法有效处理的链。在这些情况下,消息的 XCVM 执行结束时,资产仍保留在 Holding Register 中,与其他寄存器一样,这些寄存器是暂时的,我们可能会忘记。

XCM 允许链完全避免这种损失。该机制分两步工作。首先,持有登记册中的任何资产在获得批准后都不会被完全遗忘。如果在 XCVM 停止时持有登记册不是空的,那么就会发出一个包含三条信息的事件:持有寄存器的值;原产地登记册的原始值;以及这两条信息的散列。然后,XCM 系统将此散列放置在存储中。该机制的这一部分称为资产陷阱 (AssetTrap)。

该机制的第二步是能够要求持有登记册的一些以前的内容。这实际上不是通过任何专门为此目的设计的东西来实现的,而是通过一个我们尚未遇到的通用指令,称为 Claim Asset 。在 Rust 中是这样声明的:

这个指令的名称可能会让人想起我们遇到过的某些其他“资金”指令,如 With draw Asset 和 Receive Teleported Asset 。如果是这样,那么它有一个很好的理由:它是。像其他人一样,它试图将资产(由这里的资产参数给出)放入持有登记册。不像 With draw Asset 那样会减少帐户上的资产余额, Claim Asset 寻找这些资产的有效索赔,无论这些资产在原始登记册中的价值是多少。为了帮助系统找到有效的索赔,可以通过票证参数提供信息。如果找到有效的债权,则从链中删除该债权,并将该资产列入持有登记册。

到底什么构成索赔,完全取决于链条本身。不同的链可能支持不同类型的声明,并且 Substrate 允许您轻松地组合它们。但是,正如您可能猜到的那样,一种特殊的声明已经准备好了,当然,是先前删除的 Holding Register 内容。

因此,让我们来看看这在实践中是如何工作的。假设我们的用户的 paracha in 2000 向 Statemint 发送一条消息,在该消息中,它从其主权帐户中提取 0.01 DOT 来支付费用,并通知它将 100 单位自己的本机令牌的储备资产转移到其在 Stat emint 的主权帐户。可能是这样的:

假设 0.01 DOT 就足够了,并且 Statemint 支持 Parachain 2000 的本地资产的链上存款(以及使用 Parachain 2000 作为它的储备),那么这应该可以正常工作。然而,也许 Statemint 还没有建立起来承认 parachain 2000 的原生资产。在这种情况下,Deposit Asset 将不知道如何处理该资产,并因此抛出一个错误。在执行了将通知 parachain 2000 这个失败的附录之后,我们将剩下 100 个 paracha in 2000 的本机资产以及可能在持有登记簿中的一些 DOT。让我们假设费用只达到 0.005 DOT ,剩下的 0.005 DOT。

然后,Statemint 的 Pallet 会记录一个关于这些新可索赔资产的事件,类似于:

将向 Paracha in 2000 发送一条类似如下的消息:

Parachain 2000 将在稍后阶段(也许一旦它确定 Statemint 能够接受其原生资产的存款),就能够用一个相当简单的方法回收这 100 个单元:

在这种情况下,没有通过 ticket 参数提供特殊信息来帮助查找索赔。对于 Asset Trap 索赔,这通常是很好的,尽管对于其他类型的索赔可能需要使用它。

希望本篇文章可以帮助你更好地理解 ?XCM 的底层虚拟机以及它如何帮助您从意外情况中管理和恢复。本系列的下一篇文章将讨论 XCM 以及如何改进格式、采取更深入的研究 XCMRust 实现路径,以及我们如何使用它为链提供易于解释的能力。

标签:DOTPOLPOLKPolkadotpolkadot代币Corgi of PolkaBridgePolkatrainpolkadotteddokey

火必下载热门资讯
花 300 万买的头像 怎么在一个小时内被偷掉?

一年前,NFT(Non-Fungible Tokens,非同质化代币)对于很多人来说还是天外来物,而现在,你已经很难抵御 NFT 入侵你的生活.

1900/1/1 0:00:00
如何监管和清理虚拟货币挖矿?内蒙古对外招标相关研究项目

内蒙古发改委的此次招标行为,就是利用科技手段进一步落实虚拟货币监管政策的具体体现,也彰显了内蒙古当局的坚决态度。9月15日,内蒙古自治区发展和改革委员会对外公布了“关于清理虚拟货币‘挖矿’政策机制研究项目中标(成交)结果”.

1900/1/1 0:00:00
NFT考古:最早的以太坊艺术市场诞生于2014年

注:原文来自bankless,作者是William M. Peaster。如果我问你,“最古老的以太坊艺术市场是什么”,你会怎么回答? 如果你的第一个猜测是在2015年7月以太坊主网启动之后发生的事情,那自然是完全合理的.

1900/1/1 0:00:00
新闻周刊 | 美联储希望在“未来几周”发布CBDC报告

金色周刊是金色财经推出的一档每周区块链行业总结栏目,内容涵盖一周重点新闻、矿业信息、项目动态、技术进展等行业动态。本文是其中的新闻周刊,带您一览本周区块链行业大事.

1900/1/1 0:00:00
纽约梅隆银行报告:数字资产从边缘到未来

数字资产显然已经进入了主流。纽约梅隆银行最新报告概述了数字资产的演变,它们如何帮助重塑金融生态系统,并强调了为帮助数字资产达到完全成熟并与传统资产无缝整合所需的基础设施和协作.

1900/1/1 0:00:00
金色观察丨公链路在何方:成为“以太坊杀手”真的很难吗?

金色财经 区块链9月26日讯  我们发现,在所有公链“拉升”的背后,几乎都是经济模式爆发的结果,因为只有当用户在经济上获得了真正回报,公链的最终价值才会反馈到价格上.

1900/1/1 0:00:00