以太坊作为全球领先的智能合约平台,其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 "@openzeppe
lin/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函数是一个可选的额外函数,允许所有者后续铸造更多代币。
-
编译合约
在项目根目录下打开终端,运行以下命令编译合约:
truffle compile
如果编译成功,您会在 build/contracts/ 目录下看到编译后的 JSON 文件,其中包含 ABI(应用程序二进制接口)和字节码等信息。
编写部署脚本
部署脚本用于告诉 Truffle 如何部署您的合约到区块链。
-
进入
migrations目录,创建一个新的部署脚本文件,2_deploy_contracts.js(数字前缀用于执行顺序)。 -
2_deploy_contracts.js示例代码:const MyToken = artifacts.require("MyToken"); module.exports = function (deployer) { // 部署合约时传入代币名称和符号 deployer.deploy(MyToken, "My Awesome Token", "MAT"); };代码解释:
artifacts.require("MyToken")告诉 Truffle 我们要部署的是MyToken.sol编译后的合约。deployer.deploy(MyToken, ...)执行部署,并传递构造函数所需的参数(代币名称和符号)。
部署合约到测试网络
在部署到真实的以太坊主网之前,我们通常会在本地测试网络或测试网(如 Ropsten, Goerli, Sepolia)上进行测试。
-
启动 Ganache(本地区块链):
- 打开 Ganache,选择 "QUICKSTART"。
- 记下其中一个账户的地址和私钥(用于后续测试和充币)。
-
配置 Truffle 连接 Ganache:
- 打开
truffle-config.js,在networks对象中添加 Ganache 的配置:module.exports = { // ... 其他配置 ... networks: { development: { host: "127.0.0.1", // Localhost (default: none) port: 7545, // Standard Ethereum port (default: none) network_id: "*", // Any network (default: none) }, // 如果要部署到测试网,需要添加相应配置,并配置 infura 等 }, // ... 其他配置 ... };
- 打开
-
部署合约: 在项目根目录终端运行:
truffle migrate --network development
如果一切顺利,Truffle 会将合约部署到 Ganache 的本地区块链,并显示合约地址,请务必记下这个合约地址!
测试您的代币
- 在 MetaMask 中添加代币:
- 打开 MetaMask,切换到 Ganache 提供的测试网络("Localhost 8545")。
- 点击顶部的资产,然后点击“添加代币”。
- 在“合约地址”字段中粘贴您部署的
MyToken合约地址。 - MetaMask 通常会自动填充代币符号和小数位数,点击“下一步”添加代币”。
- 您应该能看到 Meta