以太坊ERC20代币合约代码详解,从原理到实战
什么是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,除非注明,否则均为原创文章,转载请注明出处。
