游戏苑Yu-Gi-Yn从代码层面复盘mint

前言

嘿,大家好,我是大咪,之前一直关注编程领域。现在入区块链的世界半年,不断关注了NFT、撸空投等领域,偶尔写一写自己的心得体会。目前是 @TBP 船员。

欢迎关注推特:@dami

游戏苑是10月近期一个比较热的项目,总量 8888 ,官方锁仓 4444 ,白单超发,每个钱包白单可以 mint 2个,每个 0.07777。

游戏苑官网
游戏苑官网

 其项目背景和团队都非常强(mint后,大咪又听了下官方 mod 的 AMA ,说是目前接触的项目方中, web2 资源实力已经是位列前茅的了)

  • Founder - @Rock,是日本第二大的广告公司-博报堂的前CCO/副社长,目前是跨国广告公司Zero Unity的CEO,专攻digital service/brand marketing,Web2/Web3资源与经验丰富

  • 艺术家 - 主设计神护熊平,他的3D视频在Youtube播放量高达一千万。其余艺术指导/创意总监,在日本设计圈内也是小有名气的人物。

在9月底的时候,就有看到很多 alpha 社区在 call 了,同时,游戏苑和各大社区的合作白明显有超发的趋势。

 

在白单超发的情况下,必然当天是异常火爆的,所以,提前做好抢购工作的常见手段有 4 种。

 

  1. 普通用户,通过官网页面点击 mint (火爆项目往往前端都会经常性出问题)

  2. 熟悉 etherscan 用法的用户,通过 etherscan 直接绕过前端进行 mint

  3. 花钱的用户,比如有其他一些 mint 工具,可以直接通过工具和合约进行交互 mint

  4. 有自己的 mint bot 的科学家,通过代码层面的机器人直接进行 mint

 

但,以上四种,对于游戏苑来说,绕不开的都有一点,就是在进行合约 mint 的时候,关于如何拿到 merkcle proof,也就是现在热门项目所用到的 merkle tree (默克尔树白名单验证)。

 

可能看到上面的话述,对于普通玩家已经有点迷了,不要慌,@大咪会尽量用通俗易懂的话述解释清楚。

 

Merkle tree(默克尔树)讲解

 

首先,大家要知道,merkle tree (默克尔树)是个什么?

 

对于不懂代码普通玩家来说,它的概念你可以理解为计算机中的一种数据结构(数据结构可以理解为计算机存储数据用的"容器"),目前在 NFT 领域,经常被用于合约相关的白名单验证。

 

既然 merkle tree 中带了“树”字,大多数也是从现实生活场景中映射到计算机世界中的,生活中,我们都见过大树对吧,长这样:

它,有根,也有枝干。

 

而计算机世界中的 merkle tree 却是现实世界树的倒过来,根在最上面,"枝干"(枝干在计算机世界中,被称为,叶子节点)在下面。

 

我在网上找了一个比较清晰的结构图,大家可以看下:

 

 在 NFT 白单验证的过程中,我们把链上数据(钱包地址)作为 merkle tree 的叶子节点(也就是大树的枝干),由每个"枝干"(leaf node),再去生成最终的"树根"(merkle root)。

 

是不是和现实世界恰好相反?现实世界中的树,是先有根,再有枝干和叶子,而 merkle tree 则是先有"叶子",再有了根。

 

 

那,代码中,生成了"树根"的作用是什么呢?

为了验证!

 

当有了根的数值(类似这样的数值:dd8a848bc98dec5ec445dc38baa207ee2094c9c8cd7f3fb889e0f8bd7eb6ba64)以后,便可以验证你的"叶子"(钱包地址)究竟是不是长在我这棵大树上。

 

项目方在录入合约的时候,只需要把 merkle tree 的根节点数值录入到合约中即可。(比较节省gas,节省gas就是节省金钱啊,同时,用起来也很方便)

 

