在区块链的世界里,以太坊无疑是智能合约和去中心化应用(DApp)的基石,而ERC20标准,作为以太坊上最通用的代币标准,使得创建自己的数字资产(俗称“发币”)变得前所未有的简单,无论你是想启动一个新项目、创建社区治理代币,还是仅仅出于技术学习的目的,掌握ERC20代币的编写都是一项必备技能。
本文将带你一步步了解以太坊发币的全过程,从核心概念到具体的代码编写,助你从零开始,创建出属于你自己的第一个代币。
核心概念:什么是ERC20?
在深入代码之前,我们必须先理解ERC20到底是什么,ERC20是以太坊请求评论(Ethereum Request for Comments)的第20号提案,它定义了一套标准接口,所有以太坊上的同质化代币都必须遵循这套标准。
ERC20就像一份“代币制造说明书”,它规定了你的代币必须具备哪些基本功能,这使得不同的钱包、交易所和DApp都能无缝识别和交互你的代币,而无需为每一种新代币都做专门的开发。
ERC20标准主要定义了以下关键功能:
-
代币基本信息:
name(): 代币的全称,"USD Coin"。symbol(): 代币的简称,通常2-3个字符,"USDC"。decimals(): 代币的小数位数,用于支持更精确的交易,以太坊中最小单位是Wei(1 ETH = 10^18 Wei),所以代币的小数位数通常是18。
-
代币核心功能:
totalSupply(): 返回代币的总供应量。balanceOf(address): 查询指定地址拥有的代币数量。transfer(address to, uint256 amount): 向指定地址转移代币。transferFrom(address from, address to, uint256 amount): 从一个地址向另一个地址转移代币(通常用于授权第三方花费)。approve(address spender, uint256 amount): 授权另一个地址可以花费你的代币。allowance(address owner, address spender): 查询一个地址被授权可以花费的代币数量。
-
事件通知:
Transfer: 在代币被转移时触发,方便钱包和交易所记录。Approval: 在授权被设置或修改时触发。
编写你的第一个ERC20代币:代码详解
我们将使用最流行、最安全的智能合约开发语言——Solidity,以及OpenZeppelin库来编写我们的代币,OpenZeppelin是一个提供经过审计和安全加固的标准化合约库的社区项目,极大地降低了开发安全风险。
步骤1:设置开发环境
- 安装Node.js和npm: 确保你的电脑上已安装Node.js和npm包管理器。
- 安装Hardhat: Hardhat是一个以太坊开发环境,可以帮助你编译、测试、部署和调试你的智能合约,在终端中运行:
mkdir my-erc20-token cd my-erc20-token npm init -y npm install --save-dev hardhat npx hardhat
按照提示选择 "Create a basic sample project"。
步骤2:安装OpenZeppelin库
在你的项目目录下,安装OpenZeppelin的合约库:
npm install @openzeppelin/contracts
步骤3:编写智能合约代码
在 contracts/ 目录下,创建一个名为 MyToken.sol 的新文件,然后粘贴以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
// 导入OpenZeppelin的ERC20合约
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/**MyToken
* @dev 一个简单的ERC20代币,继承自OpenZeppelin的ERC20合约。
* 这是一个演示合约,不应在生产环境中直接使用。
*/
contract MyToken is ERC20 {
/**
* @dev 构造函数。
* @param _name 代币的名称。
* @param _symbol 代币的符号。
*/
constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {
// 在部署时,将1,000,000个代币铸造给合约的创建者。
// _mint函数是ERC20合约提供的一个内部函数。
// 我们乘以10的18次方,因为我们设置了18位小数。
_mint(msg.sender, 1000000 * 10**decimals());
}
}
代码解析:
// SPDX-License-Identifier: MIT: 这是一个许可证标识符,表明你的代码遵循MIT许可证。pragma solidity ^0.8.20;: 指定编译器版本,使用0.8.20或更高版本。import "@openzeppelin/contracts/token/ERC20/ERC20.sol";: 导入OpenZeppelin提供的ERC20标准合约,我们不需要自己从头实现所有复杂逻辑,直接继承它即可。contract MyToken is ERC20;: 声明我们的MyToken合约,并继承自ERC20,这意味着MyToken自动获得了所有ERC20的标准功能。constructor(...) ERC20(...): 构造函数,只在合约部署时执行一次。ERC20(_name, _symbol): 这行代码调用了父类(ERC20)的构造函数,并传入了代币的名称和符号。_mint(msg.sender, 1000000 * 10**decimals());