区块链挖矿_区块链开发_比特币行情_快报网

网站地图资讯

区块链挖矿_区块链开发_比特币行情_快报网

当前位置: 快报网 > 行情 >

Gavin Wood:详解跨共识消息格式 XCM 设计原理与运转机制

时间:2021-09-08 22:02人气:来源: www.adsdan.com

beneficiary (受益人)被声明为 Parent.into() ,精明的读者说不定想了解这在 DOT波卡 中继链的上下文中指的属于哪个。真实答案属于 「哪个更不是」,但是这里不存在错误。xcm 参数中的一切内容都属于从接收方的角度编写的,因此尽管这属于整个 XCM 的一部分,它被馈送到 DOT波卡 中继链,但是它事实上只在 Statemint 上实行,因此它的上下文属于跟着 Statemint 走的。

对于相互信赖的链(例如在相同的通体共识和安全保护伞下的同质分片),小编能够选用 DOT波卡 称为传送的框架,这基本上就意味着在发送方销毁资产并在接收方铸造它。这种国防法既容易又高效——它仅需两条链的协调,并且每一侧只涉及一个动作。遗憾的属于,要是接收链不得 百分百 信赖发送链实质销毁它正在铸造的资产(并且确实不铸造超出资产约定规则的资产),那样发送链确实不存在依照消息铸造资产的原因。

MultiLocation 始终表示相对于当前地方的地方。您能够把它愿意象成一个文件系统软件路径,但是属于无能为力直接表达文件系统软件树的「根」。这到底有一个容易的理由:在 DOT波卡 的世界中,区块链能够合并到其他区块链中,也能够从其他区块链中离别出来。区块链能够非常独立地开始生命,并最后被提高为更大共识中的平行链。要是如此做,那样 「root」 包含的意思将在一夜之间改善,这说不定会给 XCM 消息和其他任何选用 MultiLocation 的消息带来混乱。为了容易起见,小编完全排除去这种说不定性。

第二,它们必须属于可替代的或无可替代的。要是它们属于可替代的,那样应该到底有一些有关的非零数目。要是它们无可替代,那样应该到底有一些指示它们属于什么实例而既不是数目。(这通常用索引表示,但是 XCM 还允许选用各种其他数据种类,例如数组和二进制 blob。) 这涵盖了 MultiAsset,但是小编到底有时会选用其他三种有关种类。MultiAssets 就在于其中之一,事实上只不过是意味着一组 MultiAsset 项目。然后小编到底有 WildMultiAsset;这属于一个通配符,可用于匹配一个或多个 MultiAsset 项目。它事实上只支持两种通配符:All (匹配一切资产)和 AllOf 匹配特定身份 (AssetId) 和可替代性的一切资产。值得留意的属于,对于后者,不用指定数目(在可替代的情况下)或实例(对于非可替代的),并且全部匹配。

XCM 中的「消息」事实上只不过是一个运行在 XCVM 上的程序。它属于一个或多个 XCM 指令。程序会总是实行,直到它运行到最终或遇见错误为止,此时它会收场(我个人目前到底有意不讲解这一点)并停止。

首先个项目 fees 属于应从 Holding Register 中提取并用于支付成本的金额。从手艺上讲,这只不过是最大值,由于任何未选用的余额都会立即退还。

所以小编最后的 XCM 指令属于如此的:

WithdrawAsset((Here, 10_000_000_000).into()), BuyExecution { fees: (Here, 10_000_000_000).into(), weight: 3_000_000, }, DepositAsset { assets: All.into(), max_assets: 1, beneficiary: Parachain(1000).into(), },
选用 XCM 在链之间移动资产

小编再来看看另一个 XCM 指令:WithdrawAsset。从表面上看,这到底有点类似于 TransferAsset 的前半部分:它从起源的账户中提取了一些资产。但是这以及对方有哪些关系?要是对方不存在在任何位置存入,那样这绝对是一个非常无用的操作。要是小编查询它的 Rust 声明,小编会发现更多相关其使用方法的线索:

WithdrawAsset(MultiAssets),

