在区块链的世界里,以太坊无疑是最具影响力的平台之一,而其上的ERC20标准更是奠定了代币经济的基石,ERC20是一种技术标准,定义了以太坊上同质化代币(即每个代币都是完全相同的,可互换)的接口和行为规范,遵循ERC20标准开发的代币可以轻松与钱包、交易所、去中心化应用(DApp)等生态系统集成,本文将带你一步步了解如何编写一个基本的以太坊ERC20智能合约。

什么是ERC20标准

ERC20标准规定了代币合约必须实现的一组方法和事件,主要包括:

必须实现的方法(函数):

  • name():返回代币的名称,"MyToken"。
  • symbol():返回代币的符号,"MTK"。
  • decimals():返回代币的小数位数,用于计算精度,通常为18。
  • totalSupply():返回代币的总供应量。
  • balanceOf(address _owner):返回指定地址的代币余额。
  • transfer(address _to, uint256 _value):向指定地址转移指定数量的代币。
  • transferFrom(address _from, address _to, uint256 _value):从指定地址转移指定数量的代币(通常需要先调用approve授权)。
  • allowance(address _owner, address _spender):返回_owner授权给_spender的代币数量。
  • approve(address _spender, uint256 _value):授权_spender可以从调用者账户中转移最多_value数量的代币。

必须实现的事件:

  • Transfer(address indexed from, address indexed to, uint256 value):当代币被转移时触发(从fromto,数量为value),创建代币时,from地址为0x000...000
  • Approval(address indexed owner, address indexed spender, uint256 value):当approve方法被调用时触发,表示owner授权给spender的额度为value

开发环境准备

在开始编写合约之前,你需要准备以下工具:

  1. Solidity 编译器:Solidity是以太坊智能合约的主要编程语言。
  2. 以太坊客户端或开发框架:如Truffle、Hardhat,或者直接使用在线的Remix IDE(Remix非常适合初学者,无需本地配置)。
  3. MetaMask钱包:用于与以太坊网络交互,测试和部署合约。
  4. 测试网ETH:用于支付部署合约时的gas费用,你可以从以太坊测试网水龙头获取测试ETH。

编写一个简单的ERC20合约

我们将使用Solidity语言,并借助OpenZeppelin库来编写一个安全且标准的ERC20合约,OpenZeppelin是一个提供安全、可测试的智能合约库的框架,强烈建议在实际项目中使用。

步骤1:创建项目文件 在你的项目目录下,创建一个名为MyToken.sol的文件。

步骤2:编写合约代码 以下是一个基于OpenZeppelin的ERC20合约示例:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
    constructor(string memory name, string memory symbol) ERC20(name, symbol) {
        // 在部署时,向合约创建者(msg.sender)发行1000000个代币
        // 假设decimals为18,所以实际发行数量为 1000000 * 10^18
        _mint(msg.sender, 1000000 * 10**decimals());
    }
}

代码解释:

  • SPDX-License-Identifier: MIT:指定许可证类型,这是良好的实践。
  • pragma solidity ^0.8.20;:指定Solidity编译器版本,^0.8.20表示使用0.8.20或更高但不包括0.9.0的版本。
  • import "@openzeppelin/contracts/token/ERC20/ERC20.sol";:导入OpenZeppelin的ERC20标准合约。
  • contract MyToken is ERC20 { ... }:定义名为MyToken的合约,继承自OpenZeppelin的ERC20合约。
  • constructor(string memory name, string memory symbol) ERC20(name, symbol) { ... }:构造函数,在合约部署时调用,它接收代币名称和符号作为参数,并传递给父合约ERC20的构造函数。
  • _mint(msg.sender, 1000000 * 10**decimals());_mint是ERC20合约内部的一个函数,用于创建新的代币并分配到指定地址,这里我们向合约的创建者(msg.sender)发行1000000个代币,乘以10**decimals()是为了考虑小数位数,因为decimals()默认为18,所以实际发行的是1000000 * 10^18个最小单位(wei级别的代币)。

编译和部署合约

使用Remix IDE(推荐初学者):

  1. 打开浏览器,访问 Remix IDE随机配图