在区块链世界中,代币(Token)是以太坊生态最基础也最强大的应用之一,无论是社区治理、项目融资,还是数字资产流转,ERC20标准的代币都扮演着核心角色,本文将带你从零开始,手把手教你编写一个以太坊发币代码,并完成部署与测试的全流程。
什么是ERC20代币?为什么选择它
ERC20是以太坊上最代币标准之一,由以太坊社区在2015年提出,它定义了一套统一的接口规范,包括转账(transfer)、转账From(transferFrom)、余额查询(balanceOf)、 allowance(授权)等核心功能,所有遵循ERC20标准的代币都能兼容以太坊钱包(如MetaMask)、交易所、去中心化应用(DApp)等基础设施,实现无缝流通。
ERC20就像“代币界的USB接口”——只要你的代币符合这个标准,就能插进以太坊的“生态插座”里使用,这也是绝大多数新项目选择发行ERC20代币的原因。
发币前的准备工作:工具与环境
在写代码之前,你需要准备好以下工具和环境:
开发环境
- Node.js和npm:用于运行Solidity编译器和部署脚本(建议安装Node.js 16+版本)。
- Solidity编译器(solc):将Solidity代码编译成以太坊虚拟机(EVM)可执行的字节码。
- 以太坊钱包:MetaMask(浏览器插件),用于管理账户和私钥,与测试网交互。
测试网络
为了避免消耗真实的以太币(ETH),建议在测试网(如Goerli、Sepolia)上部署,测试网ETH可以通过“水龙头”(Faucet)免费获取,
- Goerli测试网水龙头:https://goerlifaucet.com/
- Sepolia测试网水龙头:https://sepoliafaucet.com/
开发框架(可选)
虽然可以直接写Solidity代码,但使用Hardhat或Truffle等框架能大幅简化开发流程(包括编译、测试、部署等),本文以Hardhat为例,因为它对新手更友好,且文档完善。
编写ERC20代币代码:从零到一
ERC20代币的核心逻辑其实很简单:记录每个地址的代币余额,实现转账功能,并支持授权(允许其他地址转移你的代币),下面是一个完整的ERC20代币合约代码,我们一步步拆解。
安装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”,然后安装依赖(@nomicfoundation/hardhat-toolbox等)。
编写Solidity合约
在contracts目录下创建MyToken.sol文件,粘贴以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract MyToken is ERC20 {
constructor(string memory name, string memory symbol) ERC20(name, symbol) {
_mint(msg.sender, 1000000 * 10**18); // 初始发行100万个代币,18位小数
}
}
代码解析:
SPDX-License-Identifier: MIT:声明许可证类型(MIT是开源常用许可证)。pragma solidity ^0.8.20:指定Solidity编译器版本(0.8.20及以上,0.9以下)。import "@openzeppelin/contracts/token/ERC20/ERC20.sol":导入OpenZeppelin的ERC20标准合约,OpenZeppelin是经过审计的合约库,能避免安全漏洞,强烈推荐使用。contract MyToken is ERC20:声明合约继承自ERC20,自动实现所有标准接口。constructor:构造函数,在合约部署时执行。string memory name, string memory symbol:代币名称(如“My Token”)和符号(如“MTK”)。_mint(msg.sender, 1000000 * 10**18):向部署者地址 mint(发行)100万个代币。10**18是ERC20标准的小数位数(相当于1代币=10^18个最小单位,类似以太坊的wei)。
编译合约
在项目根目录运行:
npx hardhat compile
编译成功后,合约字节码会生成在artifacts/contracts/MyToken.sol/MyToken.json中。
部署合约到测试网
配置Hardhat网络
在hardhat.config.js中添加测试网配置(以Goerli为例):
require("@nomicfoundation/hardhat-toolbox");
/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
solidity: "0.8.20",
networks: {
goerli: {
url: "https://goerli.infura.io/v3/YOUR_INFURA_PROJECT_ID", // 替换为你的Infura项目ID
accounts: ["
YOUR_PRIVATE_KEY"] // 替换为你的测试网私钥(以0x开头)
}
}
};
- 获取
Infura项目ID:访问Infura官网,注册并创建新项目,选择“Web3 API”,复制HTTPS URL中的ID。 - 获取
私钥:在MetaMask中点击账户→“导出私钥”(注意:私钥等同于密码,切勿泄露给他人!仅在测试网使用)。
编写部署脚本
在scripts目录下创建deploy.js:
async function main() {
const MyToken = await ethers.getContractFactory("MyToken");
const myToken = await MyToken.deploy("My Token", "MTK");
await myToken.deployed();
console.log("MyToken deployed to:", myToken.address);
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});
部署合约
确保你的MetaMask已切换到Goerli测试网,且账户中有测试网ETH,运行:
npx hardhat run scripts/deploy.js --network goerli
部署成功后,你会看到类似输出:
MyToken deployed to: 0x1234567890123456789012345678901234567890
这个0x...就是你的代币合约地址!
验证代币与测试功能
验证合约(可选)
为了增加可信度,可以将合约代码上传到区块链浏览器(如Etherscan)进行验证,在Goerli Etherscan中,找到你的合约地址,点击“Verify and Publish”,选择“Solidity (Single File)”,输入合约代码和版本信息即可。
测试代币功能
- 查看余额:在Etherscan的合约页面,点击“Contract”→“Read Contract”,输入你的MetaMask地址,点击“balanceOf”即可查看代币余额(初始应为1000000个)。
- 转账测试:点击“Write Contract”→“transfer”,输入接收地址和转账数量(如100),点击“transact”,MetaMask会弹出签名窗口,确认后即可完成转账。
注意事项与最佳实践
-
安全第一:
- 始终使用OpenZeppelin等经过审计的合约库,避免自己实现核心逻辑(如转账、授权)。
- 私钥绝不泄露,测试网私钥也建议使用新创建的账户,与主网隔离。
-
代币参数设计:
- 名称和符号:简洁明了,避免侵权(如“Bitcoin”“Ethereum”等敏感词可能被平台屏蔽)。
- 小数位数:ERC20标准建议18位(与以太坊一致),但可根据需求调整(如稳定币常用18位,部分代币用6位)。
- 初始发行量:根据项目需求设定,避免过度通胀或稀缺。
-
合规性:
如果计划发行真实代币,需遵守当地法律法规(如反洗钱、KYC等),避免用于非法活动。
通过以上步骤,你已经成功编写、部署并测试了一个ERC20代币!从代码编写到部署上链,整个过程大约需要30分钟(取决于网络速度),ERC20代币是进入区块链开发的“敲门砖”,掌握它后,你还可以尝试发行NFT