让小编看看所需的 XCM。这次小编将从平行链 2000 发送 1 个 DOT 到平行链 2001,它在平行链 1000 上选用准备金支持的 DOT。同样,小编假设成本已经在发送方支付过了。

WithdrawAsset((Parent, 10_000_000_000).into()), InitiateReserveWithdraw { assets: All.into(), dest: ParentThen(Parachain(1000)).into(), xcm: Xcm(vec![ BuyExecution { fees: (Parent, 10_000_000_000).into(), weight: 3_000_000, }, DepositReserveAsset { assets: All.into(), max_assets: 1, dest: ParentThen(Parachain(2001)).into(), xcm: Xcm(vec![ BuyExecution { fees: (Parent, 10_000_000_000).into(), weight: 3_000_000, }, DepositAsset { assets: All.into(), max_assets: 1, beneficiary: ParentThen(Parachain(2000)).into(), }, ]), }, ]), },

在 Rust XCM API 中,小编供应了诸多转换,以尽量轻松地处置这一类数据种类。例如,当小编在 DOT波卡 中继链上时,要指定相当于 100 个不可分割的 DOT 资产单位的可替代 MultiAsset (普朗克,对于那些知晓的人),那样小编将选用 (Here, 100).into()。

Holding Register

小编选用我们的 1 DOT 来支付成本,小编假设每一个 XCM 操作到底有 100 万。支付了这一项操作后,小编将 1 个 DOT (减去成本,而且小编非常的懒,所以小编只选用 All.into())存入平行链 2001 的主权账户,但是如此做属于作为储备资产,这意味着小编也需要 Statemint 向该接收链发送公告 XCM,公告它传输与要对生成的衍生资产实行的一些指令。DepositReserveAsset 指令并不一直奏效;为了让它奏效, dest 必须属于一个能够在准备金链上合理持到底有金钱的地方,而且也属于储备链能够向其发送 XCM 的地方。兄弟平行链恰良好切合需要。

/*snip*/ xcm: Xcm(vec![ BuyExecution { fees: (Parent, 10_000_000_000).into(), weight: 3_000_000, }, DepositAsset { assets: All.into(), max_assets: 1, beneficiary: ParentThen(Parachain(2000)).into(), }, ]), /*snip*/

寻常来讲,资产在链之间移动到底有两种方式,这取决于链之间是不是信赖彼此的安全性和逻辑。

传送(Teleporting)

将资产发送到另一条链说不定属于链间消息传递的最容易见到用例。允许一条链管理另一条链的当地资产,将允许各种衍生用例(无双关语),最容易的属于去中心化买卖所,但是通常归为去中心化金融或 De-Fi。

XCM 旨在成为共识系统软件之间沟通思愿意的语言。它应该足够通用,以便在整个不断开拓的生态系统软件中正确并到底有用。它应该属于可扩展的,因为可扩展性不可规避地意味着变化,它也应该属于面向将来和向前兼容的。最终,它应该足够高效能够在链上运行,并且还能在计量环境中运行。

在自己的示例中,小编假设一切 XCM 指令的 weight 为 100 万,因此到现在为止,自己的俩项目(WithdrawAsset 和 BuyExecution)为 200 万,下面还到底有一个。小编将只选用小编必须支付这一类成本的一切 DOT (仅当小编相信目标地链不存在疯狂的成本时,如此做才合理 - 假设情况这样)。到这里,让小编看看自己的 XCM:

WithdrawAsset((Here, 10_000_000_000).into()), BuyExecution { fees: (Here, 10_000_000_000).into(), weight: 3_000_000, },

XCM 中的地方属于分层的,共识中的一些位置完全封装在共识中的其他位置。DOT波卡 的平行链完全存在于整个 DOT波卡 共识中,小编称之为内部地方。更严格地说,小编能够说,只须到底有一个共识系统软件的任何变化都意味着另一个共识系统软件的变化,那样前一个系统软件属于后者的内部系统软件。例如,Canvas 智能合约坐落于托管它的合约模块的内部。Bitcoin中的 UTXO 属于Bitcoin区块链的内部。

