Skip to content

可铸造XC-20

Cross-Chain Assets Precompiled Contracts Banner

概览

如同XC-20概况文章内所述,XC-20有两种类型外部的和可铸造的。外部和可铸造的XC-20之间最大的不同为可铸造XC-20代表那些直接在Moonbeam网络上铸造和销毁,但是具有原生XCM可互操作性的资产。同样如同XC-20概况文章内所述,可铸造XC-20资产如已在其他链上注册为XCM类型资产,即可自由的在所有注册的平行链上转移。相反地,外部XC-20资产则是锁定在Moonbeam,同时在中继链或是其他平行链上拥有的主权账户中。此教程将涵盖可铸造XC-20类型的资产。

所有XC-20核心皆为Substrate类型资产。一般而言,开发者需要通过Substrate API与任何Substrate资产交互。然而,Moonbeam移除了Substrate的相关部分并让用户和开发者能够通过预编译合约的ERC-20接口与此类资产交互。因此,开发者能够使用标准的以太坊开发者工具与这些资产交互。可铸造XC-20包含ERC-20接口的扩展以及一些关于管理资产和元数据设置(如名称、象征和资产小数位数等)的信息。此外,同样有一些额外的角色供资产进行注册和管理。

目前,可铸造XC-20资产需要通过民主提案创建,并通过链上治理投票。当该提案获得多数投票且同意,其资产即可在Moonbeam上注册并被铸造。除外,创建可铸造XC-20 Token需要一定数量Token的存入(绑定)。

可铸造XC-20资产角色

在您注册和管理可铸造XC-20资产时需要注意一些重要的角色。这些角色,除了创建者之外,皆由所有者通过setTeam extrinsic设置给其他账户,以下为所有角色的列表:

  • 所有者(Owner)—— 拥有合约并能够管理资产的账户
  • 创建者(Creator)—— 负责创建资产并支付相关存入费用的账户
  • 发行者(Issuer)—— 指定能够发行或是铸造Token的账户,默认为所有者(Owner)
  • 管理员(Admin)—— 指定能够销毁Token和解锁账户和资产的账户,默认为所有者(Owner)
  • 锁定者(Freezer)—— 能够锁定账户和资产的指定账户,默认为所有者(Owner)

以下为所有角色各自负责任务的相关表格:

角色 铸造 销毁 锁定 解冻
所有者(Owner)
创建者(Creator) X X X X
发行者(Issuer) X X X
管理员(Admin) X X
锁定者(Freezer) X X X

可铸造XC-20的特殊功能

可铸造XC-20包含所有者或是指定账户才能使用的特殊功能,其被包含在LocalAsset.sol接口当中,具体如下所示:

  • mint(address to, uint256 value) —— 铸造一定数量的Token至指定地址,仅有所有者(Owner)和发行者(Issuer)能够使用此函数
  • burn(address from, uint256 value) —— 销毁指定地址中的指定数量Token,仅有所有者(Owner)和管理员(Admin)能够使用此函数
  • freeze(address account) —— 锁定指定账户一定数量的Token并禁止相关交易,仅有所有者(Owner)和发行者(Issuer)能够使用此函数
  • thaw(address account) —— 解锁特定账户的Token使其能够与Token交互,仅有所有者(Owner)和管理员(Admin)能够使用此函数
  • freezeAsset() —— 锁定整个资产运行以及Token,仅有所有者(Owner)和锁定者(Freezer)能够使用此函数
  • thawAsset() —— 解锁整个资产运行和Token,仅有所有者(Owner)和管理员(Admin)能够使用此函数
  • transferOwnership(address owner) —— 将此资产的所有权转移至新的指定账户,仅有所有者(Owner)能够使用此函数
  • setTeam(address issuer, address admin, address freezer) —— 允许所有者(Owner)设定此Token的发行者(Issuer)、管理员(Admin)以及锁定者(Freezer)。请查看可铸造XC-20角色部分以查看每个角色的细节。仅有所有者(Owner)能够使用此函数
  • setMetadata(string calldata name, string calldata symbol, uint8 decimals) —— 设定此资产的名称、符号以及资产位数。资产位数可以自行配置并不需要于Moonbeam原生资产具有相同的资产位数
  • clearMetadata() —— 清除此资产现有的名称、符号以及资产位数

