撰文:Joe Petrowski,Web3 Foundation 系统平行链团队负责人

编译:OneBlock Community

绝大多数人习惯通过名称或符号来辨认资产,比如 “Tether” 或 “USDT”。如果你熟悉以太坊,应该已习惯于 0x 合约地址。

在波卡,资产中心(Asset Hub)在协议中直接托管了资产功能,使用简单的整数作为资产 ID。“1984”这个命名有点厚脸皮,但对人类来说肯定比 0xdAC17F958D2ee523a2206206994597C13D831ec7 更容易记住(和验证)。

现在波卡有了另一个与此资产功能相同的并行实例,不同之处在于此实例使用了一种名为“多位置(multilocation)”的 XCM 原语来辨认资产。通过这篇解释,我希望能传达出这一特性为波卡网络内,以及网络内可达的资产利用创造了富有表现力和强大的模式。

技术详解波卡新进展:资产中心支持储备多链资产

“多位置”可辨认本地和外部资产

当资产中心首次启动时,它只托管了一个资产面板(Assets pallet)的实例,允许任何人领取一个可用的资产 ID 并创建他们的资产。资产中心没有为每个资产制定自定义合约,而是嵌入了资产逻辑,将其视为一级原语。每个资产都有相同的功能。

这些可领取的、基于整数的资产 ID 的资产称为“本地资产”。资产中心主要用于这些资产的创建者,通常是有储备支持的稳定币,比如 USDT。但是,协议只强制执行资产 ID(在这种情况下是整数)的唯一性。创建者可以设置资产符号等元数据。因此,用户仍然需要对资产进行一些尽职调查;任何人都可以将其资产命名为 USDT,但用户通常想选择的是 Tether 创建的 USDT。

资产中心充当了资产创建者的 “管理门户”,使他们能够铸造和销毁代币,并了解在整个波卡网络中的总发行量,包括已发送到网络中其他位置的代币。

但是资产 ID 本身并不太具表现力。虽然比合约地址更容易验证,但该 ID 并未传达给用户有关资产的任何信息。这时候就轮到XCM(跨共识消息格式)出场了。

多位置可表达相对路径。它们相对于解释的位置:“我怎样去超市” 将根据起始位置而有不同的方向。在最基本的层面上,这些路径表示到其他链的方向,也可以表达几乎任何事物的方向:资产、合约、面板索引、治理机构、账户等等。

多位置有一系列的交叉点,通常分为两个部分:“父级(parents)”与延伸的路径,例如“parents: 1, interior: Parachain(9,000)”。这表示 “前往我的父级,然后从那转向平行链 9,000”。在这里“父级”是一个包含共识的系统。例如,中继链是包含平行链的共识系统,而一个平行链可以是包含智能合约的共识系统。在这个示例中,多位置可来自另一个平行链,比如资产中心。平行链 9,000 将是一对兄弟,因为它们共享同一个父级,即中继链。

作为资产标识符,多位置相对于绝对标识符(例如地址、哈希、整数)具有重大优势。首先,资产的多位置本身就表明了控制实体。在上面的示例中表明的是 Parachain 9,000 的治理。在查看绝对标识符时,用户必须信任发行实体及其声明,例如链上代币与链下资产一一对应。多位置则包含平行链、智能合约或其他协议,这实际上表明了控制资产的逻辑。不过这也不意味用户可以放弃所有必要尽职调查,例如平行链 9,000 也许有一个值得信任的 “超级用户”。但多位置是能够传达给用户这个资产是由哪个协议控制的。

在多位置的终点之外,它实际上明确了“指挥链”。举一个更长的例子,平行链 9,000 上 ID 42 的资产:“parents: 1, interior: Parachain(9,000), PalletIndex(99), GeneralIndex(42)”。这个资产由一个面板(pallet)控制,这个面板位于平行链的共识内部,而这个共识又位于共享父级(中继链)的共识内部。多位置甚至可以表示完全外部的共识系统,例如 “parents: 2, interior: GlobalConsensus(Ethereum)”。“从平行链的角度来看,这意味着“向上两级(即中继链之上),然后进入以太坊的共识”。

