WTF-Solidity 第 31 课:ERC20 代币标准从接口到实现,在 Remix 发行你自己的代币 📅 发布时间:2026/9/15 10:01:11 👁 浏览次数: WTF-Solidity 第 31 课ERC20 代币标准从接口到实现在 Remix 发行你自己的代币【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-SolidityERC20 是以太坊上最基础、最通用的代币标准理解它是学习 DeFi、NFT 与各类链上应用的必修课。本文以 WTF-Solidity 仓库的 31_ERC20 模块为核心从IERC20接口定义讲起逐步带你用 Solidity 实现一个可运行的 ERC20 合约并在 Remix 中实际部署、铸造和查询你自己的WTF测试代币完整走通「标准 → 实现 → 发行」的全过程。ERC20 是什么ERC20是以太坊上的代币标准由 VFabian Vogelsteller于 2015 年 11 月提出基于EIP20提案。它规定了链上代币必须具备的最基本逻辑统一了代币的对外接口让钱包、交易所、DApp 可以用同一套函数去操作任何符合该标准的代币。一个标准的 ERC20 代币需要实现以下能力账户余额balanceOf查询某个地址持有多少代币转账transfer把自己的代币转给他人授权转账approve/transferFrom允许第三方账户或合约在授权额度内代替你转账代币总供应量totalSupply当前发行的代币总量代币信息可选名称name、符号symbol、小数位数decimals。ERC20 的出现大幅降低了在以太坊上发行代币的门槛并由此开启了 ICO 的繁荣时代。IERC20标准接口的定义IERC20是 ERC20 标准的接口合约它只规定「需要实现哪些函数和事件」以及它们的签名函数名、参数、返回值而不关心内部实现细节。为什么要单独定义一个接口因为有了统一的标准所有 ERC20 代币共享相同的函数名、输入参数和输出结构。无论是做 DEX 交易、空投还是质押合约都可以通过接口与任何 ERC20 代币交互而无需关心它是怎么实现的。这就是为什么本模块需要IERC20.sol接口和ERC20.sol实现两个文件接口与实现分离通过共同约定的数据结构对接。仓库中对应的接口文件是 Languages/pt-br/31_ERC20/IERC20.sol完整代码如下。事件EventsIERC20定义了两个事件分别在转账和授权时触发方便链上索引与前端监听/** * dev 当 value 单位的代币从账户from转移到另一账户to时触发。 */ event Transfer(address indexed from, address indexed to, uint256 value); /** * dev 当 value 单位的代币被账户所有者owner授权给另一账户spender时触发。 */ event Approval(address indexed owner, address indexed spender, uint256 value);注意indexed关键字from、to、owner、spender被标记为索引参数便于按地址过滤和检索历史事件。函数FunctionsIERC20定义了六个函数覆盖代币的基本转账功能并允许链上的第三方合约使用经授权的代币totalSupply()返回代币总供应量/** * dev 返回代币的总供应量。 */ function totalSupply() external view returns (uint256);balanceOf()返回指定账户的余额/** * dev 返回账户 account 持有的代币数量。 */ function balanceOf(address account) external view returns (uint256);transfer()转账/** * dev 将 amount 单位的代币从调用者账户转移到账户 to。 * * 成功后返回 true。 * * 触发 {Transfer} 事件。 */ function transfer(address to, uint256 amount) external returns (bool);allowance()查询授权额度/** * dev 返回账户所有者 owner 授权给 spender 使用的代币数量默认为 0。 * * 当调用 {approve} 或 {transferFrom} 时会改变。 */ function allowance(address owner, address spender) external view returns (uint256);approve()授权/** * dev 账户所有者授权 spender 使用 amount 数量的代币。 * * 成功后返回 true。 * * 触发 {Approval} 事件。 */ function approve(address spender, uint256 amount) external returns (bool);transferFrom()授权转账/** * dev 通过授权机制将 amount 单位的代币从账户 from 转移到账户 to。转账数量会从调用者的授权额度中扣除。 * * 成功后返回 true。 * * 触发 {Transfer} 事件。 */ function transferFrom( address from, address to, uint256 amount ) external returns (bool);其中transfer与transferFrom的区别在于前者是「本人转出自己的代币」后者是「代替他人转出代币」但前提是发起人已经通过approve获得了足够的授权额度。实现 ERC20 合约接下来我们根据IERC20的定义用最精简的方式实现一个ERC20合约。对应源码位于 Languages/pt-br/31_ERC20/ERC20.sol合约声明为contract ERC20 is IERC20并import ./IERC20.sol。状态变量我们用状态变量记录账户余额、授权额度与代币信息mapping(address uint256) public override balanceOf; mapping(address mapping(address uint256)) public override allowance; uint256 public override totalSupply; // 代币总供应量 string public name; // 代币名称 string public symbol; // 代币符号 uint8 public decimals 18; // 小数位数这里有一个 Solidity 的巧妙设计balanceOf、allowance和totalSupply声明为public时编译器会自动生成同名getter函数天然实现了IERC20中对应的三个view函数无需手写。重要因为父接口IERC20已经定义了同名函数子合约必须使用override关键字重写这些自动生成的getter否则编译会报错——这正是balanceOf等状态变量带override的原因。name、symbol对应代币的名称与符号如WTFdecimals表示代币的小数位数默认设为18即 1 个代币由10^18个最小单位类似 wei 之于 ETH组成。构造函数构造函数在部署时初始化代币的名称和符号constructor(string memory name_, string memory symbol_){ name name_; symbol symbol_; }transfer()转账实现IERC20中定义的transfer函数完成代币转账逻辑。部分真实代币会在这一函数中扩展税收、分红、抽奖等逻辑function transfer(address recipient, uint amount) external override returns (bool) { balanceOf[msg.sender] - amount; balanceOf[recipient] amount; emit Transfer(msg.sender, recipient, amount); return true; }approve()授权实现IERC20中定义的approve函数完成代币授权逻辑。被授权的spender可以是普通账户EOA也可以是合约例如授权给 Uniswap 帮你交易代币function approve(address spender, uint amount) external override returns (bool) { allowance[msg.sender][spender] amount; emit Approval(msg.sender, spender, amount); return true; }transferFrom()授权转账实现IERC20中定义的transferFrom函数完成授权转账逻辑。被授权的spender将sender账户的代币转给收款人recipient同时从allowance[sender][msg.sender]中扣除相应额度function transferFrom( address sender, address recipient, uint amount ) external override returns (bool) { allowance[sender][msg.sender] - amount; balanceOf[sender] - amount; balanceOf[recipient] amount; emit Transfer(sender, recipient, amount); return true; }mint()铸造非标准函数mint不在IERC20标准中是额外添加的铸造函数。本示例中任何人可以随意铸造任意数量的代币真实项目中必须加上权限控制如onlyOwner只允许合约所有者铸造function mint(uint amount) external { balanceOf[msg.sender] amount; totalSupply amount; emit Transfer(address(0), msg.sender, amount); }注意铸造的语义从零地址address(0)向调用者转移amount代币因此totalSupply同步增加并触发Transfer(address(0), msg.sender, amount)事件。burn()销毁非标准函数burn同样不在标准中用于销毁代币通常用于通缩设计function burn(uint amount) external { balanceOf[msg.sender] - amount; totalSupply - amount; emit Transfer(msg.sender, address(0), amount); }销毁的语义与铸造相反从调用者地址向零地址address(0)转移totalSupply同步减少。实战在 Remix 发行你的第一个 ERC20 代币有了标准发行代币变得非常简单。下面我们在 Remix IDE 中完整走一遍流程。第一步编译并部署合约在 Remix 中打开 Languages/pt-br/31_ERC20/ERC20.sol编译通过后进入 Deploy 面板填入构造函数参数name_设为WTFsymbol_设为WTF点击transact部署合约至此代币WTF就创建成功了。第二步调用 mint 为自己铸造代币在 Remix 左侧Deployed Contract区域找到已部署的ERC20合约在mint函数的输入框中填写100点击mint按钮即可为自己铸造 100 个WTF代币。点击Debug按钮可以查看更详细的执行日志日志中包含四条关键信息事件名称Transfer代币铸造来源地址0x0000000000000000000000000000000000000000零地址代币接收地址0x5B38Da6a701c568545dCfcB03FcB875f56beddC4铸造数量100第三步用 balanceOf 验证余额调用balanceOf()函数输入你的当前账户地址可以看到返回结果为100说明铸造成功。图中左侧是账户信息右侧标记的是本次函数执行的详情至此你已经成功在以太坊测试环境上发行了自己的 ERC20 代币。仓库中的 ERC20 生态接口的真实应用IERC20接口的价值在于「只依赖标准签名即可与任意 ERC20 代币交互」这一设计在仓库后续的多个模块中被反复验证32_Faucet/Faucet.sol水龙头合约通过IERC20 token IERC20(tokenContract)创建接口对象再调用token.balanceOf(address(this))检查余额、token.transfer(msg.sender, amountAllowed)发放代币——无需关心代币具体实现33_Airdrop/Airdrop.sol批量空投合约正是利用approvetransferFrom的授权机制先校验token.allowance(msg.sender, address(this)) _amountSum再循环调用token.transferFrom(msg.sender, _addresses[i], _amounts[i])完成批量转账可以视为本课接口函数在真实场景中的组合应用44_TokenLocker/TokenLocker.sol时间锁合约直接import ../31_ERC20/IERC20.sol将代币合约地址包装为IERC20 public immutable token在锁定期满后调用token.balanceOf(address(this))与token.transfer(beneficiary, amount)释放代币。从源码结构可以看出本课的IERC20接口在整个 WTF-Solidity 教程中扮演了「代币交互基石」的角色后续的 DeFi 相关合约几乎都建立在它之上。总结本节课我们学习了以太坊的 ERC20 代币标准理解了IERC20接口中 2 个事件Transfer、Approval与 6 个函数totalSupply、balanceOf、transfer、allowance、approve、transferFrom的职责与签名手动实现了ERC20合约包括public状态变量自动生成 getter 与override的使用技巧以及transfer、approve、transferFrom、mint、burn的完整逻辑在 Remix 中完成了从编译部署、构造参数填写、mint铸造到balanceOf验证余额的完整发行流程。ERC20 标准自 2015 年底提出以来极大降低了在以太坊上发行代币的门槛开启了 ICO 大时代。需要提醒的是投资代币时应仔细审查其合约实现例如是否存在后门铸造、权限控制是否健全以规避风险——这也是我们学习这一课、乃至后续安全系列课程的意义所在。【免费下载链接】WTF-SolidityWTF Solidity 极简入门教程供小白们使用。Now supports English! 官网: https://wtf.academy项目地址: https://gitcode.com/GitHub_Trending/wt/WTF-Solidity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考