获取可铸造XC-20资产的列表

要获取Moonbase Alpha测试网上目前可用的可铸造XC-20资产列表,请导向至Polkadot.js Apps并确保您已连接至Moonbase Alpha。不同于外部XC-20资产,可铸造XC-20资产并不会在Assets栏位下出现。要查询可用的可铸造XC-20资产,您需要导向至Developer标签,并在下拉菜单中选择Chain State,然后跟随以下步骤:

  1. selected state query下拉菜单中,选择localAssets
  2. 选择 asset extrinsic
  3. 关掉 include option 滑块
  4. 点击 + 按钮发送查询

Fetch list of cross-chain assets

点击按钮后结果将会显示,包含Moonbase Alpha上已注册的可铸造XC-20资产的资产ID以及其他相关信息。资产ID将会自动生成并为通过BLKAE2散列的随机数以代表创建的本地资产,其ID将会在其后用于访问资产以及计算预编译地址。

获取可铸造XC-20资产的元数据

要快速获得特定可铸造XC-20资产的相关信息(如名称、符号等)您可以使用metadata extrinsic以获得其元数据。举例而言,您可以使用资产ID144992676743556815849525085098140609495,并跟随以下步骤进行操作:

  1. selected state query下拉菜单中,选择localAssets
  2. 选择 asset extrinsic
  3. 关掉 include option 滑块
  4. 输入调用 asset extrinsic返回的资产ID。请注意,如果您复制并粘贴带有逗号的资产ID,则逗号将被自动删除,并且数字可能会被截断。确保它与资产ID完全相同
  5. 点击 + 按钮发送查询

Get asset metadata

在元数据的结果显现后,您还能看到与TestLoacalAsset可铸造XC-20资产对应的资产ID。

计算可铸造XC-20资产的预编译地址

现在您已经获得可用的可铸造XC-20资产列表,但在您通过预编译合约与他们交互之前,您需要通过资产ID生成预编译地址。您可以在检索可铸造XC-20资产列表部分获得特定资产的资产ID。

可铸造XC-20预编译地址通过以下公式计算:

address = "0xFFFFFFFE..." + DecimalToHex(AssetId)

根据上述的计算公式,第一个步骤为获得资产ID的u128表现形式并将其转换成十六进制数值,您可以使用搜寻引擎寻找适合的转换工具。举例而言,资产ID144992676743556815849525085098140609495的十六进制数值为6D1492E39F1674F65A6F600B4589ABD7

可铸造XC-20预编译地址仅可以落在0xFFFFFFFE000000000000000000000000000000000xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF范围之间。因此,地址的首八位数字必定是FFFFFFFE。另外,由于以太坊地址的长度为40个字符,您需要在十六进制数值前输入 0以确保地址长度为40个字符。

十六进制数值的长度已经算出为32个字符,因此前缀的首八个字母FFFFFFFE加上其将会获得您用于与XC-20预编译交互的长度为40个字符的地址。举例而言,此示例中的完整地址为0xFFFFFFFE6D1492E39F1674F65A6F600B4589ABD7

现在您已经成功计算可铸造XC-20预编译地址,您可以如同操作ERC-20资产一般在Remix通过地址与此类XC-20资产交互。

注册一个可铸造XC-20资产

这一部分将会引导您如何在Polkadot.js Apps注册一个资产并使用Remix与可铸造XC-20资产特定的函数交互。如果您仅想通过标准ERC-20接口与可铸造XC-20资产交互,请查看XC-20预编译页面的如何使用Remix与预编译合约交互部分。

查看先决条件

要在Moonbase Alpha上注册一个可铸造XC-20资产,您需要准备以下内容:

创建提案

要在Moonbeam上创建可铸造XC-20资产,首个步骤为创建提案。资产的创建者(Creator)将需要存入一定资产,每个网络所需的锁定数量如下:

10000 GLMR
100 MOVR
100 DEV

接着,导向至Polkadot.js Apps并确保您已连接至Moonbase Alpha。在网页最上方点击Governance并在下拉菜单中选择Democracy。接着,选择+ Submit preimage并跟随以下步骤进行操作:

  1. 选择您希望用于创建提案所要用的账户
  2. propose下拉菜单中选择assetManager
  3. 接着选择registerLocalAsset函数
  4. 输入创建者(Creator)的地址
  5. 输入所有者(Owener)的地址
  6. 设定isSufficient,如果设定为true,则其可以在转移至另一个没有原生Token余额的账户
  7. 设定minBalance
  8. 复制preimage hash并用于下个步骤
  9. 点击+ Submit preimage