这些位置非常类似于 Unix 文件路径,例如 “../Parachain (9000)/PalletIndex (99)/GeneralIndex (42)” 或 “../../GlobalConsensus (Ethereum)”。

最终,波卡的资产中心可以表现任何可从波卡访问的资产。无论是通过本地面板还是合约调用、XCMP 还是桥,协议原生代币或其他链的本地资产,资产中心都为所有资产提供了一个共同的接口,资产的标识符可传达它的主权位置。

两类资产转移关系:传送和储备

XCM 语言有两种表达位置 / 资产对(pair)的资产转移关系的方式:传送(teleports)和储备(reserves)。这些定义了资产中心与其他链之间的关系以及它们如何交互。

传送很简单。当两个链相互信任给定资产时,发送方可以简单地销毁它,并发出一条接收方铸造它的指令。只要发送方相信接收方不会铸造超过发送的数量,发送方就可以接受同样的传送指令。

储备比较复杂。当资产来源的链不信任另一链时,它可以将资产放入目标链的主权账户中,并向目标链发送消息,表示已向其本地账户记录资产。目标链随后可以为其用户铸造衍生资产。储备完成后,目标链可发送回复消息,指示来源链将资产从其账户移出(假定它已销毁了相应的衍生资产)。

在储备情况下,信任关系是单向的。铸造衍生资产的链信任发行链维护其主权账户余额并尊重赎回。但发行链不信任目标链能如实处理资产。

这里需要注意的一点是,信任关系存在于位置 / 资产对中:也就是说,一条链可以信任另一条链传送某些资产,但不信任传送其他事物

那么,谁信任谁?信任什么事?实体始终信任其多位置范例中的 “父级”。例如,位于 Parachain 8,000 上的智能合约信任 Parachain 8,000 的治理,而 Parachain 8,000 信任波卡中继链。波卡中继链由“根起源”治理,可以执行任何指令,包括将平行链踢出。波卡的根起源还管理着其所有系统平行链(事实上,中继链加上所有系统平行链可以被视为单一的 “波卡协议”)。

波卡网络中所有链和子协议(例如智能合约)都信任波卡协议,因此它们应该可以与协议传送资产。事实上,使用储备将会非常愚蠢:如果波卡协议不喜欢其在起源链上的储备余额,它可以通过根起源公投直接重写自己喜欢的余额。

另一方面,波卡协议无法将这种普遍信任扩展到其中的成员。但它可以信任一个位置,来管理起源于该位置的资产。协议可以信任 Parachain 9,000 管理其原生代币(PNT,“品脱”?)以及在其中创建的资产,例如本地发行的代币。因此,在与 Parachain 9,000 交互时,资产中心将传送PNT,以认可 PNT 起源于该平行链。而对于 Parachain 9,000,资产中心会使用PET(Parachain 8,000 的代币,发音不那么模糊)的储备转账。

资产中心担任储备位置,交互无限资产

PET 的创建由 Parachain 8,000 的治理控制,后者接受波卡协议的治理。因此,波卡自然信任 Parachain 8,000 的 PET,因为 PET 是 Parachain 8,000 协议的一部分。但波卡和 Parachain 8,000 都不信任其他平行链*能够充当 PET 的储备位置。

(*附注:不过也可以选择信任:Parachain 8,000 可能有其他认同其治理起源的兄弟平行链,就像许多系统链认可波卡 OpenGov 起源一样。在这方面,最好考虑可包含多个链的主权系统,而不是单独的链。)

这一概念沿着指挥链,延伸到其他在 Parachain 8,000 内创建的资产。实际上,这与独立链或异步无关;同一链上的两个智能合约可能不会互相信任,以管理彼此的资产,但它们都信任它们存在的链。