当然,这个验证是需要算法去支撑的,具体细节,普通玩家不需要知道,但你需要知道的是,我们去找这棵"拥有白名单的树"去验证时,不是直接通过提交我们的钱包地址去向它验证

 

而是需要通过这棵树,通过使用你的钱包进行一些算法处理,最终会给你颁发一个证明(merkle proof),只有把这个证明提交了,并且证明是对的,才能验证你确实是这棵大树的叶子!

 

证明(merkle proof)一般长什么样子呢?下面这样:

 ['0x366a19a6fa5c41fece60ed70665f1e97b21aa5d108286ef978f780b5e7779515','0x1b0871129921055bb61db5d27746bdcd91dcab8e251ec320198cca437923b2d4','0x327a589bb53c374fcc7f74b2a15fc8077b6b49529cfa2cc07cc8930649b0fbae','0x22c16b8dc5815c2a81123ad48911147a8b4ffe783adbc0a9275de3d785b2fd64']

 

对于普通玩家来说,基础知识了解到这里就够了。

 如果是开发人员,上面这些内容远远不能满足你的好奇心。

 

想了解更多细节,推荐两篇文章,写的非常好:

一篇是A总的教程:

一篇是这个老哥的:

 

两篇文章看完,也就懂了 merkle tree 的代码层面用法了。

 

所以,回归到正题,我们要向合约进行白名单验证,我们需要什么?看完上面的知识,请大声告诉我!

是不是 merkle proof?(也就是叶子节点对应的证明)

 

接下来,让我们重回当天游戏苑 mint 的场景。

 

Whitelist mint时发生的问题

 

先知道一点,游戏苑这次 whitelist 的中奖有两种情况。

一种是通过 premint 抽奖中奖的用户,还有一种是通过社区合作,直接走的 DTC (地址直接进合约录入)

 

继续看下当时的 mint 网站。 

前端网站

 

 找不到当时的 mint 的截图,假设现在已经开启,按照当时的场景,其实上面的 MINT 按钮是黑色可以点亮的。

 

于是,问题出现了,有一部分人(包括我自己在内,premint抽奖中的白单)无法通过网页直接 mint ,随后打开浏览器开发者工具(谷歌浏览器,点击F12),找到了调用后端接口获取 merkle proof 的接口:

 

 

正是这个接口,当时没有成功返回 merkle proof 导致前端页面无法正常 mint 。

 

前面的知识点讲过,我们把自己的钱包地址提交给 merkle tree,由它来帮我们生成一段 merkle proof,结果现在返回的是空,必然和合约进行交互的时候,就会有问题了。

 

这事儿一出来,当时 dc 社区中出现了不少 fud 的声音,也有一帮科学家很机智,开始抓紧时间找原因。

 

过了一段时间,有个大佬说,是因为游戏苑当时后端接口,对于钱包地址没有做大小写匹配导致返回查询不到 merkle proof。

 

premint当时提交的钱包地址,是类似下面这样,大小写混合组成的钱包地址:

0xb825f7406f485914D2d28098D8e22F22A36AEe81

 

而如果你当时的地址在白名单中,只需要把钱包的大写字母,全部转为小写,然后在拼接到这个地址上:

 

就能正常返回结果了。(没有保留当时的截图)

 

后来仔细一想,猜测其实是因为后端人员对地址做了缓存,才导致了这样的结果。。。后来很多人也反馈,发现走 DTC 的用户都可以正常从页面上进行 mint 。而 premint 的部分用户却不行,就是这个原因。

 

但,现在说啥也不重要了,重要的是,假如当时的你,通过该地址全部转成小写,并且成功拿到了 merkle proof,接下来要怎么做?

 

善用 etherscan,走合约直接 mint

 

这就到了我上面提到的 4 种方法的第二种,一般情况,etherscan是不会轻易挂掉的。但也不是没有意外情况,概率很低。

 