当 Statemint 最后收到这条消息时,它长如此:

ReceiveTeleportedAsset((Parent, 10_000_000_000).into()), BuyExecution { fees: (Parent, 10_000_000_000).into(), weight: 3_000_000, }, DepositAsset { assets: All.into(), max_assets: 1, beneficiary: Parent.into(), },

第二,链上的容易见到用例不易适当单个买卖;说不定要求特殊的窍门来提取金钱,交换金钱,然后将结果全部存入单个买卖中。连贯的储备资产框架所需的后续转移公告并没有于不明白任何人的链中。

(这假设 Statemint 事实上不存在收取任何成本,并且整个 1 DOT 都传曾经了。这既不是尤其现实,因此 assets 这一行的数字说不定会更低。) 这条消息中的大多数位置看上去应该很了解;以及小编在上一节中看到的 ReceiveTeleportedAsset 消息的唯一显著不同之处属于顶层指令 ReserveAssetDeposited ,它达成了类似的目标,只不过是表示 「发送链销毁了资产,以便您能够铸造等价资产」,它是什么意思 「发送链收到了资产并为您保留它们,因此您能够铸造到底有全额资产背书的衍生品」。无论哪些种类的方式,目标地链都会将它们铸造到 Holding Reserve 中,然后小编将它们存入接收链上的发送者主权账户中。

结论

所以到底有俩字段概念了自己的资产:id 和 fun,这很不错地表明了 XCM 怎样处置资产。第一,必须供应通体资产身份。对于可替代资产,这只不过是标识资产。对于 NFT,这标识了整个资产「类别」 —— 不一样的资产实例说不定在这个类别中。

plain enum AssetId { Concrete(MultiLocation), Abstract(BinaryBlob), }

正如前文提到的一样,XCM 不包括作为一等公民的成本和成本支付:以及Ethereum买卖模型不一致,对于成本支付既不是协议中不用的东西,就必须进行避免。就类似于 Rust 的零费用抽象一样,成本支付在 XCM 中不存在挺大的设计开销。

选用的种类属于 XCM 中非常基本的思愿意:资产,由 MultiAsset 表示,共识内的地方,由 MultiLocation 表示。Origin Register 属于一个可选的 MultiLocation (可选,由于要是要求它能够完全清除)。

在 XCM 的地方

啊哈!精明的读者会发现这看上去很相似 TransferAsset 指令中缺失的一半。小编到底有 assets 参数,该参数指定应从持到底有寄存器中删除哪些资产以存放在链上。max_assets 让 XCM 作者公告接收者计划存入或多或少独特的资产。(这在知晓 Holding Register 的内容前段时间计算成本时非常的到底有助力,由于存入资产说不定属于一项代价高昂的操作。)最终属于受益人,这以及小编前段时间在 TransferAsset 操作中遇见的参数相同。到底有许多指令表示要在 Holding Register 上实行的操作,而 DepositAsset 属于最容易的指令之一。其他一些则更复杂。

XCM 中的成本支付

不包括桥和合约模块,DOT波卡 带到底有三个不一样的系统软件,用于在其组成链之间实质通信 XCM 消息:UMP、DMP 和 XCMP。UMP (向上消息传递)允许平行链向它们的中继链发送消息。DMP (向下消息传递)允许中继链将消息向下传递到其平行链。XCMP 说不定属于其中最著名的,这允许平行链之间发送消息。XCM 可用于通过这三个通信通道中的任意一个来表达消息包含的意思。

这种普遍性甚至延伸到诸如为实行 XCM 消息支付成本之类的定义。因为小编知晓 XCM 可用于多种系统软件,包括 gas 计量的智能合约论坛和社区平行链,总是到系统软件平行链以及其中继链之间的可信交互,因此小编不愿意将成本支付等元素烤得太深和在协议中变得不可逆转。

为何不直接选用当地消息格式

就类似于我个人前段时间说的,这会到底有点复杂。让小编来看看这个过程。外部部分负责在发送方(平行链 2000)上提取 1 个 DOT 并撤回 Statemint (平行链 1000)上相应的 1 个 DOT —— 为此它选用了 InitiateReserveWithdraw ,其作用就在于字面意思(开启准备金提取)。

