从零开始创建并部署 ERC20 代币:五分钟掌握五大核心步骤

·

ERC20 代币标准自 2015 年诞生以来,彻底改变了区块链世界。它简单、统一、易于集成,迅速成为众筹、DeFi 及数字证券的主流选择。下文将把官方教程拆解为 五个真正能落地的动作,帮你快速完成 以太坊代币开发 并一路避开暗礁。


1️⃣ 起步:三分钟搭好开发者环境

工具清单

免费拿测试 ETH

打开任何一个 Goerli 水龙头(如 https://goerlifaucet.com),粘贴钱包地址点击“Send”,几秒后就能获得 0.2 goerliETH,足够覆盖整条测试链路。


2️⃣ 写合约:一份能直接上线的最简模板

在 Remix 新建文件 MyToken.sol,复制下方合约,记得修改参数

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address) external view returns (uint256);
    function transfer(address, uint256) external returns (bool);
    function allowance(address,address) external view returns (uint256);
    function approve(address, uint256) external returns (bool);
    function transferFrom(address,address,uint256) external returns (bool);
    event Transfer(address indexed, address indexed, uint256);
    event Approval(address indexed, address indexed, uint256);
}

contract MyToken is IERC20 {
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;

    string public name     = "YourToken";
    string public symbol   = "YTK";
    uint8  public decimals = 18;
    uint256 public totalSupply = 1_000_000 * 10**decimals;

    constructor() {
        _balances[msg.sender] = totalSupply;
        emit Transfer(address(0), msg.sender, totalSupply);
    }

    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    function transfer(address to, uint256 amount) public returns (bool) {
        require(_balances[msg.sender] >= amount, "balance low");
        _balances[msg.sender] -= amount;
        _balances[to] += amount;
        emit Transfer(msg.sender, to, amount);
        return true;
    }

    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) public returns (bool) {
        uint256 currentAllowance = _allowances[from][msg.sender];
        require(currentAllowance >= amount, "allowance low");
        require(_balances[from] >= amount, "balance low");
        _balances[from] -= amount;
        _balances[to] += amount;
        _allowances[from][msg.sender] -= amount;
        emit Transfer(from, to, amount);
        return true;
    }
}

写完后,可到 👉 用低费率平台测试你的合约安全,先别急着部署主网,提前模拟交易与授权场景,发现漏洞比上线后修补更划算。


3️⃣ 部署:先测试网,后主网

  1. 将 MetaMask 网络切到 Goerli
  2. 在 Remix ENVIRONMENT 选择 “Injected Provider”。
  3. 点击 Deploy & Run,弹窗确认。
  4. 部署成功立刻记下 合约地址,点击 Etherscan 验证。

4️⃣ 测试 & 安全:务必过这三道闸

常见漏洞速查

  1. 重入攻击 → 使用 Checks-Effects-Interactions
  2. 整数溢出 → Solidity 0.8 已内置,仍建议用 OpenZeppelin 的 SafeMath(回退兼容)。
  3. 权限控制 → 加 onlyOwner 或 OpenZeppelin AccessControl

5️⃣ 上线:主网部署 + 市场启动

主网部署

重复第 3 步,仅把网络切换为 Ethereum Mainnet,提前在多时段估计 gas 费,使用 https://www.okx.com/join/8265080 实时 gas 跟踪功能 300 gwei 以下再发交易。

代币分配模型示例

上线必备后招


费用盘点:一个严肃的现实账本

环节典型成本(美元)
合约开发 & 审计2,000 – 8,000
前端/APP2,000 – 6,000
主网 gas 费200 – 1,500 (动态)
市场推广3,000 – 10,000
法律顾问3,000 – 12,000
整体预估10,000 – 40,000

常见疑问 QA

Q1:ERC20 和 BSC 的 BEP20 差异大吗?
A:接口相同,代码只需改链参数即可重新部署,交易成本更低,但机构认可度略低。

Q2:可以直接从 Solidity 共用 public/external 减少 gas 吗?
A:少用 public 可调用的 view 指令;多用来减少存储 memory,不仅省 gas,同时降低攻击面。

Q3:发行完代币后还能改总量吗?
A:除非预留 mint / burn 函数且保留 onlyOwner,否则成币后无法增发。


结语:下一步动作清单

  1. 把代码 + 文档推上 GitHub。
  2. 预约审计 → 完成主网部署 → 建池子 → 做市。
  3. 用区块浏览器实时追踪持币者数量与转账热度。
  4. 在社交平台宣布空投规则,吸引首批种子用户

带上本指南,你的 ERC20 代币 就跳出了“技术演示”,真正进入市场流通的循环。祝你一路无坑,早日冲上排行榜!