以太坊发币全攻略,从零开始编写你的第一个ERC20代币

投稿 2026-02-27 18:54 点击数: 1

在区块链的世界里,以太坊无疑是智能合约和去中心化应用(DApp)的基石,而ERC20标准,作为以太坊上最通用的代币标准,使得创建自己的数字资产(俗称“发币”)变得前所未有的简单,无论你是想启动一个新项目、创建社区治理代币,还是仅仅出于技术学习的目的,掌握ERC20代币的编写都是一项必备技能。

本文将带你一步步了解以太坊发币的全过程,从核心概念到具体的代码编写,助你从零开始,创建出属于你自己的第一个代币。

核心概念:什么是ERC20?

在深入代码之前,我们必须先理解ERC20到底是什么,ERC20是以太坊请求评论(Ethereum Request for Comments)的第20号提案,它定义了一套标准接口,所有以太坊上的同质化代币都必须遵循这套标准。

ERC20就像一份“代币制造说明书”,它规定了你的代币必须具备哪些基本功能,这使得不同的钱包、交易所和DApp都能无缝识别和交互你的代币,而无需为每一种新代币都做专门的开发。

ERC20标准主要定义了以下关键功能:

  1. 代币基本信息:

    • name(): 代币的全称,"USD Coin"。
    • symbol(): 代币的简称,通常2-3个字符,"USDC"。
    • decimals(): 代币的小数位数,用于支持更精确的交易,以太坊中最小单位是Wei(1 ETH = 10^18 Wei),所以代币的小数位数通常是18。
  2. 代币核心功能:

    • 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): 查询一个地址被授权可以花费的代币数量。
  3. 事件通知:

    • Transfer: 在代币被转移时触发,方便钱包和交易所记录。
    • Approval: 在授权被设置或修改时触发。

编写你的第一个ERC20代币:代码详解

我们将使用最流行、最安全的智能合约开发语言——Solidity,以及OpenZeppelin库来编写我们的代币,OpenZeppelin是一个提供经过审计和安全加固的标准化合约库的社区项目,极大地降低了开发安全风险。

步骤1:设置开发环境

  1. 安装Node.js和npm: 确保你的电脑上已安装Node.js和npm包管理器。
  2. 安装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合约。
 * 这是一个演示合约,不应在生产环境中直接使用。
 */
c
随机配图
ontract 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:编译和部署合约

  1. 配置部署脚本: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);
      });
  2. 部署到测试网:

    • 你需要一个测试网钱包,例如从 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

部署成功后,终端会输出你的代币合约地址。请务必妥善保存这个地址!

部署后:如何与你的代币交互

你的代币已经存在于以太坊测试网上了,你可以通过以下方式与它交互:

  1. 使用Etherscan: 将你的合约地址粘贴到 Sepolia Etherscan 中,你可以查看合约的所有信息,包括名称、符号、总供应量,以及你的钱包地址是否收到了100万个代币。
  2. 使用MetaMask: