以太坊ERC20代币合约代码详解,从原理到实战

博主:neragonerago 2026-09-16 22:46:19 3

什么是ERC20标准?

ERC20是以太坊上最流行的代币标准(Ethereum Request for Comments 20),它定义了一组智能合约必须实现的函数和事件接口,正是有了这个统一标准,各种钱包、交易所和DApp才能无缝支持成千上万种不同的代币,USDT(ERC20版)、USDC、LINK等知名代币都遵循这一标准。

ERC20标准接口

一个标准的ERC20代币合约必须实现以下六个核心函数和两个事件:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IERC20 {
    // 查询代币总供应量
    function totalSupply() external view returns (uint256);
    // 查询某个地址的代币余额
    function balanceOf(address account) external view returns (uint256);
    // 转账:从调用者账户转出代币
    function transfer(address to, uint256 amount) external returns (bool);
    // 查询授权额度
    function allowance(address owner, address spender) external view returns (uint256);
    // 授权:允许 spender 花费一定数量的代币
    function approve(address spender, uint256 amount) external returns (bool);
    // 授权转账:由被授权方执行转账
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    // 转账事件
    event Transfer(address indexed from, address indexed to, uint256 value);
    // 授权事件
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

完整的ERC20代币合约代码

下面是一个功能完整、可直接部署的ERC20代币合约:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract MyToken {
    // 代币基本信息(可选实现项)
    string public name = "My Token";      // 代币全名
    string public symbol = "MTK";         // 代币符号
    uint8 public decimals = 18;           // 小数位数(18为惯例)
    uint256 public totalSupply;           // 代币总供应量
    // 余额映射表:地址 => 余额
    mapping(address => uint256) public balanceOf;
    // 授权映射表:代币持有者 => (被授权者 => 授权额度)
    mapping(address => mapping(address => uint256)) public allowance;
    // 事件声明
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    // 构造函数:部署时铸造初始代币给部署者
    constructor(uint256 _initialSupply) {
        totalSupply = _initialSupply * 10 ** uint256(decimals);
        balanceOf[msg.sender] = totalSupply;
        emit Transfer(address(0), msg.sender, totalSupply);
    }
    // 转账函数
    function transfer(address _to, uint256 _value) public returns (bool) {
        require(balanceOf[msg.sender] >= _value, "Insufficient balance");
        require(_to != address(0), "Invalid recipient");
        balanceOf[msg.sender] -= _value;
        balanceOf[_to] += _value;
        emit Transfer(msg.sender, _to, _value);
        return true;
    }
    // 授权函数
    function approve(address _spender, uint256 _value) public returns (bool) {
        require(_spender != address(0), "Invalid spender");
        allowance[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }
    // 授权转账函数
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
        require(balanceOf[_from] >= _value, "Insufficient balance");
        require(allowance[_from][msg.sender] >= _value
The End

发布于:2026-09-16,除非注明,否则均为区块链社区- 欧亿APP下载原创文章,转载请注明出处。