以太坊作为全球领先的智能合约平台,其上的ERC20代币标准成为了发行可替代代币(如稳定币、功能型代币等)的黄金标准,无论是初学者还是有一定经验的开发者,掌握ERC20代币的开发都是进入区块链领域的重要一步,本文将带你从零开始,一步步完成一个ERC20代币的开发、测试和部署。
什么是ERC20代币
ERC20(Ethereum Request for Comments 20)是一个以太坊代币的技术标准,它定义了一套接口(Interface),使得所有符合该标准的代币都能在以太坊生态中统一交互,就像比特币在每个钱包中都能以相同的方式显示和交易一样,ERC20代币也可以在任何支持ERC20标准的钱包、交易所和DApp中使用。
ERC20标准要求代币合约必须实现以下基本函数(至少):
name(): 返回代币的完整名称,如 "MyToken"。symbol(): 返回代币的简称,通常2-3个字符,如 "MTK"。decimals(): 返回代币的小数位数,用于分割代币,如18位表示可以分割到1e-18。totalSupply(): 返回代币的总供应量。balanceOf(address _owner): 返回指定地址的代币余额。transfer(address _to, uint256 _value): 向指定地址转移代币。transferFrom(address _from, address _to, uint256 _value): 从指定地址转移代币(通常需要授权)。approve(address _spender, uint256 _value): 授权某个地址可以花费你的代币。allowance(address _owner, address _spender): 返回某个地址被授权花费的代币数量。
开发环境准备
在开始编写代码之前,我们需要准备以下工具和环境:
-
Node.js 和 npm/yarn: JavaScript运行时环境,用于运行Solidity编译器和测试框架。
- 下载地址:https://nodejs.org/
- 安装完成后,打开终端,输入
node -v和npm -v检查是否安装成功。
-
Truffle Suite: 一套流行的以太坊开发框架,包含合约编译、测试、部署等功能。
- 安装:
npm install -g truffle
- 安装:
-
Ganache: 个人区块链,可以快速创建本地私有链,用于开发和测试,它会提供一系列测试账户和初始以太坊。
- 下载地址:https://trufflesuite.com/ganache/ (选择桌面版或命令行版)
-
MetaMask: 浏览器钱包插件,用于与以太坊网络(包括本地测试网络和主网)交互,管理私钥,发送交易,测试代币转账等。
- 下载地址:https://metamask.io/ (Chrome, Firefox等浏览器插件)
-
VS Code: 强大的代码编辑器,推荐安装Solidity插件(如Hardhat Solidity IDE, Solidity by Juan Blanco)以获得更好的语法高亮和代码提示。
创建项目并编写ERC20合约
-
创建项目目录
mkdir MyERC20Token cd MyERC20Token
-
初始化Truffle项目
truffle init
执行后,Truffle会创建以下目录和文件:
contracts/: 存放Solidity智能合约文件。migrations/: 存放部署脚本文件。test/: 存放测试文件。truffle-config.js: Truffle配置文件。
-
编写ERC20合约 打开
contracts/目录,删除Migrations.sol(如果不需要),然后创建一个新的合约文件,MyToken.sol。我们可以直接继承OpenZeppelin的ERC20合约,这比从头实现更安全、更可靠,首先需要安装OpenZeppelin合约库:
npm install @openzeppelin/contracts
然后在
MyToken.sol中编写以下代码:// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import
"@openzeppelin/contracts/token/ERC20/ERC20.sol"; contract MyToken is ERC20 { constructor(string memory name, string memory symbol) ERC20(name, symbol) { // 在部署时,将1000个代币(根据decimals调整)发送给部署者 _mint(msg.sender, 1000 * 10**decimals()); } }
代码解释:
SPDX-License-Identifier: 指定许可证标识。pragma solidity ^0.8.0;指定Solidity编译器版本。import "@openzeppelin/contracts/token/ERC20/ERC20.sol";导入OpenZeppelin的ERC20标准实现。contract MyToken is ERC20;声明我们的合约继承自ERC20。constructor(string memory name, string memory symbol) ERC20(name, symbol) {...}构造函数,在合约部署时调用,用于设置代币名称和简称,并调用父合约ERC20的构造函数。_mint(msg.sender, 1000 * 10**decimals());_mint是ERC20合约内部的一个函数,用于铸造代币,这里我们铸造1000个代币给合约部署者(msg.sender),乘以10**decimals()是因为ERC20的decimals()默认是18,所以实际铸造的是1000 * 10^18个最小单位。
编译合约
在项目根目录的终端中,运行以下命令编译合约:
truffle compile
如果成功,会在 build/contracts/ 目录下生成编译后的JSON文件,其中包含合约的ABI(应用程序二进制接口)和字节码。
部署合约到本地测试链(Ganache)
-
启动Ganache 打开Ganache桌面应用,点击 "QUICKSTART" 按钮,它会启动一个本地区块链,并提供10个测试账户,每个账户有100个ETH(默认),记下其中一个账户的RPC Server地址(如
HTTP://127.0.0.1:7545)和私钥(用于后续测试)。 -
配置Truffle连接Ganache 打开
truffle-config.js文件,添加以下配置(如果还没有的话):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) }, }, compilers: { solc: { version: "0.8.0", // 指定Solidity编译器版本,与合约中一致 } } };注意:
port要与Ganache中显示的端口一致,network_id通常可以设置为 或5777(Ganache默认网络ID)。 -
创建部署脚本 打开
migrations/目录,创建一个新的部署脚本文件,2_deploy_contracts.js:const MyToken = artifacts.require("MyToken"); module.exports = function (deployer) { deployer.deploy(MyToken, "My Awesome Token", "MAT"); };代码解释:
artifacts.require("MyToken")获取编译好的合约对象。deployer.deploy(MyToken, "My Awesome Token", "MAT")部署合约,并传入构造函数所需的参数(代币名称和简称)。
-
执行部署 在项目根目录终端中,运行以下命令:
truffle migrate --network development
如果成功,你会看到部署过程,以及合约部署后的地址,记下这个地址,后续会用到。
测试代币功能
- 配置MetaMask连接本地测试链
- 打开MetaMask插件,点击网络下拉菜单,选择 "添加网络"。
- 选择 "添加网络 manually"。
- 网络名称:填写 "Ganache Local" 或自定义。
- RPC URL:填写Ganache中显示的RPC Server地址(如
HTTP://127.0.0.1:7545)。