学会使用 etherscan ,对于普通玩家来说,也是至关重要的一环,如果你会了这种方式,即使前端页面挂掉了,你也可以正常的去 mint 。

 

为了复现当时的场景,我们先来打开当时以太坊主网 etherscan mint 时的交易记录,首先打开 opensea,复制合约地址:

 

 

打开 etherscan 上直接搜索地址:

 

 查看历史交易记录, method 一般带有 mint 相关单词,意味着是 mint 的方法:

 

 

随便点进去看一笔,拉到 input data处,点击 Decode input data:

 

 

点击这个之后,可以把它变成我们看得懂的东西,第一个是数量,可以看到data为2,意味着是mint了2个,后面 merkleProof 则是字节32的数组,可以看到它的内容,就是上面我提到的知识点里的类似内容:

 

 

查看了当时正常 mint 成功的交易记录后,我们如何通过 etherscan 进行 mint ?

 

回到合约初始页,点击 contract - write contract:

 

 

先正常链接钱包,然后找到刚才交易成功数据中,method 为【saleStageMint】对应的框框:

 

点开后,长这样:

 

1、payableAmount(ether)

一个个说,首先是交易金额,单位是eth,这个是指不涵盖 gas ,单纯的 mint 价格,如果你不知道写多少,可以回到别人成功的交易记录,能看到 value 值,1个就是 0.0777,2个就是0.1554

 

2、quantity(uint256)

要mint的数量,1个就写1,2个就写2,好项目直接拉满。

 

3、merkle proof(byte32[])

这个就是写前面基础知识介绍到的,如果你通过游戏苑后端接口获取到了 merkle proof,类似这种代码:

['0x366a19a6fa5c41fece60ed70665f1e97b21aa5d108286ef978f780b5e7779515','0x1b0871129921055bb61db5d27746bdcd91dcab8e251ec320198cca437923b2d4','0x327a589bb53c374fcc7f74b2a15fc8077b6b49529cfa2cc07cc8930649b0fbae','0x22c16b8dc5815c2a81123ad48911147a8b4ffe783adbc0a9275de3d785b2fd64']

那么就可以直接写到这里了,但是,需要注意怎么写,格式要按照下面这样写:

 不能有单引号,双引号,空格,逗号用英文的!

 

[0x8d56a688f6bc1c30427c4ab6b0958819e000b43c8c0ab543bf28a8a32f89b0db,0xc6caa9cb444c2879af3f1f60d999a24acd75ec11217e40a9f123c1d3ebb4b825,....(这里不是省略号,一直顺着复制到最后)]

 

最终填的数据:

 

但注意,如果有空格出现,你就会看到上面这样的报错,仔细检查,否则不让你点 write。

 

正确的去掉空格后,点击 write 可以成功唤起小狐狸,后续流程就正常的调节 gas ,正常确定就好了:

 

 

测试网模拟合约mint

 

为了更好的练手,我在 goerli 测试网上部署了游戏苑的合约,当然,我把价格改的非常低了,0**.**003 就可以直接 mint 一个。

 

合约地址如下:

 

 

goerli测试网领测试币地址(可以自己先去挖点,再去 mint ):

 

当然,如果你也想连连手,可以在本条推特下留言,留下你的测试钱包,我给你添加完白名单后,会发你对应的 merkle proof,这样你就可以愉快地玩耍了。

 

像下面都是我自己测试着玩的,你可以跟着这些成功的按照上面的流程进行学习:

 

 

结语

 

好了,以上就是本文的全部内容了,希望你看完后能有所收获。

最后,也非常感谢@🦈哥的投喂,正因为走了 DTC ,所以这波游戏苑还是 mint 到了,跟着🦈哥吃肉肉,也欢迎更多有才能的小伙伴共同加入 @TBP 一起在 NFT 世界航行

 

 

Subscribe to dami.eth
Receive the latest updates directly to your inbox.
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.