🔵这是NETICI LABS的第二篇文章分享。NL试图打造一个有温度的 Web3 【玩具】试验室。这里有硬核技术分析文章,也有市场观察分析,希望大家一起来玩。
🟡The next big thing will start out looking like a toy.
🔴玩具开发者:arc0xc9
🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡
** **
一、 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%以上。我们接下来体验这些产品,并对它们的源码和流程进行解读。
发行时间:2021-04-28
发行量:10000
合约地址:0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D
无聊猿猴最初是定位给新手,一只猴子起步价仅仅0.08ETH。最初运营也是不愠不火,直到几天后收藏家Pransky宣布自己已经购买了好几只猿猴,随后无聊猿猴一夜爆火,许多社会名流都纷纷购买了这些猿猴,风靡一时。用户把猿猴当作一种“虚拟身份”,并把自己归属于一个虚拟的“俱乐部”。玩家们把猿猴设置成自己的头像,并互相关注、互动;Yugalabs也为这些猿猴设置了许多独特服务,包括浴室、sanbox道具等。还会为持有者空投突变猿猴、宠物狗等等。
还有一个比较有意思的点,就是用户刚开始挖掘出token的时候,是并知道自己的猴子肖像,需要在特定条件被触发后,才知道自己对应哪个猿猴。
流程
1)项目方初始化猿猴:生成10000个猿猴图片,存放在IPFS上。猿猴的生成依靠算法,通过将170个稀有属性中选取若干个赋予到猿猴画像上。这些猿猴会挂在官网上,进行宣发。
2)项目方初始化合约:部署合约,并设置基础参数。主要包括: baseUri:设为"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://boredapeyachtclub.com/#/provenance 另外,从区块浏览器看出,官方在全部猩猩mint完毕之前就揭示了这个映射关系。 5) 项目方关联猿猴和tokenUri: 由于已经确定了每个token对应的哪一只猴子,因此根据ERC721的要求,用户调用tokenURI,是必须得到对应猿猴的元数据。怎么做的呢?项目方在HTTP上,为每个token的tokenURI生成一份猿猴描述文件,包含了猿猴的ipfs cid等信息:

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

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

6)用户查看猿猴肖像:确定映射后,就可以查看猿猴画像了。先使用合约的tokenURI,根据openZeppelin的逻辑,会将tokenId和baseUri拼接起来,例如: 1号token对应的uri是“ipfs://QmeSjSinHpPnmXmspMjwiXyN6zS4E9zccariGR3jxcaWtq/1”,该uri地址会返回猿猴描述文件。用户访问里面的猿猴ipfs 地址,即可访问到猿猴画像
7)项目方提现:项目方调用withDraw函数,把猿猴合约的代币总额提取到owner地址。
🗂Reference:
发行时间:2021-06
发行量:10000
合约地址:0xba30E5F9Bb24caa003E9f2f0497Ad287FDF95623
这是一个ERC721合约,每一个狗子都唯一对应了一只无聊猿猴,id也是对应的。可以在Opensea上看下这些狗子的长相:https://opensea.io/collection/bored-ape-kennel-club

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

发行时间:2021-08
该合约属于无聊猿猴中的道具,专供无聊猿猴持有者使用,用于将无聊猿猴升级为突变猿猴。由于是道具类合约,采用了ERC1155。ERC1155允许每个TokenId可以有多个,此外还支持一次操作多个Token。在实际应用当中,每个tokenId通常表示一类物品。
道具的挖掘直接由项目方来控制,可以在代码中看到,mintBatch函数直接由项目方调用,给其他地址进行空投:

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

这里面可以看到药水的价格:https://opensea.io/collection/bored-ape-chemistry-club可以看到目前M3的价格要比前两种药水贵一倍。
发行时间:2021-08-28
发行量:30000
合约地址:0x60E4d786628Fea6478F785A6d7e704777c86a7c6
Yugalabs在2021年4月份推出无聊猿猴后,随即又在8月份出了续作——突变猿猴。突变猿猴在画像上,比无聊猿猴多了更多的细节。比如:
https://boredapeyachtclub.com/api/mutants/1
突变猿猴有两种获取方式:购买或突变。
对于购买而言,采用荷兰式拍卖策略,价格递减,在etherscan上可以看到,起始价格被设为3ETH, 在9个小时内,价格会线性递减,直到终止价格为0.01TH。(当然了,在二级市场上还是炒的很高)。此外,挖到的猿猴,仍然会有盲盒属性。户获取到突变猿猴后,都不知道自己获取的具体猿猴是什么。只有到了特定时间点,系统才会随机的为为该tokenId分配到具体的猿猴图片。
对于突变,则属于对无聊猿猴持有者的福利。Yugalabs对持有者免费提供一个药水(可能是M1,也可能是M2),然后直接调合约,挖出一个突变猿猴。当然,原有的猿猴也是存在的,也就是说,用户手里会有一个无聊猿猴,一个突变猿猴。

流程
1) 项目方生成30000个突变猿猴,并上传到IPFS,得到cid。也会挂在官网上,前期宣发
2) 项目方部署合约,并初始化参数: a. baseUri:一个http地址(https://boredapeyachtclub.com/api/mutants/),可以和tokenId合成一个http地址,例如https://boredapeyachtclub.com/api/mutants/1。在揭示映射关系前,该地址是空的;在揭示后,该地址包含一份元数据文件,包含了IPFS文件地址 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设置元数据文件,使它指向对应的猿猴。
发行量:10000
发行方:LarvaLabs(已被Yugalabs收购)
发行时间:2017
合约地址:0xb47e3cd837dDF8e4c57F05d70Ab865de6e193BBB

流程
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生成全家福的哈希,和合约记录的做对比,对比通过后,再看这个头像是不是属于这张全家福。
发行时间:2019
合约地址:0xd4e4078ca3495DE5B1d4dB434BEbc5a986197782
Autoglyph是2019年LarvaLabs的一个项目,其细分领域属于“生成艺术”(generative art)。它的字面意义是“自动浮雕”,顾名思义,它利用智能合约来生成一幅幅艺术品。它总共会发行512张,每一张的生成成本0.2eth(当时约35u),获利均捐赠给慈善机构。该项目上线后,几小时内售卖了215份。来看几个实例:




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

分类
总共有10个分类:

我们取1号token,它的scheme是5,即由圆圈和横竖线构成。
怎么玩
每个tokenId包含一个draw方法,可以生成一个独一无二的图形:

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

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


我写了一个程序AutoglyphViewer(https://github.com/arc0035/AutoglyphViewer),用于把autoglyph的指令转换成图片,后面我们会用到。
生成
createGlyph, 传入一个seed,就是个大整数。比如第一笔createGlyph调用传入的是:

前面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是否意味着价格更高?以及一定更精美?

🗂Reference
合约https://etherscan.io/token/0xd4e4078ca3495de5b1d4db434bebc5a986197782#readContract
图集:https://www.larvalabs.com/autoglyphs/glyph?index=16
🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡🔵🔴🟡
Twitter: neticilabs
即刻:NeticiLabs