WithdrawAsset((Parent, 10_000_000_000).into()), InitiateReserveWithdraw { assets: All.into(), dest: ParentThen(Parachain(1000)).into(), xcm: /* snip */ }

在某些情况下,捎带在当地信息 / 买卖格式的链或智能合约说不定非常的到底有用,但是确实到底有一些挺大的缺点,使其对 XCM 的目的不太到底有用。第一,链之间缺少兼容性,因此计划向多个目标地发送消息的系统软件要求清楚怎样为每一个目标地编写消息。在这一点上,就算属于单个目标地也会伴随时间的推移改善其当地买卖 / 消息格式。智能合约说不定会升级,区块链说不定会引入新功能或改善现到底有功能,从而改善其买卖格式。

这意味着 XCM 不存在区分 「谁」 和 「在哪儿」 俩毛病。从类似于 XCM 如此相当抽象的东西的角度来看,不同之处并无关紧要 —— 两者模糊并成为本质上相同的东西。

最后花费的金额由讲解系统软件决定—— fees 只不过是限制它,要是讲解系统软件要求为所需的实行支付更多成本,那样 BuyExecution 指令将造成错误。其次个项目指定要购买的实行时间量。这寻常不应小于 XCM 程序的总 weight。

XCVM 包括许多 Register,与访问托管它的共识系统软件的通体状况。指令说不定会改善一个 Register,它们说不定会改善共识系统软件的状况,或者两者兼而到底有之。

原文标题:《Gavin Wood: 跨共识消息格式 XCM》 撰文:Gavin Wood,Ethereum的联合开创者、波卡和 Parity 科学技术开创者 翻译:PolkaWorld

再次,诸如支付成本之类的操作不易顺应假设已经类似于智能合约消息一样协商成本支付的模型。相比之下,买卖信封供应了一些支付处置的系统软件,但是通常也被设计为包含一个签名,这在共识系统软件之间进行通信时不存在意义。

一些初始用例

XCM 格式的核心在于 XCVM。以及某些人的怎么看相反,这既不是(到底有效的)罗2014马数字(尽管若是,它说不定意味着 905)。实际上,这代表跨共识虚拟机。这属于一台超高级别的非图灵完备计算机,其指令设计为以及买卖大致处于同一级别。

最终,还到底有 MultiAssetFilter。这属于最常见的,事实上只不过是 MultiAssets 和 WildMultiAsset 的组合,允许指定通配符或清晰(即非通配符)资产列表。

为了更良好地理解 XCM,要紧的属于要清楚它的边界与它在 DOT波卡 手艺堆栈中的地方。XCM 属于一种消息格式。它既不是消息传递协议。它不得用于在系统软件之间实质「发送」任何消息,它有哪些用途仅在于表达接收者应该干什么。

现在自己的 XCM 指令属于如此的:

WithdrawAsset((Here, 10_000_000_000).into()),

到底有许多不一致种类的连接点,用于以各种方式识别您说不定在链上找到的地方,例如键、索引、二进制 blob 和复数描述。

XCM 中的资产

Parachain(42)/AccountKey20(0x1234...abcd): 在中继链上进行评估,这将识别平行链编号 42 上的 20 字节帐户 0x1234…abcd (很有可能像承载Ethereum兼容帐户的 Moonbeam)。

最终,说不定到底有两条链愿意要提名再次条链,其中一条链上的资产说不定被视为当地资产,用作该资产的储备。每一个链上资产的衍生形式将得到完全支持,允许衍生资产交换为支持它的储备链上的基础资产。这说不定属于两条链不肯定相互信赖的情况,但是(至少就有关资产而言)想信赖资产的当地链。这里的一个例子属于小编到底有几个社区平行链愿意要在彼此之间发送 DOT。它们每一个都到底有一个当地形式的 DOT,由 Statemint 链(DOT 的当地中心)上的平行链控制的 DOT 完全支持。当在链之间发送当地形式的 DOT 时,在后台,「真的的」DOT 在 Statemint 上的平行链帐户之间移动。