Create preimage to register the mintable XC-20

当原像(Preimage)已经成功创建并提交后,您需要完整地提交提案。您可以点击+ Submit proposal并跟随以下步骤进行操作:

  1. 选择您希望用于提交提案的账户

  2. preimage hash中贴上先前复制的内容,如果您并未复制数值,您可以在页面上方选择Developer并在下拉选单中点选Chain State,接着查询使用preimages函数,确保include option为关闭状态后提交查询

  3. 您可以根据需求自由更新存入数量

  4. 点击+ Submit proposal

Create proposal to register the mintable XC-20

您将会看到弹出视窗并要求签署提案,当您签署成功后您将会在Democracy页面的proposals一栏下方见到您的提案

您的提案将会被交付至民主和链上治理,请查看Moonbeam的治理页面以了解Moonbeam的治理是如何运作的。

设定资产元数据

当提案通过并颁布后,您设定为所有者(Owner)的账户将能够设定资产元数据,包含资产名称、符号以及资产位数。您需要存入一定数量Token以设置元数据,以下为每个网络的要求:

10.68 GLMR base fee + (0.01 GLMR x number of bytes stored)
1.0068 MOVR base fee + (0.0001 MOVR x number of bytes stored)
1.0068 DEV base fee + (0.0001 DEV x number of bytes stored)

要设置资产元数据,您需要获取资产ID。当您拥有资产ID,点击页面上方的Developer并在下拉选单中选择Extrinsics,接着跟随以下步骤进行操作:

  1. 选择所有者(Owner)账户
  2. submit the following extrinsic下拉选单中,选择localAssets
  3. 接着选择setMetadata extrinsic
  4. 输入资产ID
  5. 输入资产名称
  6. 设置资产符号
  7. 设置资产位数,其不必与Moonbeam原生Token一样为18位数,您可以根据需求配置
  8. 点击Submit Transaction

Set metadata for mintable XC-20

您可以使用Extrinsics页面使用其他函数如铸造Token、提名团队、锁定以及解锁资产/账户等。

使用Remix与可铸造XC-20资产特定功能交互

如前所示,此部分教程将仅涵盖Token合约拥有者以及具有特定角色的指定账户如何与可铸造XC-20资产的特定功能交互。如果您仅想通过标准ERC-20接口与可铸造XC-20资产交互,请查看XC-20预编译页面中的使用Remix与预编译合约交互部分。

首先,您需要添加LocalAssetRemix,接着跟随以下步骤进行操作:

  1. 获得LocalAsset.sol复制文件
  2. 将其内容贴入Remix文件并命名为ILocalAsset.sol

Load the interface in Remix

当您在Remix运行接口,您需要编译它:

  1. 点击页面上方Compile标签
  2. 编译ILocalAsset.sol文件

Compiling IERC20.sol

如果接口被成功编译,您将能够在Compile标签旁看到绿色打勾符号。

与部署预编译合约不同,您将会使用XC-20预编译地址访问接口:

  1. 点击Remix中Compile标签下方的Deploy and Run标签。请注意此处预编译合约已经为部署状态
  2. 确保ENVIRONMENT下拉选单中的Injected Web3已被选择。当您选择Injected Web3,您的MetaMask将会弹出视窗以将您的账户连接至Remix
  3. 确认ACCOUNT下方显示为正确的账户
  4. 确认已在CONTRACT下拉选单中选择ILocalAsset - ILocalAsset.sol。由于此为预编译合约,因此并不需要部署任何节点。相反地,我们将在At Address字段提供预编译合约的地址
  5. 提供在计算预编译合约地址部分获得的XC-20预编译合约地址,0xFFFFFFFE6D1492E39F1674F65A6F600B4589ABD7,并点击At Address

Access the address

注意事项

您可以通过搜寻引擎查询可用工具自行校验XC-20预编译合约的地址。当地址校验成功后,您可以再将其用于At Address字段。

可铸造XC-20资产的预编译合约将会出现在Deployed Contracts的列表下方,现在您可以自由使用任何可用的函数。

Interact with the precompile functions