鉴于这种双向信任关系,资产中心可以充当储备资产的目的地。Parachain 8,000 可以将其 PET 传送到资产中心,然后资产中心可以充当其他位置之间转账的储备位置。这意味着 Parachain 9,000 可以把资产中心作为其 PET 的储备位置以发送到其他平行链。

但是,这些其他位置现在可将 Parachain 8,000 和资产中心都视为 PET 的储备位置。

在实践中,希望以这种方式使用资产中心的协议(平行链、智能合约等)将需要管理给定资产的多个储备位置的想法。实际上,这可能意味着为每项资产选择一个储备位置,平行链和其他协议之间的共同协议和标准也将简化它们的交互

在波卡网络中有数千个协议,与所有协议建立通信渠道是笨重、不可取或不切实际的。仅因为一个协议不想与每个协议建立通信渠道,它可能仍然希望免费访问资产。由于资产中心可以代表和充当任何来自波卡网络的可达资产的储备位置,而不仅仅是波卡网络内部资产,因此资产中心可以充当一个单一的储备位置,从中一个协议可以管理和交互几乎无限数量的资产。

代码实操:将平行链资产传送至资产中心

让我们看一个示例,如何编写一个 XCM 程序,将平行链的资产传送到资产中心。对于希望将此逻辑添加到平行链的开发者,应该注意以下两点。

首先,XCM 程序的执行是以执行程序实例的角度,而不是程序的起源。这意味着应用应该从资产中心的角度,发送引用资产和位置的程序

其次,支付费用可能并不轻松。当在系统链之间传送 DOT,或对主权帐户持有 DOT 的链使用储备指令时,这些应用可以使用它们正在交易的资产支付费用。然而,资产中心可能不会接受应用的资产用于支付费用,因此应用程序需要用可接受的资产支付费用。添加资产转换(Asset Conversion)将使这一过程更简单和灵活,但链仍然需要启动能够支付费用的交易对。

首先定义一些资产:DOT 和平行链 9,000 的原生资产 PINTs,以及接收资产的受益人来开始我们的程序:

技术详解波卡新进展:资产中心支持储备多链资产

在构建发送到资产中心的程序之前,发送方需要记账他们正在传送的资产。一条链还可以配置其 XCM 执行器以更优雅地处理。

技术详解波卡新进展:资产中心支持储备多链资产

现在,开始构建发送到资产中心的 XCM 程序:

技术详解波卡新进展:资产中心支持储备多链资产

这个程序将从平行链的主权账户取出 DOT,以购买执行此程序所需的权重,接收传送到的 PINTs,退还任何未使用的权重,最后将两张资产(取出 DOT 加上 PINTs 的所有变化)存入受益人账户。

请记住,发送方可能需要在发送此消息之前进行一些记账工作。这种类型的程序构建不应该直接提供给用户,而应该在适当检查外部程序之后提供。几乎可以肯定,发送方不是 DOT 的可信传送者,相反,发送者可能传送两种资产,且可能不会在其主权账户中存有 DOT 供取出。

这意味着,他们的本地链上可能有一个由储备支持的衍生品 DOT。从其主权账户中提取此 DOT 并将其转入费用支付,受益人则将减少其储备。因此,发送者应在发送此消息之前便销毁此储备支持的描述,以免其链在储备中没有完整的抵押品。发送者可以从发起传送的用户那里扣除,或者保留自己的 DOT 库以供提取(偶尔补充下储备)。有关更完整的示例,请参阅 Trappist 中完成的记帐:

🔗https://github.com/paritytech/trappist/pull/266?ref=cms.polkadot.network

结语

将外部资产添加到资产中心开启了新的范例,如多位置作为资产标识符和多个储备位置,使得在网络内可以进行富有表现力和便捷的互动。

Parity 将在未来几个月内发布更多的示例和教程,以展示使用外部资产的一些常见模式。平行链开发者应该留意 Rococo 上的 Trappist,而钱包/集成开发者则应该关注资产转移 API

🔗https://github.com/paritytech/asset-transfer-api?ref=cms.polkadot.network