例如 :

小编说不定到底有俩共识系统软件,它们都属于特定代币的「当地家园」。愿意象一下类似于 泰达币 或 美元C 如此的代币,它在几个不一样的链上都到底有实例,并且完全能够互换。应该能够在一条链上销毁如此的代币,并在另一条支持的链上铸造相应的代币。在 XCM 的说法中,小编之所以称之为传送(teleport),属于由于资产的转移事实上属于通过在一侧销毁它,并在另一侧创建一个克隆来达成的。

虽然 XCM 的目的属于通用的、灵活的和面向将来的,但是它当然必须知足实质需求,特别是链之间的代币转移。可选的成本支付(说不定选用这一类代币)属于另一种方式,就类似于进行交换服务的通用接口一样,在整个 Decentralised Finance 世界中都非常的容易见到。最终,应该能够选用 XCM 语言进行一些特定于论坛的操作。例如,在 Substrate 链中,说不定要求将远程调用分派到其模块之一以访问专门的功能。

首先部分由供应资产的多个 XCM 指令之一管理。小编已经知晓其中的一个指令了( WithdrawAsset ),但是还到底有其他几个小编稍后会看到。_Holding Register_中的所得资产当然将用于支付以及实行 XCM 有关的成本。任何未用于支付成本的资产都将被存入某个目标地账户。在自己的示例中,小编假设 XCM 发生在 DOT波卡 中继链上,买卖的属于 1 个 DOT (即 10,000,000,000 个不可分割的单位)。

除去在链之间发送消息以外,XCM 在其他语境也非常的到底有用,比方说,能用于在您前段时间既不是很熟悉它买卖格式的链上进行买卖。对于生意逻辑变化非常的小的链(例如Bitcoin),买卖格式 —— 或者钱包用来向链发送指令的格式 —— 往往会无限时地维持一模一样,或者至少兼容。选用高度可进化的基于元协议的链,例如 DOT波卡 及其组成的平行链,生意逻辑能够通过单个买卖跨互联网升级。这能够改善什么事情,包括买卖格式,给钱包维护者带来潜在的毛病,尤其是对于要求离线保存的钱包(例如 Parity Signer)。因为 XCM 版本好、抽象且通用,因此它能用作一种为钱包供应持久买卖格式的方法,用于创建许多容易见到买卖。

目的

XCM 中的成本支付属于一个相当要紧的用例。DOT波卡 社区中的大部分平行链都会需要其对话者为对方期望进行的任何操作付费,以免为 「买卖垃圾」 和拒绝服务攻击打开大门。当链到底有充分的原因相信它们的对话者会表现好时,也存在例外情况 —— 当 DOT波卡 中继链以及 DOT波卡 Statemint 公共利益链通信时就在于这样的情况。但是属于,对于通常情况而言,成本属于确保 XCM 消息及其传输协议不懂得被过度选用的良好手段。小编来看看 XCM 消息到达 DOT波卡 时怎样支付成本。

这一类暂时持有些未动用资产称为持到底有 Register。(「Holding」属于由于它们处于不得无限时不断的临时地方,「Register」属于由于它到底有点类似于 CPU Register,属于一个存放工作数据的位置。)到底有许多指令对持到底有寄存器进行操作。一种很简单的指令属于 DepositAsset 指令。让小编来看看它:

enum Instruction { DepositAsset { assets: MultiAssetFilter, max_assets: u32, beneficiary: MultiLocation, }, /* snip */ }

第二,必须就计算时间(用 Substrate 中的说法就在于 weight)交换资产。

小编来看看 XCM 将(大多数的) 1 个 DOT 从 DOT波卡 中继链传送到它在 Statemint 上的主权帐户时属于怎么样的。小编假设 DOT波卡 这边已经支付了成本。

WithdrawAsset((Here, 10_000_000_000).into()), InitiateTeleport { assets: All.into(), dest: Parachain(1000).into(), xcm: Xcm(vec![ BuyExecution { fees: (Parent, 10_000_000_000).into(), weight: 3_000_000, }, DepositAsset { assets: All.into(), max_assets: 1, beneficiary: Parent.into(), }, ]), }

