可铸造XC-20¶
概览¶
如同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 Solidity接口¶
可铸造XC-20 token的Solidity接口是以下三个接口的组合:
可铸造XC-20的特殊功能¶
可铸造XC-20包含所有者或是指定账户才能使用的特殊功能,其被包含在LocalAsset.sol接口当中,具体如下所示:
-
mint(address to, uint256 value) —— 铸造一定数量的Token至指定地址,仅有所有者(Owner)和发行者(Issuer)能够使用此函数
注意事项
可以铸造的最大
value
实际受限于uint128。如果总供应量超过2^128(不带小数),可铸造XC-20将表现不同,铸币将因溢出检查而失败。这对于传统token来说不太可能发生,因为它们无意达到如此高的数量。更多信息,请参考安全注意事项页面的可铸造XC-20 vs ERC-20部分。 -
burn(address from, uint256 value) —— 销毁指定地址中的指定数量Token,仅有所有者(Owner)和管理员(Admin)能够使用此函数
注意事项
Substrate中的
burn
函数与标准ERC-20burn
函数行为不同,因为它不需要from
账户拥有由value
指定的token数量。更多信息,请参考安全注意事项页面的可铸造XC-20 vs ERC-20部分。 -
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,然后跟随以下步骤:
- 在selected state query下拉菜单中,选择localAssets
- 选择 asset extrinsic
- 关掉 include option 滑块
- 点击 + 按钮发送查询
点击按钮后结果将会显示,包含Moonbase Alpha上已注册的可铸造XC-20资产的资产ID以及其他相关信息。资产ID将会自动生成并为通过BLKAE2散列的随机数以代表创建的本地资产,其ID将会在其后用于访问资产以及计算预编译地址。
获取可铸造XC-20资产的元数据¶
要快速获得特定可铸造XC-20资产的相关信息(如名称、符号等)您可以使用metadata extrinsic以获得其元数据。举例而言,您可以使用资产ID144992676743556815849525085098140609495
,并跟随以下步骤进行操作:
- 在selected state query下拉菜单中,选择localAssets
在元数据的结果显现后,您还能看到与TestLoacalAsset可铸造XC-20资产对应的资产ID。
计算可铸造XC-20资产的预编译地址¶
现在您已经获得可用的可铸造XC-20资产列表,但在您通过预编译合约与他们交互之前,您需要通过资产ID生成预编译地址。您可以在检索可铸造XC-20资产列表部分获得特定资产的资产ID。
可铸造XC-20预编译地址通过以下公式计算:
address = "0xFFFFFFFE..." + DecimalToHex(AssetId)
根据上述的计算公式,第一个步骤为获得资产ID的u128表现形式并将其转换成十六进制数值,您可以使用搜寻引擎寻找适合的转换工具。举例而言,资产ID144992676743556815849525085098140609495
的十六进制数值为6D1492E39F1674F65A6F600B4589ABD7
。
可铸造XC-20预编译地址仅可以落在0xFFFFFFFE00000000000000000000000000000000
和 0xFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
范围之间。因此,地址的首八位数字必定是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资产,您需要准备以下内容:
- 安装MetaMask并将其连接至Moonbase Alpha测试网
- 具有拥有一定数量DEV的账户 您可以每24小时一次从Moonbase Alpha水龙头上获取DEV代币以在Moonbase Alpha上进行测试
创建提案¶
要在Moonbeam上创建可铸造XC-20资产,首个步骤为创建提案。资产的创建者(Creator)将需要存入一定资产,每个网络所需的锁定数量如下:
10000 GLMR
100 MOVR
100 DEV
接着,导向至Polkadot.js Apps并确保您已连接至Moonbase Alpha。在网页最上方点击Governance并在下拉菜单中选择Democracy。接着,选择+ Submit preimage并跟随以下步骤进行操作:
- 选择您希望用于创建提案所要用的账户
- 在propose下拉菜单中选择assetManager
- 接着选择registerLocalAsset函数
- 输入创建者(Creator)的地址
- 输入所有者(Owener)的地址
- 设定isSufficient,如果设定为
true
,则其可以在转移至另一个没有原生Token余额的账户 - 设定minBalance
- 复制preimage hash并用于下个步骤
- 点击+ Submit preimage
当原像(Preimage)已经成功创建并提交后,您需要完整地提交提案。您可以点击+ Submit proposal并跟随以下步骤进行操作:
- 选择您希望用于提交提案的账户
- 在preimage hash中贴上先前复制的内容,如果您并未复制数值,您可以在页面上方选择Developer并在下拉选单中点选Chain State,接着查询使用preimages函数,确保include option为关闭状态后提交查询
- 您可以根据需求自由更新存入数量
- 点击+ Submit proposal
您将会看到弹出视窗并要求签署提案,当您签署成功后您将会在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,接着跟随以下步骤进行操作:
- 选择所有者(Owner)账户
- 在submit the following extrinsic下拉选单中,选择localAssets
- 接着选择setMetadata extrinsic
- 输入资产ID
- 输入资产名称
- 设置资产符号
- 设置资产位数,其不必与Moonbeam原生Token一样为18位数,您可以根据需求配置
- 点击Submit Transaction
您可以使用Extrinsics页面使用其他函数如铸造Token、提名团队、锁定以及解锁资产/账户等。
使用Remix与可铸造XC-20资产特定功能交互¶
如前所示,此部分教程将仅涵盖Token合约拥有者以及具有特定角色的指定账户如何与可铸造XC-20资产的特定功能交互。如果您仅想通过标准ERC-20接口与可铸造XC-20资产交互,请查看XC-20预编译页面中的使用Remix与预编译合约交互部分。
首先,您需要添加LocalAsset
至Remix,接着跟随以下步骤进行操作:
- 获得LocalAsset.sol复制文件
- 将其内容贴入Remix文件并命名为ILocalAsset.sol
当您在Remix运行接口,您需要编译它:
- 点击页面上方Compile标签
- 编译ILocalAsset.sol文件
如果接口被成功编译,您将能够在Compile标签旁看到绿色打勾符号。
与部署预编译合约不同,您将会使用XC-20预编译地址访问接口:
- 点击Remix中Compile标签下方的Deploy and Run标签。请注意此处预编译合约已经为部署状态
- 确保ENVIRONMENT下拉选单中的Injected Web3已被选择。当您选择Injected Web3,您的MetaMask将会弹出视窗以将您的账户连接至Remix
- 确认ACCOUNT下方显示为正确的账户
- 确认已在CONTRACT下拉选单中选择ILocalAsset - ILocalAsset.sol。由于此为预编译合约,因此并不需要部署任何节点。相反地,我们将在At Address字段提供预编译合约的地址
- 提供在计算预编译合约地址部分获得的XC-20预编译合约地址,
0xFFFFFFFE6D1492E39F1674F65A6F600B4589ABD7
,并点击At Address
注意事项
您可以通过搜寻引擎查询可用工具自行校验XC-20预编译合约的地址。当地址校验成功后,您可以再将其用于At Address字段。
可铸造XC-20资产的预编译合约将会出现在Deployed Contracts的列表下方,现在您可以自由使用任何可用的函数。
| Created: June 24, 2022