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 个函数。
❓ 自测
📝 本课小结
核心要点
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 继续实践吧!
←
→