伴随最后的 DOT波卡 1.0 版本和平行链的临近,跨共识消息格式(简称 XCM)马上发布其首先个生产就绪版本。这属于对格式、其目的、工作原理的介绍,可用于达成典型的跨链任务。

您说不定留意到了,这看上去跟前段时间的 WithdrawAsset XCM 非常类似于。唯一的主要不同之处属于,它既不是通过从当地账户提款来为成本和存款供应金钱,而属于通过相信 DOT 在发送方(DOT波卡 中继链)上确实被销毁并尊重 ReceiveTeleportedAsset 消息。值得留意的属于,小编在 DOT波卡 中继链上发送的 1 个 DOT 的资产标识符(Here,指的属于中继链本身属于 DOT 的原生环境)已自动变异为它在 Statemint 上的表示: Parent.into(),即 Statemint 上下文中中继链的地方。

第一,要求供应一些资产。

在 XCM 中工作时,通常要求引用某种资产。这属于由于几乎一切现有些公共区块链都依靠于一些原生数字资产来为其内部经济和安全机制供应支柱。对于Bitcoin等工作量证明区块链,原生资产(BTC)用于奖励开发区块链的矿工并预防双重支出。对于 DOT波卡 等权益证明区块链,原生资产 (DOT) 用作一种抵押形式,互联网管理员(称为权益人)必须承担危害才能生成到底有效区块并获取实物奖励。

beneficiary 也被指定为 DOT波卡 中继链,因此其(在 Statemint 上的)主权账户被记入新铸造的 1 DOT 减去成本。XCM 说不定只不过是轻松地为 beneficiary 指定了一个帐户或其他位置。事实上,能够选用从中继链发送的后续 TransferAsset 来移动这 1 个 DOT。

准备金(Reserves)

最终,XCM 操作将按照指示实行。

类似于一切语言一样,有的人会比任何人更倾向于选用某些元素。XCM 的设计方式并不代表让每一个支持 XCM 的系统软件都可以讲解任何说不定的 XCM 消息。有的消息在某些系统软件下不懂得到底有适当的讲解。其他的说不定属于适当的,但是因为资源限制或由于能够以更明确、更制度的方式表达相同的内容,讲解器仍然故意不支持。系统软件将不可规避地只支持说不定消息的一个子集。资源紧急受限的系统软件(如智能合约)说不定只支持非常到底有限的「方言」。

../Parachain(1000): 在平行链中进行评估,这将识别小编索引为 1000 的兄弟平行链。(在 Rust 中,小编将编写 ParentThen(Parachain(1000)).into())

MultiLocation 种类标识存在于共识世界中的任何单个地方。这属于一个相当抽象的灵感,能够代表共识中存在的一切事物,从可扩展的多分片区块链(如 DOT波卡)总是到平行链上的低级 ERC-20 资产账户。在计算机科学术语中,它事实上只不过是一个全局单例数据结构,无论其大小或复杂性怎样。

Gavin Wood:详解跨共识消息格式 XCM 设计原理与运转机制

这将小编带到了其次部分,交换(一部分)这一类资产以换取计算时间来支付自己的 XCM。为此,小编到底有 XCM 指令 BuyExecution 。小编来看看它属于怎么样的:

enum Instruction { /* snip */ BuyExecution { fees: MultiAsset, weight: u64, }, }

XCM 旨在可以毫不费力地处置一切此类资产。为此,到底有数据种类 MultiAsset 及其关联种类 MultiAssets、WildMultiAsset 和 MultiAssetFilter。让小编看看 Rust 中的 MultiAsset:

struct MultiAsset { id: AssetId, fun: Fungibility, }

../AccountId32(0x1234...cdef): 在平行链中进行评估,这将识别中继链上的 32 字节帐户 0x1234…cdef。

这种指令的一个例子属于 TransferAsset,它用于将资产转移到远程系统软件上的某个其他地址。要求告知要出售哪些资产与资产要出售给谁 / 在哪儿。在 Rust 中,它属于如此声明的:

enum Instruction { TransferAsset { assets: MultiAssets, beneficiary: MultiLocation, } /* snip */ }

以上就在于本文的内容。期望它能够帮助讲解 XCM 属于哪个,与它属于怎样设计以运转的基础常识。在下一篇文章中,小编将深入研究 XCVM 的构造、其实行模型及其错误处置、XCM 的版本控制系统软件;怎样在连接好的、相互依靠的生态系统软件中管理格式升级;其查看-响应系统软件;与 XCM 在 Substrate 中的工作原理。小编还将讨论 XCM 的一些将来开拓方向、打算的功能与开拓它的过程。

一些区块链管理多种资产,例如Ethereum的 ERC-20 框架允许在链上管理许多不一样的资产。一些管理无可替代的资产,例如Ethereum的 Ether,而属于无可替代的 —— 与众不同的实例;Crypto-kitties 属于此类无可替代代币或 NFT 的早期示例。

所以,这次只到底有一个参数(MultiAssets 种类,它规定哪些资产必须从 Origin Register 的一切权中撤出)。但是属于不存在指定放置资产的地方。

小编从一个到底有趣的事实讲起。XCM 属于「跨共识」消息格式,而不止是「跨链」。这种差异属于该格式在最后达成的目的上的标志,该格式不但在链之间沟通,而且在智能合约和模块之间,与通过桥和分片(如 DOT波卡 的 Spree)中发送各种灵感。

一种格式,而既不是一个协议

MultiLocations 用于识别发送 XCM 消息的地方,能够接收资产的地方,然后甚至能够助力描述资产本身的种类,正如小编将看到的。非常到底有用的东西。

跨链转移资产的另一个方式稍微复杂一些。用到了称为准备金(reserve)的再次方。这个名称来自银行的准备金规范,也就在于资产被 「储备」 起来,来让某些已发布的利润承诺具备有可信度。例如,要是小编到底有理由相信在一条独立的平行链上发行的每一个 「衍生」 DOT 恰良好能够兑换 1 个 「真」 DOT (例如 Statemint 或中继链上的 DOT),那样小编就能够将平行链的 DOT 视为在经济上等同于真实的 DOT 。(大部分银行都做部分准备金银行生意,这意味着对方保留的准备金少于面值。这种制作方法平日没那些问题,但是属于当太多人都期望赎回,就会非常的快出毛病。)所以,准备金属于存储 「真实」 资产的位置,出于传输目标,其逻辑和安全性遭到发送方和接收方的信赖。发送方和接收方的任何相应资产都将属于衍生品,但是它们将得到 百分百 的 「真实」 储备资产支持。假设平行链表现好(即它不存在漏洞,并且其治理不存在决定偷走准备金跑路),这将使衍生品 DOT 以及基础储备 DOT 的利润基本相同。储备资产保存在储备链上的发送者 / 接收者的主权账户(即由发送者或接收者链控制的账户)中,所以除非平行链涌现出毛病,不然到底有充分的原因相信这一类资产会遭到很不错的保护。

就算这种看似适度的功能质量也到底有相对大把的配置,它们的选用说不定属于可取的,并且要求一些到底有趣的设计来规避过度拟合。

XCM 剖析

最核心的属于,到底有许多小编期望支持的代币转移模型:小编说不定只愿意容易地控制远程链上的帐户,允许当地链在远程链上具备一个地址以接收金钱并最后将其控制的金钱转移到该远程链上的其他账户中。

对于确实要求支付肯定成本的系统软件,XCM 供应了选用资产购买实行资源的能力。归纳总结来说,这包括了三个部分:

资产身份以两种方式之一表示;不管是具体的还属于抽象的。Abstract 并不存在真的选用,但是它允许通过名字指定资产 ID。这很便捷,但是依靠于接收者以发送者希望的方式讲解名字,这说不定并不一直那样简单。Concrete 在寻常作用与功效中选用并选用地方来清晰地识别资产。对于原生资产(例如 DOT),资产往往被识别为铸造资产的链(在这样的情况下属于 DOT波卡 中继链,这将属于其平行链的地方 .. )。主要在链模块内管理的资产能够通过包括其在该模块内的索引的地方来识别。例如,Karura 平行链说不定指的属于 Statemine 平行链上的资产,地方为 ../Parachain(1000)/PalletInstance(50)/GeneralIndex(42) 。

