以太坊发币全攻略,从零开始编写你的第一个ERC20代币
在区块链的世界里,以太坊无疑是智能合约和去中心化应用(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());: 这是代币的“创世”逻辑。_mint是OpenZeppelin ERC20合约提供的内部函数,用于铸造新的代币。msg.sender是部署合约的地址,我们将代币分配给他。1000000 * 10**decimals()是铸造的数量,我们设定总供应量为100万个,乘以10**decimals()(即10^18)是为了考虑小数位,确保实际价值是100万,而不是100万 * 10^-18。
步骤4:编译和部署合约
-
配置部署脚本: 在
scripts/目录下,创建一个名为deploy.js的文件,内容如下:async function main() { // 获取合约工厂 const MyToken = await ethers.getContractFactory("MyToken"); // 部署合约,传入名称和符号 const myToken = await MyToken.deploy("My Awesome Token", "MAT"); // 等待部署完成 await myToken.deployed(); console.log("MyToken deployed to:", myToken.address); } main() .then(() => process.exit(0)) .catch((error) => { console.error(error); process.exit(1); }); -
部署到测试网:
-
你需要一个测试网钱包,例如从 faucet.sepoliafaucet.com 获取一些Sepolia测试网的ETH。
-
在你的终端中,安装
dotenv来管理私钥:npm install dotenv
-
在项目根目录创建一个
.env文件,填入你的私钥和Alchemy或Infura的RPC URL:PRIVATE_KEY=你的钱包私钥 SEPOLIA_RPC_URL=https://sepolia.infura.io/v3/你的项目ID -
修改
hardhat.config.js文件,添加网络配置:require("@nomicfoundation/hardhat-toolbox"); require("dotenv").config(); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { solidity: "0.8.20", networks: { sepolia: { url: process.env.SEPOLIA_RPC_URL, accounts: [process.env.PRIVATE_KEY], }, }, }; -
运行部署命令:
npx hardhat run scripts/deploy.js --network sepolia
-
部署成功后,终端会输出你的代币合约地址。请务必妥善保存这个地址!
部署后:如何与你的代币交互
你的代币已经存在于以太坊测试网上了,你可以通过以下方式与它交互:
- 使用Etherscan: 将你的合约地址粘贴到 Sepolia Etherscan 中,你可以查看合约的所有信息,包括名称、符号、总供应量,以及你的钱包地址是否收到了100万个代币。
- 使用MetaMask:
在
