从零开始,以太坊ERC20代币开发完整教程
作者:admin
分类:默认分类
阅读:15 W
评论:99+
以太坊作为全球领先的智能合约平台,其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)
ode> - 允许
_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 函数是一个可选的额外函数,允许所有者后续铸造更多代币。
编译合约
在项目根目录下打开终端,运行以下命令编译合约:
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