Jason chen

Posted on Apr 11, 2022Read on Mirror.xyz

ERC1155是什么?以阿迪达斯NFT为例解析

三大标准协议ERC20、ERC721(衍生ERC721A)和ERC1155,在之前的文章中已经为大家介绍并实战了前2个,但第三个1155一直没有遇到不错的例子来讲解,恰好昨天有朋友疑惑为什么阿迪达斯的NFT只有一个item却有3万人持有,研究了一下觉得是一个不错的例子,故写下本文来以此阐述什么是ERC1155。

我们先看一下阿迪达斯NFT是什么情况,opensea网址如下:https://opensea.io/collection/adidasoriginals。

我们进入后可以看到只有1个NFT,但却有2万余人持有它,这时候下意识你可能会猜测它是共享NFT?或是碎片化NFT吗?

进入该NFT的详情页,我们可以看到共有21.7K人持有它。

再往下可看到有很多持有者挂单,并且价格不一。

我们点击购买,可以发现要求支付1.499ETH,即所有挂单价格的最低价。

到这里你会感觉好像确实和平时常见的NFT看起来不一样,怪怪的。

然后我们再点击details看一下,Token Id是 0,众所周知大多数NFT的toklen id都是递增的,即我发行一万个NFT,ID应该是从0递增至一万的,但是阿迪达斯发行了3万个,按照常理应该有3万个NFT,且ID是递增至3万的,但为什么这里只有1个ID为0的NFT呢?

我们继续向下看,它的协议是ERC1155,猫腻可能是出在这里,大家也许会发现自己在opensea上传的NFT也用的是1155协议,这两者有什么关系吗?

为什么阿迪达斯要用这样一个不常见的NFT协议,这里面一定是有原因的,所以我们继续顺藤摸瓜,我们看看阿迪达斯官网对于它的NFT的介绍。

阿迪达斯NFT共分为四个阶段,第1、2、3阶段都涉及到销毁兑换操作,第四个阶段会获得一个ERC721NFT。

那我们推演一下,阿迪达斯在下一盘大棋,通过游戏化的形式使用四个阶段的收集、销毁、兑换过程层层打怪,提升大家的参与度从而打出品牌影响力,所以这里的重点是“销毁”,如果3万人手里的NFT要被销毁,那意味着这些NFT工具属性非常强,不能有差异,从这个点来看常见的ERC721发行非同质化代币协议好像不太适用。

那ERC1155好像是比较适用的,我们先简单了解一下什么是ERC1155,然后再一起看阿迪达斯合约具体都做了一些什么事。

ERC1155相比于ERC721简而言之最大的区别就是它可以一个合约承载多类FT与NFT,可以将其理解为是ERC20和ERC721的融合加强版,想发行同质化和非同质化的代币1155全部搞定,而不用用多个合约承载再进行交互。

ERC721是一个合约承载1类NFT,1类NFT承载多个NFT,如无聊猿,它的合约有且仅能发行无聊猿这一套NFT,每个具体的NFT编号均不相同为递增,但是ERC1155一个合约可以发行多类NFT,它最常用的场景在游戏,比如一个游戏中,可能会有很多类装备如“武器”、“坐骑”、“药品”等,这些装备有的是非同质化的,比如屠龙宝刀只有1个,有的是同质化的比如药品都是一样的喝一瓶补10滴血,而传统的721只能发行一类实体,但是1155却可以发行多类,说起来还有点抽象是不是,直接上代码。

我们来演示一个最简单的1155协议合约,自上而下,我先创建了3种代币类型分别为武器wq、坐骑zj和宝石bs,他们的编号分别为0、1、2。

然后我定义这三类代币的发售最大数量分别为1、10和9999。

在mint函数中,传入三个参数分别为地址、代币编号和数量,依次校验当前用户要mint的代币类型数量是否超过了最大发售数,若未超过则执行mint操作,这里大家注意,相比721的mint这里的mint多传入了一个id,这个id即1155协议中定义的代币类型,同样的在校验的过程中用到了totalSupply相比如721多传入了id,也是因为有多个代币类型,所以需要用id来检索到底要获取的是哪一个代币类型的数量。

我们执行mint操作,输入地址,mint编号为2的代币,mint100个出来,点击transcat执行。

可以看到我进行balanceOf查询编号为2的代币持有100个。

我也可以将我的代币转移给其他人,同样的需要定义转移的哪一类,以及转移多少个,这和常见的721都是不一样的。

至此你已经明白了1155和721到底有什么区别,接下来我们看看阿迪达斯的合约代码,代码有点多我挑着重要的讲,不懂代码没关系请一定要耐心看下去,理解项目方到底做了什么事。

首先定义了最多发售3万个,白名单预售最多发售20380个,白名单每人最多mint1个,公售每人最多mint2个。

然后定义了预售、公售的开始和结束时间,这里使用的是时间戳定义。

最后定义了销毁窗口期的时间。

然后执行了构造函数,这里挺有意思项目方给自己一开始自动mint了380个。

这里我们学以致用,把上篇文章教大家的阅读etherscan使用起来,我们查一下这个地址的情况。

挺穷的啊钱包里都没什么钱。

再看一下他的交易记录,有大量的动辄几十上百的ETH流水,项目方自己mint+钱包里没钱+有大量大额交易记录,所以这个钱包可能是一个白手套。

继续看代码,这里到了mint函数,可见它目前只有1类代币所以自动传入了编号0。

有趣的来了,这个函数是用来在销毁窗口期执行的,首先判断用户持有情况和窗口期时间,然后先执行burn销毁用户代币,再执行mint给用户新创建代币出来,这里用到了cardIdToMint这个参数用来管控到达了第几轮,还记得一开始阿迪达斯说总共有4轮吗。

这两个函数则是项目方用来操控cardIdToMint具体的轮次。

以上带着大家通过实战和解读阿迪达斯代码学习了ERC1155协议,相信对于NFT生态有了更深的理解,协议作为基建的创新会释放出更多上层NFT的应用场景。

欢迎添加我的微信:cj350306878 一起交流学习探讨,请备注姓名 公司和职位,谢谢。

其他文章:

NFT