以太坊作为全球领先的智能合约平台,其ERC20代币标准已成为发行可替代代币(如功能型代币、稳定币、社区币等)的黄金标准,无论是对于初学者还是有一定经验的开发者,掌握ERC20代币的开发都是进入区块链领域的重要一步,本文将为您提供一份详尽的、从零开始的以太坊ERC20代币开发教程,助您快速上手。
什么是ERC20?
ERC20(Ethereum Request for Comments 20)是一个技术标准,用于在以太坊区块链上实现代币,它定义了一套规则和接口,确保所有ERC20代币都具有一致的行为方式,从而使得钱包、交易所和其他DApp能够轻松地与它们交互。
ERC20标准要求代币合约实现以下基本功能(通过函数):
- 总供应量 (Total Supply):
totalSupply()- 返回代币的总供应量。 - 账户余额 (Balance Of):
balanceOf(address _owner)- 返回指定地址的代币余额。 - 转移 (Transfer):
transfer(address _to, uint256 _value)- 将指定数量的代币从调用者地址转移到指定地址。 - 从 approve 到 transferFrom (Allowance):
allowance(address _owner, address _spender)- 返回_spender被允许从_owner支出的代币数量。 - 批准 (Approve):
approve(address _spender, uint256 _value)- 允许_spender从调用者地址最多支出_value数量的代币。 - 从授权地址转移 (Transfer From):
transferFrom(address _from, address _to, uint256 _value)- 从_from地址转移_value数量的代币到_to地址,前提是调用者已被_from授权。
还包括两个可选的事件:
Transfer(address indexed from, address indexed to, uint256 value)- 在代币转移时触发。Approval(address indexed owner, address indexed spender, uint256 value)- 在批准授权时触发。
开发环境准备
在开始编写代码之前,您需要准备以下开发环境:
- Node.js 和 npm/yarn:JavaScript 运行时环境和包管理器,建议安装 LTS 版本。
- Truffle Suite:一套流行的以太坊开发框架,包含 Truffle(开发环境、测试框架、编译器)、Ganache(个人区块链)和 Drizzle(前端库)。
- 安装:
npm install -g truffle
- 安装:
- MetaMask:一款浏览器插件钱包,用于与以太坊区块链交互、管理账户和测试代币。
- 代码编辑器:如 VS Code,并安装 Solidity 插件以获得语法高亮和智能提示。
- Solidity 编译器:Truffle 通常会自动管理,但确保安装了合适版本(0.8.x 或 0.5.x,根据您的需求选择)。
创建新项目
-
创建一个新的项目文件夹:
mkdir MyERC20Token cd MyERC20Token
-
初始化 Truffle 项目:
truffle init
这将创建以下目录结构:
contracts/:存放 Solidity 智能合约文件。migrations/:部署脚本文件。test/:测试文件。truffle-config.js:Truffle 配置文件。
编写 ERC20 代币合约
-
进入
contracts目录,删除Migrations.sol(如果不需要),然后创建一个新的代币合约文件,MyToken.sol。 -
打开
MyToken.sol,编写您的 ERC20 代币合约,我们可以继承 OpenZeppelin 提供的经过审计的 ERC20 合约,这样可以确保安全性和符合标准,避免重复造轮子。-
首先安装 OpenZeppelin Contracts:
npm install @openzeppelin/contracts
-
MyToken.sol示例代码:// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract MyToken is ERC20, Ownable { constructor(string memory name, string memory symbol) ERC20(name, symbol) { // 在部署时向合约所有者(部署者)发行 1,000,000 个代币 _mint(msg.sender, 1000000 * 10**decimals()); } // 可选:添加一个铸币函数(仅所有者可调用) function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } }代码解释:
SPDX-License-Identifier和pragma solidity是标准声明。- 导入
ERC20和Ownable(用于所有权管理,可选但推荐)。 contract MyToken is ERC20, Ownable表示我们的合约继承自 ERC20 和 Ownable。constructor是构造函数,在合约部署时执行一次,我们在这里代币名称(name)和符号(symbol),并使用_mint函数向部署者地址发行初始供应量,注意10**decimals()是因为 ERC20 标准通常使用 18 位小数,所以我们要将数量转换为正确的精度。mint函数是一个可选的额外函数,允许所有者后续铸造更多代币。
-









