大家好,今天我们来聊一聊如何基于以太坊区块链发布自己的代币,随着区块链技术的火热,代币(Token)作为区块链世界的重要资产载体,其应用场景日益广泛,无论是初学者想体验一下发币流程,还是项目方需要发行功能性代币,掌握基于以太坊发币都是一项非常有价值的技能,本文将以最流行的ERC20代币标准为例,带大家一步步了解并实践如何发布自己的以太坊代币。
什么是代币?什么是以太坊?什么是ERC20
在开始之前,我们先简单理解几个核心概念:
- 代币(Token):在区块链领域,代币通常是基于现有区块链平台(如以太坊)发行的数字资产,它本身可能是一个独立的区块链(如比特币),但更多时候是指遵循特定标准、在已有区块链上运行的“智能合约代币”。
- 以太坊(Ethereum):以太坊不仅仅是一种加密货币(ETH),更是一个开源的、有智能合约功能的去中心化区块链平台,它允许开发者构建和部署去中心化应用(DApps),而代币正是这些DApps中不可或缺的一部分。
- ERC20:这是以太坊上代币的技术标准,全称为“Ethereum Request for Comments 20”(以太坊意见征求稿20),它定义了一套代币应遵循的接口和规则,包括名称、符号、总供应量、转账额度、余额查询等基本功能,遵循ERC20标准的代币可以确保与以太坊钱包、交易所等生态系统兼容,方便流通和使用。
发布以太坊代币前的准备工作
在动手写代码之前,我们需要准备以下工具和环境:
- 以太坊钱包:用于管理你的账户(私钥、公钥)、发送交易和存储代币,推荐使用MetaMask,它是一款浏览器插件钱包,支持以太坊主网和各种测试网,使用广泛且方便。
- 测试网ETH:为了避免在以太坊主网上浪费真实的ETH(用于支付 Gas 费),我们通常会先在测试网上进行开发和测试,你需要从测试网水龙头(Faucet)获取免费的测试网ETH,常见的测试网有Ropsten、Kovan、Goerli等(注意:部分测试网可能已弃用,建议使用Goerli或Sepolia)。
- 开发环境:
- Node.js 和 npm/yarn:Node.js 是一个 JavaScript 运行时环境,npm 是其包管理器,我们需要它们来安装和管理 Solidity 编译器(solc)和 Truffle 框架等。
- 代码编辑器:如 VS Code,推荐安装 Solidity 插件以获得更好的语法高亮和智能提示。
- Truffle Framework:一个流行的以太坊开发框架,用于智能合约的编译、测试、部署和管理。
- Solidity:以太坊智能合约的编程语言。
安装步骤:
- 安装 Node.js:从 Node.js 官网 下载并安装。
- 安装 MetaMask:从 MetaMask 官网 安装浏览器插件,并创建/导入钱包。
- 安装 Truffle:在终端运行
npm install -g truffle。 - 安装 Solidity 编译器:Truffle 通常会自带,但也可以单独更新
solc。
使用 Truffle 框架创建 ERC20 代币
Truffle 框架大大简化了智能合约的开发和部署流程,下面我们用它来创建一个简单的 ERC20 代币。
创建一个新的 Truffle 项目
在终端中执行以下命令:
mkdir my-erc20-token cd my-erc20-token truffle init
这会创建一个基本的 Truffle 项目结构,包括 contracts/(存放智能合约)、migrations/(部署脚本)、test/(测试文件)等目录。
编写 ERC20 代币智能合约
Truffle 提供了一个 OpenZeppelin 的 ERC20 合约模板,OpenZeppelin 是一个致力于开发安全、社区审查的智能合约标准库的团队,他们的合约被广泛使用和信任。
安装 OpenZeppelin Contracts:
npm install @openzeppelin/contracts
在 contracts/ 目录下创建一个新的 Solidity 文件,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) {
_mint(msg.sender, 1000 * 10**decimals()); // 初始发行1000个代币,考虑小数位
}
}
代码解释:
SPDX-License-Identifier: MIT:许可证标识符。pragma solidity ^0.8.0;:指定 Solidity 编译器版本,0.8.0 或更高。import "@openzeppelin/contracts/token/ERC20/ERC20.sol";:导入 OpenZeppelin 的 ERC20 标准合约。contract MyToken is ERC20 { ... }:定义我们的代币合约MyToken,继承自ERC20。constructor(string memory name, string memory symbol) ERC20(name, symbol) { ... }:构造函数,在合约部署时执行,它接收代币名称(name)和符号(symbol),并传递给父类 ERC20 的构造函数。_mint(msg.sender, 1000 * 10**decimals());:_mint是 ERC20 合约内部用于铸造代币的函数,这里我们向合约部署者(msg.sender)铸造 1000 个代币。decimals()返回代币的小数位数(ERC20 默认为 18),10**decimals()是为了将 1000 转换为最小单位(如果小数位是18,则实际铸造的是 1000 * 10^18 个最小单位)。
编写迁移(部署)脚本
在 migrations/ 目录下创建一个新的迁移脚本,文件名格式为 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合约。module.exports = function (deployer) { ... };:导出一个部署函数。deployer.deploy(MyToken, "My Awesome Token", "MAT");:部署MyToken合约,并传入构造函数所需的参数:代币名称 "My Awesome Token" 和符号 "MAT"。
配置 Truffle 网络
打开 truffle-config.js(或 truffle.js)文件,配置我们要连接的测试网,以 Goerli 测试网为例(你需要确

require('dotenv').config(); // 引入 dotenv 包,用于管理环境变量
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)
},
goerli: {
provider: () => new HDWalletProvider(process.env.MNEMONIC, `https://goerli.infura.io/v3/${process.env.INFURA_PROJECT_ID}`),
network_id: 5, // Goerli's id
gas: 5000000, // Gas limit used for each block
confirmations: 2, // # of confs to wait between deployments
timeoutBlocks: 200, // # of blocks before a deployment times out (minimum/default: 50)
skipDryRun: true // Skip dry run before migrations? (default: false for public nets)
}
},
compilers: {
solc: {
version: "0.8.0", // Fetch exact version from solc-bin (default: truffle's version)
settings: { // See the solidity docs for advice about optimization and evmVersion
optimizer: {
enabled: true,
runs: 200
},
}
}
},
// dotenv 配置
plugins: [
'truffle-plugin-verify'
]
};
// HDWalletProvider requires holding Mnemonic words, so it better to use .env