EIP-1155ERC代币标准Final(2018-06-17)多代币标准
一个合约同时管理多种代币:同质化与非同质化可以共存,支持批量转移,游戏道具场景的首选。
适用链:全部 EVM 链 + 各 L2
为什么重要:ERC-1155 把「同一批道具的 1000 份」表示为同一个 id 的余额,而不是 1000 个 NFT。这使得批量空投、批量转移的 Gas 从 O(n) 降到接近 O(1),是链游与票务的标准做法。
函数签名与选择器
选择器是签名的 keccak256 前 4 字节;事件则是完整的 32 字节 topic0。 点一下即可复制。
| 签名 / 字段 | 选择器 / topic0 | 说明 |
|---|---|---|
| balanceOf(address,uint256) | 某地址持有某个 id 的数量。 | |
| balanceOfBatch(address[],uint256[]) | 批量查询,两个数组长度必须相等。 | |
| setApprovalForAll(address,bool) | 授权操作者管理全部代币种类。 | |
| isApprovedForAll(address,address) | 查询全局授权。 | |
| safeTransferFrom(address,address,uint256,uint256,bytes) | from / to / id / amount / data 五个参数。 | |
| safeBatchTransferFrom(address,address,uint256[],uint256[],bytes) | 批量转移:ids 与 amounts 数组一一对应,这是它相对 721 最大的优势。 | |
| event URI(string,uint256)事件 | id 的元数据地址变更时发出。 | |
| event TransferSingle(address,address,address,uint256,uint256)事件 | 单笔转移事件,operator 是实际执行者。 | |
| event TransferBatch(address,address,address,uint256[],uint256[])事件 | 批量转移事件,索引器需要按数组展开处理。 |
代码模板
最小实现(单笔 + 批量转移)
最小实现(单笔 + 批量转移)Solidity
批量转移时 receiver 回调只调一次(onERC1155BatchReceived),而不是每个 id 调一次,这是省 Gas 的关键。
批量空投的调用方式(viem)
批量空投的调用方式(viem)TypeScript
实现与使用时的常见陷阱
- ✕ids 与 amounts 数组长度必须一致,否则必须 revert——漏掉这个检查会让索引器算错余额。
- ✕是否用 ERC-1155 的判断依据:同一批资产需要发多份(道具、票、材料)。如果每份都独一无二且需要独立元数据,用 ERC-721。
- ✕部分市场对 ERC-1155 的支持弱于 721,做 PFP 类项目不建议用它。
- ✕uri 里的 {id} 是十六进制、64 位补齐的字符串(OpenZeppelin 的惯例),自己实现时要确认前端替换逻辑一致。
- ✕批量转移的 receiver 回调必须返回正确的 selector,否则整批回滚。
相关标准
同属「代币标准」的其他标准