MODULE 4 · 代币标准

Lesson 8: ERC-20 / 721 / 1155

📖 阅读 ~15 分钟🧪 2 个实验❓ 2 道测验

什么是 ERC?

ERC (Ethereum Request for Comments) 是以太坊的标准提案。代币标准定义了合约必须实现的接口(函数+事件),让钱包、交易所、DApp 知道如何与代币交互。

💡 为什么需要标准 如果每个代币合约的函数名都不同(有的叫 send,有的叫 transfer),MetaMask 就不知道怎么显示你的余额。标准保证了互操作性

三大代币标准对比

🪙 ERC-20

  • ✅ 同质化代币 (Fungible)
  • 💰 USDC, WETH, UNI, LINK
  • 📊 每个代币等价,可分割
  • 🔢 余额就是一个数字
  • 📅 2015 年提出

🖼️ ERC-721

  • ✅ 非同质化代币 (NFT)
  • 🎨 BAYC, CryptoPunks, ENS
  • 🆔 每个代币有唯一 tokenId
  • 📦 不可分割,每个独一无二
  • 📅 2018 年提出

🎮 ERC-1155

  • ✅ 多代币标准 (Multi-Token)
  • 🎮 游戏道具、混合资产
  • 🔀 一个合约管多种代币
  • 📦 批量操作,省 Gas
  • 📅 2019 年提出

ERC-20 深入

ERC-20 是最广泛使用的代币标准。它定义了 6 个函数 + 2 个事件

// 必须实现的函数 totalSupply() → uint256 总供应量 balanceOf(owner) → uint256 查余额 transfer(to, amount) → bool 转账 approve(spender, amount) → bool 授权 allowance(owner, spender) → uint256 查授权额度 transferFrom(from, to, amount) → bool 授权转账 // 必须触发的事件 Transfer(from, to, value) ← 每次转账 Approval(owner, spender, value) ← 每次授权

Approve + TransferFrom 模式

// 为什么需要两步?DeFi 合约不能直接动你的钱 // Step 1: 你授权 Uniswap 可以花你的 USDC USDC.approve(uniswapRouter, 1000e6) // → allowance[你][uniswap] = 1,000,000,000 // Step 2: Uniswap 代你转出 USDC USDC.transferFrom(你, pool, 500e6) // → 检查 allowance ≥ 500e6 ✓ // → 扣减 allowance // → 转移代币
⚠️ 无限授权风险 很多 DApp 请求 approve(spender, type(uint256).max) 即无限授权。如果合约有漏洞,攻击者可以转走你所有代币。建议只授权需要的额度,或事后用 approve(spender, 0) 撤销。

ERC-721 深入

// ERC-721 核心:每个代币有唯一 tokenId ownerOf(tokenId) → address 谁拥有这个NFT balanceOf(owner) → uint256 拥有多少个NFT transferFrom(from, to, tokenId) 转移 NFT safeTransferFrom(from, to, tokenId) 安全转移(检查接收方) approve(to, tokenId) 授权单个 NFT setApprovalForAll(operator, bool) 授权全部 NFT tokenURI(tokenId) → string 元数据 URI // tokenURI 通常返回 JSON: { "name": "Bored Ape #1234", "image": "ipfs://Qm.../1234.png", "attributes": [{"trait_type": "Fur", "value": "Gold"}] }
🔍 safeTransferFrom 的意义 safeTransferFrom 会检查接收方是否实现了 onERC721Received 接口。如果接收方是合约且没有实现该接口,转账会 revert —— 防止 NFT 被永久锁死在不支持的合约里。

ERC-1155:多代币标准

// 一个合约同时管理多种代币 balanceOf(account, id) 查某种代币余额 balanceOfBatch(accounts[], ids[]) 批量查询 safeTransferFrom(from, to, id, amount, data) safeBatchTransferFrom(from, to, ids[], amounts[], data) // 优势: id=1 → 金币 (可替代, 数量=10000) ← 像 ERC-20 id=2 → 传奇剑 (唯一, 数量=1) ← 像 ERC-721 id=3 → 药水 (可替代, 数量=500) ← 像 ERC-20 // 一个合约搞定!批量转账只要一笔交易

🧪 动手实验

🔬 实验 1:查询真实 ERC-20 代币信息

读取 USDC 合约的 name、symbol、decimals、totalSupply。

chainlab lab defi token 0xA0b8...eB48 --chain ethereum

思考:USDC 的 decimals 是 6(不是 18)。1 USDC = 10⁶ 最小单位。为什么不是 18?

🔬 实验 2:编译我们的 SimpleToken 合约

看看一个 ERC-20 合约编译后有哪些函数和事件。

chainlab lab sol compile SimpleToken.sol

对比 ABI 中的函数列表和 ERC-20 标准要求的 6 个函数。

❓ 自测

检验你的理解

Q1: 在 Uniswap 上用 USDC 换 ETH 之前,你需要先做什么?

✅ 正确!DeFi 合约不能直接动你的代币。你必须先 approve,然后合约通过 transferFrom 代你转出。这就是 approve-transferFrom 模式。
❌ 提示:合约不能直接从你账户转走代币。需要你先授权(approve)。

Q2: ERC-721 的 safeTransferFrom 相比 transferFrom 多了什么?

✅ 正确!safeTransferFrom 会调用接收方合约的 onERC721Received 函数。如果接收方没有实现该接口,交易 revert,防止 NFT 被永久锁死。
❌ 关键字是 "safe":它检查接收方合约是否实现了 onERC721Received。

📝 本课小结

核心要点 1. ERC-20: 同质化代币(USDC/UNI),6 个函数 + 2 个事件
2. ERC-721: NFT,每个 tokenId 唯一,有 tokenURI 元数据
3. ERC-1155: 多代币标准,一个合约管理多种代币,支持批量操作
4. approve → transferFrom 是 DeFi 的核心交互模式
5. safeTransfer 防止代币被锁死在不兼容的合约中
🎉 恭喜完成全部课程! 你已经掌握了区块链开发的核心基础:EVM 原理、Gas 机制、Solidity 开发、代币标准。接下来可以深入 DeFi 协议、安全审计、L2 等进阶主题。用 chainlab CLI 继续实践吧!
上一课
Lesson 7: 合约生命周期与 ABI
课程完成
🏠 返回 Coinmeme 首页