enum Fungibility { Fungible(NonZeroAmount), NonFungible(AssetInstance), }

最终一部分概念了到达平行链 2001 的消息的一部分。就类似于启动传送操作一样, DepositReserveAsset 编写并发送一条新消息,在这里属于 ReserveAssetDeposited 。正属于这个消息,虽然包含小编概念的 XCM 程序,但是它到达了接收平行链。它看上去类似于如此:

ReserveAssetDeposited((Parent, 10_000_000_000).into()), BuyExecution { fees: (Parent, 10_000_000_000).into(), weight: 3_000_000, }, DepositAsset { assets: All.into(), max_assets: 1, beneficiary: ParentThen(Parachain(2000)).into(), },

当用本文如此的文本写下来时,它们表示为一些 .. (或「父」,封装共识系统软件)组件,后跟一些连接点,一切连接点都用 / 分隔。(当小编用 Rust 之类的语言表达它们时,通常不懂得发生这样的情况,但是它在书面上属于到底有意义的,由于它很相似广泛选用的熟知的目录路径。)连接在其封装共识中标识了一个内部地方系统软件。要是根本不存在父节点 / 连接点,那样小编只说地方属于这里。

小编 XCM 的再次部分属于存入 Holding Register 中剩余的金钱。为此,小编将只选用 DepositAsset 指令。小编事实上并不明白 Holding Register 中还余下或多或少,但是这并无关紧要,由于小编能够为应该存入的资产指定一个通配符。小编将它们放在 Statemint 的主权账户中(标识为 Parachain(1000))。

说回到转账机制,发送方将指示准备金把发送方具备的资产(并将其用作其自身版本的相同资产的准备金)转移到接收方的主权账户中,而准备金(而既不是发送方!)公告接收方对方的新资产。这意味着发送方和接收方不用信赖彼此的逻辑或安全性,而只需信赖用作准备金的链的逻辑或安全性。然而,这确实意味着三方要求协调,这增加了通体费用、时间和复杂性。

如您所见,这看上去和小编上次看到的直接 「提款-购买-存入」 的模式非常相似。区别在于 InitiateTeleport 指令,它插入在最终两条指令(BuyExecution 和 DepositAsset )周边。在幕后,发送链(DOT波卡 中继链)在实行 InitiateTeleport 指令时正在创建一条全新的消息;它获得 xcm 字段并将其放入新的 XCMReceiveTeleportedAsset 中,然后将此 XCM 发送到接收链 (Statemint) 。Statemint 相信 DOT波卡 中继链在发送消息前段时间已经销毁了其一侧的 1 个 DOT。(事实确实这样!)

目前小编在 Statemint 的 Holding Register 中持到底有 1 个 DOT。在小编能够做其他事项前段时间,小编要求在 Statemint 上购买一些实行时间。这个过程看上去也非常的眼熟:

/*snip*/ xcm: Xcm(vec![ BuyExecution { fees: (Parent, 10_000_000_000).into(), weight: 3_000_000, }, DepositReserveAsset { assets: All.into(), max_assets: 1, dest: ParentThen(Parachain(2001)).into(), xcm: /* snip */ }, ]), /*snip*/

正如您说不定猜到的那么,资产属于表示要出售哪些资产的参数,而受益人则说明这一类资产要交给谁 / 在哪儿。当然,小编还缺乏另一条信息,即从谁 / 什么地方获得资产。这属于从原 Register 自动判断出来的。程序开始时,这个 Register 寻常属于依照传输系统软件(网、XCMP 或者其他哪个)来设置的,以反映消息实质来自哪点,和受益人属于同一种类的信息。Origin Register 作为一个受保护的 Register 运行 —— 程序不得任意设置它,尽管到底有两条指令能用来以某种方式改善它。

标签: