05 · ERC-20、ERC-721、ERC-1155 到底差在哪
钱包索引器为什么要分别识别 ERC-20、ERC-721 和 ERC-1155?因为它们表达的不是三种品牌,而是三种不同的资产数据模型。
先看最短答案:
| 标准 | 资产是否可互换 | 余额由什么确定 | 一个合约通常管理什么 |
|---|---|---|---|
| ERC-20 | 可以 | 地址对应的数量 | 一种同质化代币 |
| ERC-721 | 不可以 | 唯一 tokenId 的所有者 | 一个 NFT 系列 |
| ERC-1155 | 可混合 | 地址 + tokenId + 数量 | 多种同质化/NFT资产 |
可以先类比成:ERC-20 是钱,ERC-721 是房产证,ERC-1155 是游戏仓库。但类比只负责入门,真正区别要看合约如何记录所有权。

别先看它叫 Token 还是 NFT,先看“余额由哪个键确定”。
01 ERC-20:只关心数量
同一种 ERC-20 的每个最小单位没有身份差别:
地址 A → 2 USDT
地址 B → 100 USDT合约提供统一接口:
balanceOf(address)
transfer(to, amount)
approve(spender, amount)
transferFrom(from, to, amount)常见用途:
- 稳定币
- 治理代币
- 包装资产,例如 WETH
- LP 或金库份额代币
ETH 本身不是 ERC-20;它是 Ethereum 原生币。WETH 才是 ERC-20 合约资产。
记忆锚点:ERC-20 回答的是“这个地址有多少”,不关心“具体是哪一枚”。
02 ERC-721:每个 tokenId 都不同
ERC-721 给每个 NFT 一个唯一 tokenId:
tokenId 100 → 地址 A
tokenId 101 → 地址 B
tokenId 102 → 地址 A常见接口:
ownerOf(tokenId)
balanceOf(owner)
approve(to, tokenId)
setApprovalForAll(operator, approved)同一系列的两个 NFT 也可以有完全不同的属性和市场价值。
一个容易忽略的查询问题:标准 balanceOf(owner) 只能告诉钱包这个地址拥有几个 NFT,通常不能直接列出全部 tokenId。钱包仍需要扫描 Transfer 事件或使用索引器;ERC721Enumerable 只是可选扩展。
记忆锚点:ERC-721 的核心不是图片,而是每个
tokenId有独立所有者。
03 ERC-1155:一个合约装下很多资产类型
ERC-1155 把余额扩展成:
balanceOf(address, tokenId)一个合约可以同时管理:
tokenId 1 → 金币,总量很大
tokenId 2 → 木材,总量很大
tokenId 3 → 限量门票,总量 1,000
tokenId 4 → 唯一武器,总量 1它还提供批量余额和批量转移,适合游戏道具、票券、系列化商品等场景。
索引器通过 TransferSingle 和 TransferBatch 发现地址接触过哪些 ID。知道合约地址仍然不够,还需要知道相关 tokenId。
记忆锚点:ERC-1155 是“一个合约、多种 ID、每种 ID 各有数量”。
04 三种标准放进同一个地址
同一个 EVM 地址可以同时拥有:
原生币:0.1 ETH
ERC-20:2 USDT
ERC-721:NFT #102
ERC-1155:门票 ID 3,共 5 张钱包要用不同方式查询和展示:
| 资产 | 直接查询 | 如何发现全部资产 |
|---|---|---|
| 原生 ETH | eth_getBalance(address) | 节点状态已知 |
| ERC-20 | balanceOf(address) | Token Transfer 索引 |
| ERC-721 | ownerOf(id) / balanceOf(owner) | NFT Transfer 索引 |
| ERC-1155 | balanceOf(owner,id) | Single/Batch 事件索引 |
这就是为什么钱包的 Tokens、NFTs 页面背后通常都需要索引服务。
05 主流的其他 ERC 是什么
绝大多数资产底座仍是 ERC-20、721、1155。下面这些更像建立在底座上的功能扩展。
| 标准 | 解决什么 | 是否是新的基础资产类别 |
|---|---|---|
| ERC-2612 | 用签名完成 ERC-20 permit 授权 | 否,仍是 ERC-20 扩展 |
| ERC-4626 | 标准化 DeFi 金库和份额换算 | 否,份额兼容 ERC-20 |
| ERC-2981 | 声明 NFT 版税接收方和金额 | 否,NFT 扩展接口 |
| ERC-3525 | 带数值槽位的半同质化资产 | 是较专门的数据模型 |
| ERC-6909 | 更轻量的多代币接口 | 是,但普通钱包覆盖不如 1155 |
| ERC-777 | 带发送/接收钩子的同质化代币 | 未取代 ERC-20 主流地位 |
还有一些经常被放在一起说,但不是同类:
- ERC-4337:账户抽象,不是代币标准。
- ERC-6551:让 NFT 关联账户,不是新的 NFT 所有权格式。
- ERC-404:实验性混合方案,不应当成已经统一采用的正式标准。
06 EVM 之外的对应体系
“ERC”属于 Ethereum/EVM 生态。其他链使用自己的标准:
| 生态 | 常见标准 |
|---|---|
| BNB Chain | BEP-20,高度兼容 ERC-20 |
| Tron | TRC-20 |
| Solana | SPL Token / Token Extensions |
| Bitcoin | Ordinals、BRC-20、Runes 等不同协议 |
名字都叫 USDT,不代表它们处在同一网络或同一合约中。
07 动手:从区块浏览器辨认资产标准
这是只读操作,不连接钱包、不签名、不付 Gas。
- 打开一个 EVM 区块浏览器上的代币合约页面。
- 查看合约是否提供
balanceOf(address)、ownerOf(tokenId)或balanceOf(address,id)。 - 查看事件名称是
Transfer、TransferSingle还是TransferBatch。 - 对照上表判断标准。
预期结果
ERC-20 和 ERC-721 都可能有名为 Transfer 的事件,但 ERC-721 的事件包含唯一 tokenId;ERC-1155 使用自己的 Single/Batch 事件。
如果不同怎么办
- 看不到源码:先查看区块浏览器识别出的 Token Standard、事件日志和已验证 ABI。
- 接口混在一起:一些合约会实现多个标准或扩展,不能只凭一个函数名下结论。
- 事件与余额对不上:可能是非标准、代理或重基类合约;继续以官方文档、已验证实现和实际只读调用交叉确认。
08 小结
- ERC-20 表示可互换数量。
- ERC-721 表示独一无二的 tokenId。
- ERC-1155 让一个合约管理多种 ID 和数量。
- 钱包发现这些资产通常依赖事件索引,而不是现场遍历所有合约。
- 其他常见 ERC 多数是授权、金库、版税等扩展,不是第四种普遍资产类别。
一句话记住:ERC-20 记数量,ERC-721 记唯一 ID,ERC-1155 同时记 ID 和数量。
你现在应该能:看到一个资产合约时,先问它的余额键是什么,而不是只看项目方叫它 Token、NFT 还是凭证。