# Yuga Labs系NFT介绍与解读


By [NETICI LABS](https://paragraph.com/@netici-labs) · 2022-08-02

---

🔵_这是NETICI LABS的第二篇文章分享。NL试图打造一个有温度的 Web3 【玩具】试验室。这里有硬核技术分析文章，也有市场观察分析，希望大家一起来玩。_

**_🟡The next big thing will start out looking like a toy._**

🔴_玩具开发者：arc0xc9_

[https://twitter.com/masonlog](https://twitter.com/masonlog)

🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡

\*\* \*\*

**一、  Yuga Labs是什么**

Yug Labs是一家美国的公司。它的领投人：a16z，估值40亿，占以太坊top 100 NFT的40%。包含无聊猿猴系列，密码朋克等。

最初Yugalabs发行了“无聊猿猴”，这是一个ERC721合约，总共供应1w个猿猴。接下来，YugalabsYugalabs开始对无聊猿猴提供“增值服务”，第一步是发行Kennel（宠物狗），每个无聊猿猴的持有钱包都会被空投一只宠物狗。接下来，项目方发行了一组“药水”，它是ERC1155合约，可将无聊猿猴进行突变，得到“突变猿猴”。当然，用户也可以直接购买突变猿猴。

Yuga Labs的另一条线是Larva Labs。Larva Labs是一支有着极客精神的团队，前阵被Yuga Labs收购。该团队早在17年发行了密码朋克，彼时还没有721标准，它在一定程度促进了721的发展。后续Larva Labs发行了第一个链上“生成艺术”作品Autoglyphs，以通过智能合约来生成复杂的图像。此外，Larva Labs还包括Meebits等作品。

Yuga Labs是的这组产品全部发行于以太坊，占以太坊NFT市值的40%以上。我们接下来体验这些产品，并对它们的源码和流程进行解读。

### 二、  BAYC：无聊猿猴赛艇俱乐部

*   发行时间：2021-04-28
    
*   发行量：10000
    
*   官网：[https://boredapeyachtclub.com](https://boredapeyachtclub.com/)
    
*   合约地址：0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D
    

无聊猿猴最初是定位给新手，一只猴子起步价仅仅0.08ETH。最初运营也是不愠不火，直到几天后收藏家Pransky宣布自己已经购买了好几只猿猴，随后无聊猿猴一夜爆火，许多社会名流都纷纷购买了这些猿猴，风靡一时。用户把猿猴当作一种“虚拟身份”，并把自己归属于一个虚拟的“俱乐部”。玩家们把猿猴设置成自己的头像，并互相关注、互动；Yugalabs也为这些猿猴设置了许多独特服务，包括[浴室](https://boredapeyachtclub.com/#/)、sanbox道具等。还会为持有者空投突变猿猴、宠物狗等等。

还有一个比较有意思的点，就是用户刚开始挖掘出token的时候，是并知道自己的猴子肖像，需要在特定条件被触发后，才知道自己对应哪个猿猴。

*   流程
    

1）项目方初始化猿猴：生成10000个猿猴图片，存放在IPFS上。猿猴的生成依靠算法，通过将170个稀有属性中选取若干个赋予到猿猴画像上。这些猿猴会挂在官网上，进行宣发。

2）项目方初始化合约：部署合约，并设置基础参数。主要包括： baseUri：设为"[https://us-central1-bayc-metadata.cloudfunctions.net/api/tokens/](https://us-central1-bayc-metadata.cloudfunctions.net/api/tokens/)"。 provenanceHash: 10000个猿猴的merkle hash saleIsActive: 在打开的状态下，可以获取猿猴 revealTimeStamp：过了这个期限，可以确定自己的猿猴是什么。在那之前自己仅仅获取的是tokenId

3）用户购买：调用合约的mintApe函数，可以购买指定数目的猿猴（但不能超出限制）。用户一开始购买的时候只能获取到tokenId，但是并不知道这个tokenId对应哪知猿猴。如果猿猴总数达到totalSupply，或者超过了reveal日期，就会记下当前块高，用于计算每个tokenId对应到哪个猿猴上，后续项目方会揭示每个tokenId对应哪只猿猴。

4）确定映射：任何人都可以调用setStartingIndex函数，该函数会对上述块高进行哈希并对totalSupply取模，得到的下标就是tokenId为0对应的猿猴下标。公式为：

![](https://storage.googleapis.com/papyrus_images/8304698b976450553db8fbc5f5e3da99a553ef2b166fcd271091ca1849989e9d.png)

我们可以去官网上查看这层映射：[https://boredapeyachtclub.com/#/provenance](https://boredapeyachtclub.com/#/provenance) 另外，从区块浏览器看出，官方在全部猩猩mint完毕之前就揭示了这个映射关系。 5) 项目方关联猿猴和tokenUri： 由于已经确定了每个token对应的哪一只猴子，因此根据ERC721的要求，用户调用tokenURI，是必须得到对应猿猴的元数据。怎么做的呢？项目方在HTTP上，为每个token的tokenURI生成一份猿猴描述文件，包含了猿猴的ipfs cid等信息：

![](https://storage.googleapis.com/papyrus_images/09716c2747ce0b1ca8d1c222c76cd677979f846866e47e3a09827523979a4721.png)

可以通过里面的链接，访问到具体的猴子：

![](https://storage.googleapis.com/papyrus_images/f7bad3b213e1d8d415a7752794a7b3535a287904e125838fc3fdd04b6cfb9dd3.png)

这里面，baseUri是基于http的。

后来，项目方又在ipfs上把所有的token元数据文件都上做成了一个目录，目录的哈希为ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq，随后重设了一把baseUri。当后续调用tokenURI函数的时候，根据openZeppelin的逻辑，会将baseUri和tokenUri拼接起来，例如1号token对应的uri是“ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/1”，该uri地址包含看元数据文件：

![](https://storage.googleapis.com/papyrus_images/03ffa87d55b70251d427d92aff5d1b1aa07e714483e0fd85171827bfd5a08242.png)

6）用户查看猿猴肖像：确定映射后，就可以查看猿猴画像了。先使用合约的tokenURI，根据openZeppelin的逻辑，会将tokenId和baseUri拼接起来，例如： 1号token对应的uri是“ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/1”，该uri地址会返回猿猴描述文件。用户访问里面的猿猴ipfs 地址，即可访问到猿猴画像

7）项目方提现：项目方调用withDraw函数，把猿猴合约的代币总额提取到owner地址。

🗂_Reference_：

*   合约[https://etherscan.io/address/0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D#readContract](https://etherscan.io/address/0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D#readContract)
    
*   官网：[https://boredapeyachtclub.com/#/provenance](https://boredapeyachtclub.com/#/provenance)
    

### 三、BAYC：无聊猿猴赛艇俱乐部

*   发行时间：2021-06
    
*   发行量：10000
    
*   合约地址：0xba30E5F9Bb24caa003E9f2f0497Ad287FDF95623
    

  

这是一个ERC721合约，每一个狗子都唯一对应了一只无聊猿猴，id也是对应的。可以在Opensea上看下这些狗子的长相：[https://opensea.io/collection/bored-ape-kennel-club](https://opensea.io/collection/bored-ape-kennel-club)

![](https://storage.googleapis.com/papyrus_images/51c1724885500c9beab37232e53ff8e95ac3675f0b610b0a1987d9cb3f288321.png)

典型的ERC721。每个BAYC的持有者都可以调用adoptDog领养一只：

![](https://storage.googleapis.com/papyrus_images/fe4180fffc3527026f3cfb28242c29b33da57a1d8e98fbaf81fadc592c4988e1.png)

### 四、BACC：无聊猿猴化学实验室

*   发行时间：2021-08
    

该合约属于无聊猿猴中的道具，专供无聊猿猴持有者使用，用于将无聊猿猴升级为突变猿猴。由于是道具类合约，采用了ERC1155。ERC1155允许每个TokenId可以有多个，此外还支持一次操作多个Token。在实际应用当中，每个tokenId通常表示一类物品。

道具的挖掘直接由项目方来控制，可以在代码中看到，mintBatch函数直接由项目方调用，给其他地址进行空投：

![](https://storage.googleapis.com/papyrus_images/e604523df74ae367c6c0c77c79532c73743119687713184979b29695c029de24.png)

BoreApeChemictry主要包含3类药水，它们的信息如下：

![](https://storage.googleapis.com/papyrus_images/f2d2ffaa81af4c31298379df61a466a844c441a54716c5fa07eaadff12a4f3f4.png)

这里面可以看到药水的价格：[https://opensea.io/collection/bored-ape-chemistry-club](https://opensea.io/collection/bored-ape-chemistry-club)可以看到目前M3的价格要比前两种药水贵一倍。

### 五、MAYC：突变猿猴游艇俱乐部

*   发行时间：2021-08-28
    
*   发行量：30000
    
*   合约地址：0x60E4d786628Fea6478F785A6d7e704777c86a7c6
    

  

Yugalabs在2021年4月份推出无聊猿猴后，随即又在8月份出了续作——突变猿猴。突变猿猴在画像上，比无聊猿猴多了更多的细节。比如：

[https://boredapeyachtclub.com/api/mutants/1](https://boredapeyachtclub.com/api/mutants/1)

突变猿猴有两种获取方式：购买或突变。

对于购买而言，采用荷兰式拍卖策略，价格递减，在[etherscan](https://etherscan.io/tx/0xad3f9db2e81cceaf790b5ebad5b38e8e383d001c77e2c5667b36c004ffab936f)上可以看到，起始价格被设为3ETH， 在9个小时内，价格会线性递减，直到终止价格为0.01TH。（当然了，在[二级市场](https://opensea.io/assets?search%5Bquery%5D=Mutant%20Ape%20Yacht%20Club)上还是炒的很高）。此外，挖到的猿猴，仍然会有盲盒属性。户获取到突变猿猴后，都不知道自己获取的具体猿猴是什么。只有到了特定时间点，系统才会随机的为为该tokenId分配到具体的猿猴图片。

对于突变，则属于对无聊猿猴持有者的福利。Yugalabs对持有者免费提供一个药水(可能是M1，也可能是M2)，然后直接调合约，挖出一个突变猿猴。当然，原有的猿猴也是存在的，也就是说，用户手里会有一个无聊猿猴，一个突变猿猴。

![](https://storage.googleapis.com/papyrus_images/faec888c0123fc83b680ba9baa869d9a518b638d0588ca269724a9979316f70b.png)

*   流程
    
    **_1）_** 项目方生成30000个突变猿猴，并上传到IPFS，得到cid。也会挂在官网上，前期宣发
    
    **_2）_** 项目方部署合约，并初始化参数： a. baseUri：一个http地址([https://boredapeyachtclub.com/api/mutants/](https://boredapeyachtclub.com/api/mutants/))，可以和tokenId合成一个http地址，例如[https://boredapeyachtclub.com/api/mutants/1。在揭示映射关系前，该地址是空的；在揭示后，该地址包含一份元数据文件，包含了IPFS文件地址](https://boredapeyachtclub.com/api/mutants/1%E3%80%82%E5%9C%A8%E6%8F%AD%E7%A4%BA%E6%98%A0%E5%B0%84%E5%85%B3%E7%B3%BB%E5%89%8D%EF%BC%8C%E8%AF%A5%E5%9C%B0%E5%9D%80%E6%98%AF%E7%A9%BA%E7%9A%84%EF%BC%9B%E5%9C%A8%E6%8F%AD%E7%A4%BA%E5%90%8E%EF%BC%8C%E8%AF%A5%E5%9C%B0%E5%9D%80%E5%8C%85%E5%90%AB%E4%B8%80%E4%BB%BD%E5%85%83%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%EF%BC%8C%E5%8C%85%E5%90%AB%E4%BA%86IPFS%E6%96%87%E4%BB%B6%E5%9C%B0%E5%9D%80) **_3）_** 用户获取突变猿猴。有购买、突变两种方式。根据获取的方式不同，突变的id被分为3个号段： \[0, 10000): 购买 获得的突变猿猴 \[10000, 30000): 突变（M1 或 M2） 获得的突变猿猴。偶数位是M1药水突变的，奇数位是M2药水突变的。 \[30000, 30007\]: 突变（Mega） 获得的突变猿猴 具体的获取逻辑： a. 购买方式。使用mintMutants方式售卖，每个猿猴的价格采用荷兰式拍卖策略，即设置一个最高价，随着时间线性衰减，直到达到一个地板价。每个猿猴id将位于0~10000。当最后一个猿猴被挖走时，会记一个块高，用于确定tokenId对应哪个猿猴。 b. 突变方式。使用mutateApeWithSerum方式，免费进行突变。猿猴持有者提供猿猴id和药水id，进行突变。根据药水id，分为如下情形： i. 如果是M1，M2药水，则突变猿猴id = 10000 + apeId \* 2 + idOfSerum 1. 比如你的BAYC的id是0，那么如果M1药水，得到的是10000+0+0=10000；如果是M2药水，则得到10000+0+1=10001。 ii. 如果是M3药水，则突变猿猴id从30000开始递增 注意，突变后，是新生成一个猿猴，原有的猿猴仍旧存在。而且，一个BAYC，可以用M1突变，然后再用M2突变。我们可以看到突变猿猴10110和10111就是例子，它们均由55号BAYC得来。 **_4）_** 确定tokenId对应哪个猿猴。使用前述块高得到一个伪随机r，然后生成突变猿猴图片的下标——startingIndex a. 对于挖出来的，startingIndex = r % 10000 b. 对于M1，M2，startingIndex = 20000 c. 对于M3，采用startingIndex = r % 8 \*\*\*5）\*\*\*项目方会在链下更新tokenUri的链接，为每个uri设置元数据文件，使它指向对应的猿猴。
    

### 六、CryptoPunks：密码朋克

*   发行量：10000
    
*   发行方：LarvaLabs(已被Yugalabs收购)
    
*   发行时间：2017
    
*   合约地址：0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB
    

  

![](https://storage.googleapis.com/papyrus_images/aba0e8ccf58d09d504162dbb5ecfca8fe815cf514ccfb85e53188fcf41409dcd.png)

*   流程
    
    1）项目方生成密码朋克 通过编程方式，来创建10000个密码朋克。具体而言，每个密码朋克属于5个基本类型之一，含Allien、Ape、Zombie等；此外，还存在若干组特征，涵盖发型、胡子、首饰等，生成器会为每一个CryptoPunk随机赋予这些特性。可以参考这里。
    
    2）项目方初始化合约 项目方初始化CryptoPunkMarket合约 1） 用户取得CryptoPunk 用户有两种方式获取CryptoPunk。一种是项目方调用setInitialOwner来为用户发放某个密码朋克；一种是用户可以通过getPunk函数免费领取（当然还需支付手续费）密码朋克。 当所有的密码朋克都领取后，新的用户只能通过购买的方式获取了密码朋克了。 2） 用户转移CryptoPunk 用户可以通过transferPunk函数，将自己的CryptoPunk转移给他人。这个适用于场外交易的场景。
    
    3）买家购买CryptoPunk 买家有两种购买方式。一种是常规的买卖，一种是拍卖竞价。 a、 常规方式购买 卖方通过调用offerPunkForSale/offerPunkForSaleToAddress函数，成为卖家。两个函数均会在链上会为该CryptoPunk记录一个Offer结构体，包含了售卖的最少价格。此外，还可以调用函数，指定售卖给特定用户。 买方调用buyPunk完成购买，需要通过msg.value完成付款
    
    b、 拍卖 买方可以调用enterBidForPunk进行竞价，竞价成功的话，旧的竞价者的资金将会被退回。买方还可以通过withdrawBidForPunk撤回竞价。 卖方查看竞价的价格合理后，将调用acceptBidForPunk结束竞拍，完成资金和密码朋克的转移。
    
    4）提款 在cryptopunk中，资金的转移不是通过transfer完成的，而是通过withdraw模式提走的。因此无论是卖方，还是竞价者，都需要通过withdraw领取自己的资产。
    

项目方有一张密码朋克的全家福图片。这张图片记录了所有的密码朋克。该图 片的哈希值通过openssl生成，哈希被存入到合约中。我猜测它的用途是，当一个人拿出一个头像，声称是密码朋克头像。验证者拿出一张具有信服力的密码朋克图片，并使用openssl生成全家福的哈希，和合约记录的做对比，对比通过后，再看这个头像是不是属于这张全家福。

### 七、Autoglyph

*   发行时间：2019
    
*   合约地址：0xd4e4078ca3495DE5B1d4dB434BEbc5a986197782
    

  

Autoglyph是2019年LarvaLabs的一个项目，其细分领域属于“生成艺术”（generative art）。它的字面意义是“自动浮雕”，顾名思义，它利用智能合约来生成一幅幅艺术品。它总共会发行512张，每一张的生成成本0.2eth（当时约35u），获利均捐赠给慈善机构。该项目上线后，几小时内售卖了215份。来看几个实例：

![](https://storage.googleapis.com/papyrus_images/4d886e27559124d9e2fa7bfef16dbc21e799203b2742a5c863afcc976ee5c288.png)

![](https://storage.googleapis.com/papyrus_images/3d70238c88716745078b4bd2a444ee5f92113cd38c8a8e38709ab5e08d35cd90.png)

![](https://storage.googleapis.com/papyrus_images/60f66a9eb274293b77ef98bd1ed83410b53fefdf19d0c20c41634d47ceaf4b06.png)

![](https://storage.googleapis.com/papyrus_images/2b524e4184034835f6a09bc3dd79aaee159bf8a65ce89b8b707337ee3739e55f.png)

*   构成
    

每一个艺术品，都是一个64 \* 64个“像素”构成的图片，每一个“像素”，都是一个符号，比如X，/，\\等。总共有10种字符：

![](https://storage.googleapis.com/papyrus_images/f8f0cb5f2f17ce32c8d3942b456daa9c5e1a2f2c712b174fa6f8d1a3c91c0ac1.png)

*   分类
    

总共有10个分类：

![](https://storage.googleapis.com/papyrus_images/ee53184798360f4eef25b4ad86c12bed3ca8fec814255ff862a0e15d214685fb.png)

我们取1号token，它的scheme是5，即由圆圈和横竖线构成。

*   怎么玩
    
    每个tokenId包含一个draw方法，可以生成一个独一无二的图形：
    

![](https://storage.googleapis.com/papyrus_images/30c15cf93eee68e30043caa45d99d7cbceabee37f9ac5e11049398de3cd69d05.png)

draw返回的内容，被称为“指令”。我们可以将指令转换成图片：

![](https://storage.googleapis.com/papyrus_images/8bb9945c683107a875103b76d12a13ff7b010543d51c962a2d9593c16522e7de.png)

那么指令和图片之间的关系是什么呢？

![](https://storage.googleapis.com/papyrus_images/b3c36c5a462df62c46b8990d57dbba7d6fb2fccf05fbc7d014f815d10716bfb1.png)

![](https://storage.googleapis.com/papyrus_images/a077b309dbbb44616a59921c7c2778e55743f55d9abd18e29ba1c2ab68b6d0d2.png)

我写了一个程序AutoglyphViewer（[https://github.com/arc0035/AutoglyphViewer），用于把autoglyph的指令转换成图片，后面我们会用到。](https://github.com/arc0035/AutoglyphViewer%EF%BC%89%EF%BC%8C%E7%94%A8%E4%BA%8E%E6%8A%8Aautoglyph%E7%9A%84%E6%8C%87%E4%BB%A4%E8%BD%AC%E6%8D%A2%E6%88%90%E5%9B%BE%E7%89%87%EF%BC%8C%E5%90%8E%E9%9D%A2%E6%88%91%E4%BB%AC%E4%BC%9A%E7%94%A8%E5%88%B0%E3%80%82)

*   生成
    

createGlyph， 传入一个seed，就是个大整数。比如第一笔createGlyph调用传入的是：

![](https://storage.googleapis.com/papyrus_images/b04b6d598e9bd21ee537987005ede75ce524b192b8d9c37f25d5b27414c7edaa.png)

前面128个免费，后面的需要收0.2 eth 作为手续费。

根据seed决定scheme。这里面有一定的概率分布的，模式值越高，越稀有。这里注意，是可以预测的，没有任何随机机制。就是把seed哈希一下，然后去对83取模。这是故意的，允许玩家尝试不同的seed，来生成最漂亮的图形。Seed将唯一决定最终的图形。

我写了一个程序，可以测试不同的种子，能生成什么样的图形。

*   绘图
    
    a) 先用id获取seed
    
    b)根据seed，确定种类
    
    c)遍历64行、64列。
    
    d)针对每一行，根据当前的行号i，生成一个y值。
    
    e) 针对每一行，根据当前的行号j，生成一个x值。
    
    f)seed对y和x进行对称控制。
    
    g)x和y的乘积决定了符号是什么。
    
    h)把符号写入代码
    

那么算法设计有哪些要点呢？**_对称和稀疏_**

核心思想是对称。比如j，我们来看x的生成：

j=0，x=-63

j=63, x=63

j=1，x=-61,

j=62, x=61

...

_强对称：_

1号token（167726281823327713905875984158077896770509714748）就是典型的强对称。确定了一个点，那么它对x轴、y轴镜像位置的3个点，都是一样的。演示下修改代码的结果。

_斜对称：_

5号token（525374247764745964394680383062899100064980141500）是典型的斜对称。确定了一个点，那么它的镜像位置都是一样的。也就是说，符号要变一起变，乘积。

_轴对称：_

6号是典型的单轴对称，它对y轴对称。

_不对称_：四个点完全不一样。

*   浓度
    

如果我们把mod变得很大，那么明显会稀疏很多。

*   讨论
    

scheme是否意味着价格更高？以及一定更精美？

![](https://storage.googleapis.com/papyrus_images/cbb7901fb82e8b517c791acde4d496257efb3dc508346f21fa2434ac6b931c97.png)

🗂_Reference_

*   合约[https://etherscan.io/token/0xd4e4078ca3495de5b1d4db434bebc5a986197782#readContract](https://etherscan.io/token/0xd4e4078ca3495de5b1d4db434bebc5a986197782#readContract)
    
*   图集：[https://www.larvalabs.com/autoglyphs/glyph?index=16](https://www.larvalabs.com/autoglyphs/glyph?index=16)
    
    🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡
    
    Twitter: neticilabs
    
    即刻：NeticiLabs
    
    [https://twitter.com/neticiofficial](https://twitter.com/neticiofficial)

---

*Originally published on [NETICI LABS](https://paragraph.com/@netici-labs/yuga-labs-nft)*
