关键词:ERC20、以太坊代币、智能合约、Mint、Burn、decimals、totalSupply、DApp、defi
什么是 ERC20?
ERC20 全称为 Ethereum Request for Comment 20,是以太坊代币标准协议,用 Solidity 编写的智能合约必须遵循的一组接口规范。它统一了代币的转账、余额查询与授权等行为,使得所有ERC20 代币可以在钱包、交易所、DeFi 协议等不同DApp之间无缝互通。
ERC20 并不是唯一代币标准,但它是最主流的三种之一:
- ERC20—同质化代币(如 USDT、DAI)
- ERC721—非同质化代币 NFT(独特资产,Axie)
- ERC1155—多资产混合标准(一张合约管理多种 token)
ERC20 标准接口一览
合约只要实现以下 6 个方法和 2 个事件,就能被认定为合法 ERC20 代币:
1. totalSupply()
查询代币总发行量,无 gas 成本。
function totalSupply() external view returns (uint256);2. balanceOf(account)
查看任意地址余额。
function balanceOf(address account) external view returns (uint256);3. transfer(recipient, amount)
向目标地址直转代币。
function transfer(address recipient, uint256 amount) external returns (bool);4. allowance(owner, spender)
查询某地址被授予的“可代扣额度”。
function allowance(address owner, address spender) external view returns (uint256);5. approve(spender, amount)
授权某 spender 可以从你账户中代扣多少 token。
function approve(address spender, uint256 amount) external returns (bool);6. transferFrom(from, to, amount)
在授权额度内,由第三方代为转账。
function transferFrom(address from, address to, uint256 amount) external returns (bool);两个必须抛出的事件
Transfer(address indexed from, address indexed to, uint256 value)Approval(address indexed owner, address indexed spender, uint256 value)
代币元数据与精度
在实际项目里,开发者通常还会额外实现 ERC20Metadata 接口,让用户体验更友好:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IERC20Metadata {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
contract MyToken is IERC20Metadata {
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view returns (string memory) { return _name; }
function symbol() public view returns (string memory) { return _symbol; }
function decimals() public pure returns (uint8) { return 18; } // 最常见精度
}部署时,只需在构造函数填入名称和符号即可: MyToken("CoolCat","CAT")。
铸造(Mint)与销毁(Burn)实战
生产级代币往往通过 Mint(增发)与 Burn(烧毁)动态调整流通量。以下示例加入权限控制与总量变化逻辑:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;
interface IERC20Ext is IERC20 {
function mint(address to, uint256 amount) external;
function burn(address from, uint256 amount) external;
}
contract MyTokenExt is IERC20Ext {
uint256 private _totalSupply = 10000 * 1e18; // 初始1万枚
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
address private immutable _owner;
constructor() {
_balances[msg.sender] = _totalSupply;
_owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == _owner, unicode"权限不足");
_;
}
function totalSupply() external view override returns (uint256) { return _totalSupply; }
function balanceOf(address account) external view override returns (uint256) { return _balances[account]; }
// 其余 transfer/approve/transferFrom 省略……
function mint(address to, uint256 amount) external override onlyOwner {
require(to != address(0), unicode"零地址不可用");
_totalSupply += amount;
_balances[to] += amount;
emit Transfer(address(0), to, amount);
}
function burn(address from, uint256 amount) external override onlyOwner {
require(from != address(0), unicode"零地址不可用");
require(_balances[from] >= amount, unicode"余额不足");
_balances[from] -= amount;
_totalSupply -= amount;
emit Transfer(from, address(0), amount);
}
}操作流程示例(Remix IDE 模拟)
- 部署合约 → 查看
totalSupply为10000 - 在
mint填(合约地址, 10000)→totalSupply变20000 - 在
burn填(合约地址, 1000)→totalSupply变19000
常见问题 FAQ
Q1:为什么大多数代币小数位数是 18?
A:这是为了兼容以太坊本身的 10¹⁸ Wei 体系,18 位小数能让用户转账时按“整数”输入,避免金额成为极大或极小的值。
Q2:代币转了却不到账怎么办?
A:用区块浏览器复制 Tx Hash → 核对 Transfer 事件里的 to 地址 → 如果事件正确,而钱包未更新,通常是钱包节点延迟,可手动添加代币合约地址。
Q3:我可以直接修改 totalSupply 吗?
A:不能!totalSupply 仅能通过 mint 或 burn 公式级地同步增减,合约代码里绝不能写“_totalSupply = 任意数字”。否则即破坏标准,交易所无法上架。
Q4:Mint/Burn 是否安全?
A:只要 权限控制得当(例如 onlyOwner 或多签),并在外部审计报告覆盖,就与普通转账同样安全。
Q5:哪些工具可以让我不自己动手部署?
A:有在线一键发 token 平台,但多数基础功能隐藏了底层逻辑,更推荐 Remix 或 Foundry 本地部署 + 开源仓库,学习成本低且更透明。👉 零门槛体验代码热更新与链上模拟环境
结语
掌握 ERC20 的核心接口与两个事件,你就能发布属于自己的以太坊代币;加入 Mint/Burn 逻辑,还可实现动态通胀/通缩模型。想深耕智能合约,不妨从复现文中 Demo 开始,再结合 OpenZeppelin 进一步模块化与强化安全。祝编码顺利!