一、ERC721与ERC1155概述:NFT标准的发展历程、核心区别与应用场景
1.1 NFT标准从何而来?
聊NFT标准,得先从以太坊说起。2017年,CryptoKitties(加密猫)火了一把,每只猫都是独一无二的。那时候大家发现,ERC20标准只能做同质化代币——你手里的一个ETH和我手里的一个ETH,完全一样,可以互换。但加密猫不行啊,每只猫的基因、外观都不同,不能互换。
于是就有了ERC721。这个标准专门用来表示「非同质化」资产。说白了,就是每个代币都有独立ID,谁跟谁都不一样。我记得当时有个项目方找我咨询,说想把游戏里的武器做成NFT,我第一反应就是:「用ERC721吧,每把剑的属性和稀有度都不同,天然适合。」
但问题来了。如果你要做游戏,里面有武器、盔甲、药水、地图碎片……每种资产都部署一个ERC721合约?那gas费会高得吓人。于是ERC1155应运而生。它把「同质化」和「非同质化」统一到一个合约里。嗯,这个设计思路,我个人觉得非常巧妙。
1.2 ERC721与ERC1155的核心区别
先看一张对比表,一目了然:
| 对比维度 | ERC721 | ERC1155 |
|---|---|---|
| 代币类型 | 每个ID唯一(1对1) | 每个ID可批量(1对多) |
| 批量操作 | 不支持原生批量 | 支持批量铸造/转账 |
| Gas效率 | 单次操作较高 | 批量操作极省gas |
| 合约数量 | 每种资产需单独部署 | 一个合约管理多种资产 |
| 典型场景 | 数字艺术品、收藏品 | 游戏道具、多品类NFT |
你可能会问:「为什么ERC1155能省gas?」
原因很简单。ERC721每次转账或铸造,都要单独调用一次合约方法。而ERC1155的safeBatchTransferFrom可以一次打包多个ID和数量,只付一次基础gas费。我在一个游戏项目中实测过,批量铸造100个道具,用ERC1155比用ERC721省了将近70%的gas。这个数字,说实话,当时我自己都吓了一跳。
核心区别一句话总结:ERC721是「一个萝卜一个坑」,每个ID代表唯一资产;ERC1155是「一个坑里可以放多个萝卜」,同一个ID可以代表多个相同资产。
1.3 应用场景对比
选哪个标准,完全看业务需求。我按场景给你拆开讲:
场景一:数字艺术品 / 收藏品
比如CryptoPunks、Bored Ape Yacht Club这类。每件艺术品都是独一无二的,没有「批量」的概念。这时候用ERC721最合适。为什么?因为ERC721的tokenURI天然支持每个ID对应独立的元数据。你想想看,如果两只猴子共用同一个URI,那还叫什么独一无二?
我曾经帮一个艺术家朋友发行NFT系列,他要求每幅画的元数据都不同,包括画作名称、创作日期、隐藏属性。用ERC721实现起来非常直接,每个tokenId映射一个独立的JSON文件。如果用ERC1155,虽然也能做到,但需要额外处理ID到URI的映射逻辑,反而多此一举。
场景二:游戏道具 / 多品类资产
这是ERC1155的主场。想象一下,你的游戏里有:
- 金币(同质化,数量可叠加)
- 稀有武器(非同质化,每把属性不同)
- 药水(半同质化,同一种药水可叠加,但不同药水不能混)
如果用ERC721,你得部署三个合约。而ERC1155一个合约搞定所有。而且玩家交易时,可以一次把金币、武器、药水全部转走,省时省gas。
我的建议:如果你不确定未来会扩展多少种资产,优先选ERC1155。它更灵活,后期加新资产类型不需要重新部署合约。我在一个链游项目中吃过亏——一开始用ERC721,后来要加新道具,不得不做合约升级,折腾了整整两周。
场景三:半同质化代币(SFT)
比如演唱会门票。同一场次的票,价格相同、座位区域相同,但每张票的座位号不同。这时候用ERC1155最合适:用tokenId表示「场次+座位区域」,用amount表示该区域的票数。既保留了同质化的批量特性,又通过元数据区分了每张票的细节。
避坑指南:我曾经遇到一个项目,把门票做成ERC721,结果同一场次1000张票,需要调用1000次铸造方法。gas费高到离谱,用户直接骂娘。后来改成ERC1155,一次铸造搞定。所以,只要资产有「批量」属性,就别死磕ERC721。
1.4 发展历程中的关键节点
简单梳理一下时间线:
- 2017年:ERC721草案提出,CryptoKitties引爆市场
- 2018年:ERC721正式成为以太坊标准(EIP-721)
- 2019年:Enjin团队提出ERC1155,解决游戏场景的痛点
- 2020年:DeFi Summer爆发,NFT开始出圈
- 2021年:ERC1155被广泛采用,OpenSea等平台全面支持
说实话,ERC1155刚出来的时候,很多人觉得没必要。「ERC721够用了,为什么要搞个新标准?」但后来游戏和元宇宙项目越来越多,大家才发现,ERC1155的批量操作和gas优化,简直就是为大规模应用量身定做的。
嗯,这里要补充一点:ERC1155的safeTransferFrom和safeBatchTransferFrom都带有安全检查,会调用接收方的onERC1155Received或onERC1155BatchReceived。这个设计跟ERC721的safeTransferFrom一脉相承,都是为了防止代币被锁死在非合约地址里。我在审计中见过不少项目,因为没实现接收钩子函数,导致NFT转进去就取不出来了。这种坑,踩一次就够你记一辈子。
1.5 小结
选标准,本质上是在选「资产模型」。ERC721适合「唯一性」强的场景,ERC1155适合「批量+混合」的场景。没有绝对的好坏,只有合不合适。
下一章,我会带你深入ERC721的合约实现,从IERC721接口到_mint的内部逻辑,手把手拆解。到时候你会看到,为什么ERC721的ownerOf查询比ERC1155的balanceOf更耗gas——这些细节,才是真正区分工程师水平的地方。