Skip to content

原生Token ERC-20预编译

Precompiled Contracts Banner

概览

Moonbeam上的原生Token ERC-20预编译合约允许开发者通过ERC-20接口与原生协议Token交互。

这种预编译的主要优势之一是消除了将协议Token包装为ERC-20智能合约必要性,例如以太坊上的WETH。此外,还可以防止具有相同协议Token的多个包装。因此,需要通过ERC-20接口与协议Token交互的DApp无需单独的智能合约即可实现。

在后台,ERC-20预编译执行与Substrate Balances Pallet相关的特定Substrate操作,由Rust编码。Balances Pallet提供处理Moonbeam各种余额类型、设置余额、转移余额等功能。

本教程将向您展示如何通过ERC-20预编译用Moobase Alpha测试网的原生协议Token——DEV Token交互。

预编译位于以下地址:

0x0000000000000000000000000000000000000802
0x0000000000000000000000000000000000000802
0x0000000000000000000000000000000000000802

注意事项

在Moonbeam使用预编译合约时,可能会出现一些意想不到的后果。 请参阅安全注意事项 页面了解更多信息。

ERC-20接口

Moonbeam上的ERC20.sol接口遵循EIP-20 Token标准,即智能合约中Token的标准API接口。此标准定义了Token合约必须实现与不同应用程序互操作所需的功能和事件。

该接口包括以下函数:

  • name() - 只读函数,用于返回Token名称
  • symbol() - 只读函数,用于返回Token符号
  • decimals() - 只读函数,用于返回Token小数位数
  • totalSupply() - 只读函数,用于返回现有的Token总数
  • balanceOf(address who) - 只读函数,用于返回指定地址的余额
  • allowance(address owner, address spender) - 只读函数,用于检查和返回所有者允许给支出者的Token数量
  • transfer(address to, uint256 value) - 转移一定Token数量至特定地址,若交易成功则返回True
  • approve(address spender, uint256 value) - 批准指定地址代表msg.sender支出特定的Token数量。若成功则返回True
  • transferFrom(address from, address to, uint256 value) - 从一个指定地址转移Token至另一个指定地址,若成功则返回True

注意事项

ERC-20标准没有明确多次调用approve的具体影响,但是使用此功能多次更改额度可能会开启攻击向量。为避免不正确或意外的交易排序,您可以先将spender额度减少至0,然后再设置一个预期的额度。更多关于攻击向量的详情,请参阅ERC-20 API: An Attack Vector on Approve/TransferFrom Methods

该接口也包含以下必要事件:

  • Transfer(address indexed from, address indexed to, uint256 value) - 执行交易时发出
  • Approval(address indexed owner, address indexed spender, uint256 value) - 注册通过时发出

注意事项

ERC-20预编译不包括depositwithdraw功能,以及包装的Token合约预期的后续事件,例如WETH。

与Solidity接口交互

查看先决条件

遵循本教程操作,您将需要以下条件:

添加Token至MetaMask

如果您想要在MetaMask上如同ERC-20一样与Moonbase Alpha Token交互,您可以使用预编译地址创建自定义Token。

首先,打开MetaMask,确保您已连接至Moonbase Alpha并执行以下操作:

  1. 切换至Assets标签
  2. 点击Import tokens

Import Tokens from Assets Tab in MetaMask

现在,您可以创建一个自定义Token:

  1. 为Token合约地址输入预编译地址:0x0000000000000000000000000000000000000802。输入后,Token SymbolToken Decimal将会自动填充。若未自动填充,请在Token符号一栏输入DEV,在小数位数一栏输入18
  2. 点击Add Custom Token

Add Custom Token

MetaMask将会提示您点击导入Token来导入DEV Token,您可以在钱包中查询token详情。

Confirm and Import Tokens

这样就意味着您已成功将DEV Token作为自定义ERC-20 Token添加至Moonbase Alpha测试网。

设置Remix

您可以使用Remix与ERC-20预编译交互。为此,您需要执行以下操作:

  1. 获取ERC20.sol副本
  2. 将文档内容粘贴至名为IERC20.sol的Remix文档

编译合约

接下来,您将需要在Remix编译接口:

  1. 点击Compile标签(从上至下第二个图标)
  2. 点击Compile IER20.sol来编译接口

Compiling IERC20.sol

如果接口编译成功后,您将在Compile标签旁看到一个绿色的复选标记。

访问合约

您将访问指定预编译合约地址的接口,而不是部署ERC-20预编译。为此,请执行以下操作:

  1. 在Remix的Compile标签下点击Deploy and Run。请注意预编译合约已部署
  2. ENVIRONMENT下拉菜单中选择Injected Web3。选择Injected Web3后,MetaMask将跳出提示连接您的账户至Remix
  3. 请确保在ACCOUNT一栏显示的账户正确
  4. CONTRACT下拉菜单中选择IERC20 - IERC20.sol。这是预编译合约,所以无需部署任何代码。但是您需要在At Address字段提供预编译地址
  5. 提供ERC-20预编译地址:0x0000000000000000000000000000000000000802并点击At Address

