一、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 发展历程中的关键节点

简单梳理一下时间线:

  1. 2017年:ERC721草案提出,CryptoKitties引爆市场
  2. 2018年:ERC721正式成为以太坊标准(EIP-721)
  3. 2019年:Enjin团队提出ERC1155,解决游戏场景的痛点
  4. 2020年:DeFi Summer爆发,NFT开始出圈
  5. 2021年:ERC1155被广泛采用,OpenSea等平台全面支持

说实话,ERC1155刚出来的时候,很多人觉得没必要。「ERC721够用了,为什么要搞个新标准?」但后来游戏和元宇宙项目越来越多,大家才发现,ERC1155的批量操作和gas优化,简直就是为大规模应用量身定做的。

嗯,这里要补充一点:ERC1155的safeTransferFromsafeBatchTransferFrom都带有安全检查,会调用接收方的onERC1155ReceivedonERC1155BatchReceived。这个设计跟ERC721的safeTransferFrom一脉相承,都是为了防止代币被锁死在非合约地址里。我在审计中见过不少项目,因为没实现接收钩子函数,导致NFT转进去就取不出来了。这种坑,踩一次就够你记一辈子。

1.5 小结

选标准,本质上是在选「资产模型」。ERC721适合「唯一性」强的场景,ERC1155适合「批量+混合」的场景。没有绝对的好坏,只有合不合适。

下一章,我会带你深入ERC721的合约实现,从IERC721接口到_mint的内部逻辑,手把手拆解。到时候你会看到,为什么ERC721的ownerOf查询比ERC1155的balanceOf更耗gas——这些细节,才是真正区分工程师水平的地方。