原生Token ERC-20预编译¶
概览¶
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预编译不包括deposit
和withdraw
功能,以及包装的Token合约预期的后续事件,例如WETH。
与Solidity接口交互¶
查看先决条件¶
遵循本教程操作,您将需要以下条件:
- 安装MetaMask并连接至Moonbase Alpha测试网
- 在Moonbase Alpha上创建或拥有两个账户,以测试ERC-20预编译不同的功能
- 具有拥有一定数量DEV的账户。 您可以每24小时一次从Moonbase Alpha水龙头上获取DEV代币以在Moonbase Alpha上进行测试
添加Token至MetaMask¶
如果您想要在MetaMask上如同ERC-20一样与Moonbase Alpha Token交互,您可以使用预编译地址创建自定义Token。
首先,打开MetaMask,确保您已连接至Moonbase Alpha并执行以下操作:
- 切换至Assets标签
- 点击Import tokens
现在,您可以创建一个自定义Token:
- 为Token合约地址输入预编译地址:
0x0000000000000000000000000000000000000802
。输入后,Token Symbol和Token Decimal将会自动填充。若未自动填充,请在Token符号一栏输入DEV
,在小数位数一栏输入18
- 点击Add Custom Token
MetaMask将会提示您点击导入Token来导入DEV Token,您可以在钱包中查询token详情。
这样就意味着您已成功将DEV Token作为自定义ERC-20 Token添加至Moonbase Alpha测试网。
设置Remix¶
您可以使用Remix与ERC-20预编译交互。为此,您需要执行以下操作:
- 获取
ERC20.sol
副本 - 将文档内容粘贴至名为
IERC20.sol
的Remix文档
编译合约¶
接下来,您将需要在Remix编译接口:
- 点击Compile标签(从上至下第二个图标)
- 点击Compile IER20.sol来编译接口
如果接口编译成功后,您将在Compile标签旁看到一个绿色的复选标记。
访问合约¶
您将访问指定预编译合约地址的接口,而不是部署ERC-20预编译。为此,请执行以下操作:
- 在Remix的Compile标签下点击Deploy and Run。请注意预编译合约已部署
- 在ENVIRONMENT下拉菜单中选择Injected Web3。选择Injected Web3后,MetaMask将跳出提示连接您的账户至Remix
- 请确保在ACCOUNT一栏显示的账户正确
- 在CONTRACT下拉菜单中选择IERC20 - IERC20.sol。这是预编译合约,所以无需部署任何代码。但是您需要在At Address字段提供预编译地址
- 提供ERC-20预编译地址:
0x0000000000000000000000000000000000000802
并点击At Address
IERC20预编译将会显示在Deployed Contracts列表。
获取Token基本信息¶
ERC-20接口允许您快速获取Token信息,包括Token总供应量、名称、符号和小数位数。您可通过以下步骤获取这些信息:
- 在Deployed Contracts一栏展开IERC20合约
- 点击decimals以获取Moonbase Alpha原生协议Token的小数位数
- 点击name以获取Token名称
- 点击symbol以获取Token符号
- 点击totalSupply以获取在Moonbase Alpha存在的Token总供应量
每一次调用的回复将显示在对应的函数中。
获取账户余额¶
您可以通过调用balanceOf
函数,并输入地址以查看在Moonbase Alpha上任何地址的余额:
- 展开balanceOf函数
- 在owner字段输入您想要查看余额的地址
- 点击call
该账户余额将会显示在balanceOf
函数下。
批准支出¶
您将需要提供支出者地址以及支出者允许支出的Token数量。支出者可以是外部帐户或智能合约。在本示例中,您将批准支出者支出1枚DEV Token。您需执行以下步骤:
- 展开approve函数
- 输入支出者地址。您应该在之前已创建两个账户,因此您可以使用第二个账户作为支出者
- 在value字段输入支出者可以支出的Token数量。在本示例中,您将允许支持者支出1枚以Wei为单位的DEV Token(
1000000000000000000
) - 点击transact
- MetaMask将跳出弹窗,提示您检查交易详情。点击View full transaction details以检查发送给支出者的Token数量和支出者地址
- 如果信息无误,点击Confirm发送交易
交易成功发送后,您将发现您的账户余额未发生变化。因为您只批准支出给定数量的Token,而支出者尚未支出Token。在下一部分,您将使用allowance
函数来验证支出者是否能够代表您支出1枚DEV Token。
获取支出者额度¶
为检查支出者是否收到了批准支出部分的额度,请执行以下步骤:
- 展开allowance函数
- 在owner字段输入您的地址
- 输入在上一部分中您提供的spender地址
- 点击call
调用完成后,支出者的额度将会显示,应为等值1枚DEV Token(1000000000000000000
)。
发送Token¶
想要从一个账户直接发送Token至另一账户,您可以通过以下步骤调用transfer
函数:
- 展开transfer函数
- 输入DEV接收方地址。您应该在之前已创建两个账户,因此您可以使用第二个账户作为接收方
- 输入要发送的DEV Token数量。在本示例中,您将发送1枚DEV Token(
1000000000000000000
) - 点击transact
- MetaMask将跳出弹窗,提示您检查交易详情。如果信息无误,请点击Confirm
交易完成后,您可以使用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标签下选中的是支出者的地址:
接下来,您可以发起和发送转账。请执行以下步骤:
- 展开transferFrom函数
- 在from字段输入您作为所有者的地址
- 在to字段输入接收方地址,应为支出者地址
- 输入发送的DEV Token数量。同样地,目前只允许支出者发送1枚DEV Token,请输入
1000000000000000000
- 点击transact
交易完成后,您可以使用balanceOf
函数来查看您的余额。支出者余额应该增加了1枚DEV Token,且额度现已用尽。想要验证支出者不再拥有额度,您可以调用allowance
函数,输入所有人和支出者地址,结果应为0。
这样就意味着您已成功使用MetaMask和Remix与ERC-20预编译交互!
| Created: December 7, 2021