Access the address

IERC20预编译将会显示在Deployed Contracts列表。

获取Token基本信息

ERC-20接口允许您快速获取Token信息,包括Token总供应量、名称、符号和小数位数。您可通过以下步骤获取这些信息:

  1. Deployed Contracts一栏展开IERC20合约
  2. 点击decimals以获取Moonbase Alpha原生协议Token的小数位数
  3. 点击name以获取Token名称
  4. 点击symbol以获取Token符号
  5. 点击totalSupply以获取在Moonbase Alpha存在的Token总供应量

Total Supply

每一次调用的回复将显示在对应的函数中。

获取账户余额

您可以通过调用balanceOf函数,并输入地址以查看在Moonbase Alpha上任何地址的余额:

  1. 展开balanceOf函数
  2. owner字段输入您想要查看余额的地址
  3. 点击call

Get Balance of an Account

该账户余额将会显示在balanceOf函数下。

批准支出

您将需要提供支出者地址以及支出者允许支出的Token数量。支出者可以是外部帐户或智能合约。在本示例中,您将批准支出者支出1枚DEV Token。您需执行以下步骤:

  1. 展开approve函数
  2. 输入支出者地址。您应该在之前已创建两个账户,因此您可以使用第二个账户作为支出者
  3. value字段输入支出者可以支出的Token数量。在本示例中,您将允许支持者支出1枚以Wei为单位的DEV Token(1000000000000000000
  4. 点击transact
  5. MetaMask将跳出弹窗,提示您检查交易详情。点击View full transaction details以检查发送给支出者的Token数量和支出者地址
  6. 如果信息无误,点击Confirm发送交易

Confirm Approve Transaction

交易成功发送后,您将发现您的账户余额未发生变化。因为您只批准支出给定数量的Token,而支出者尚未支出Token。在下一部分,您将使用allowance函数来验证支出者是否能够代表您支出1枚DEV Token。

获取支出者额度

为检查支出者是否收到了批准支出部分的额度,请执行以下步骤:

  1. 展开allowance函数
  2. owner字段输入您的地址
  3. 输入在上一部分中您提供的spender地址
  4. 点击call

Get Allowance of Spender

调用完成后,支出者的额度将会显示,应为等值1枚DEV Token(1000000000000000000)。

发送Token

想要从一个账户直接发送Token至另一账户,您可以通过以下步骤调用transfer函数:

  1. 展开transfer函数
  2. 输入DEV接收方地址。您应该在之前已创建两个账户,因此您可以使用第二个账户作为接收方
  3. 输入要发送的DEV Token数量。在本示例中,您将发送1枚DEV Token(1000000000000000000
  4. 点击transact
  5. MetaMask将跳出弹窗,提示您检查交易详情。如果信息无误,请点击Confirm

Send Standard Transfer

交易完成后,您可以使用balanceOf函数或查看MetaMask来查看您的余额。您将会发现您的余额减少了1枚DEV Token。您也可以使用balanceOf函数以查看接收方余额已显示增加1枚DEV Token。

发送TransferFrom函数

到目前为止,您应该已批准支出1枚DEV Token,并通过标准transfer函数发送了1枚DEV Token。 transferFrom函数与标准的transfer函数不同的是它允许您定义Token接收方的地址。只要您有Token,您就可以指定一个拥有额度的地址或您的地址。在本示例中,您将使用支出者的帐户发起一笔交易,将允许的Token从所有者转移到支出者。支出者可以将Token发送至任何账户,但在本示例中,以所有者发送至支出者为例。

首先,您需要在MetaMask切换支出者账户。切换成功后,目前在Remix的Accounts标签下选中的是支出者的地址:

Switch accounts Remix

接下来,您可以发起和发送转账。请执行以下步骤:

  1. 展开transferFrom函数
  2. from字段输入您作为所有者的地址
  3. to字段输入接收方地址,应为支出者地址
  4. 输入发送的DEV Token数量。同样地,目前只允许支出者发送1枚DEV Token,请输入1000000000000000000
  5. 点击transact

Send Standard Transfer

交易完成后,您可以使用balanceOf函数来查看您的余额。支出者余额应该增加了1枚DEV Token,且额度现已用尽。想要验证支出者不再拥有额度,您可以调用allowance函数,输入所有人和支出者地址,结果应为0。

Zero Allowance

这样就意味着您已成功使用MetaMask和Remix与ERC-20预编译交互!