原文标题:《 ERC1155 是什么?以阿迪达斯 NFT 为例解析 》

原文作者:今天有更懂这个世界一点了吗

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

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

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

format,webp

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

format,webp

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

format,webp

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

format,webp

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

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

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

format,webp

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

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

format,webp

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

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

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

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

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

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

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

format,webp

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

format,webp

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

format,webp

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

format,webp

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

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

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

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

format,webp

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

format,webp

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

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

format,webp

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

format,webp

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

format,webp

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

format,webp

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

format,webp

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

声明:本文内容为作者独立观点,不代表GOOD资讯价值立场,且不构成任何投资理财建议。