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

By [dami.eth](https://paragraph.com/@yidakoumi) · 2022-10-23

---

前言
--

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

欢迎关注推特：[@dami](https://twitter.com/dami16z)

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

![游戏苑官网](https://storage.googleapis.com/papyrus_images/a27d32020978d5f789daeb0533f3b7384ec0d2122e74c73778c0f4d11f09dbc7.png)

游戏苑官网

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

*   Founder - [@Rock](https://twitter.com/rockinumber6)，是日本第二大的广告公司-博报堂的前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 （默克尔树白名单验证）。**

  

可能看到上面的话述，对于普通玩家已经有点迷了，不要慌，[@大咪](https://twitter.com/dami16z)会尽量用通俗易懂的话述解释清楚。

  

Merkle tree（默克尔树）讲解
===================

  

首先，大家要知道，merkle tree （默克尔树）是个什么？

  

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

  

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

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

它，有根，也有枝干。

  

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

  

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

  

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

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

  

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

  

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

  

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

为了验证！

  

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

  

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

  

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

  

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

  

证明（merkle proof）一般长什么样子呢？下面这样：

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

  

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

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

  

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

一篇是A总的教程：

[https://mirror.xyz/ninjak.eth/kPBE6QzZeplo72UvGeJOcCEpZZMu9qVMmEu4KDZHzsM](https://mirror.xyz/ninjak.eth/kPBE6QzZeplo72UvGeJOcCEpZZMu9qVMmEu4KDZHzsM)

一篇是这个老哥的：

[https://mirror.xyz/qiwihui.eth/HRifb9gziR1UvVmRcMjDfDvQ9mq7o7FA6BNuCJMFT00](https://mirror.xyz/qiwihui.eth/HRifb9gziR1UvVmRcMjDfDvQ9mq7o7FA6BNuCJMFT00)

  

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

  

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

**是不是 merkle proof？（也就是叶子节点对应的证明）**

  

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

  

Whitelist mint时发生的问题
====================

  

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

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

  

继续看下当时的 mint 网站。 

前端网站
----

  

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

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

  

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

  

[https://backend.yu-gi-yn.com/merkle-proof.json?&address=0x](https://backend.yu-gi-yn.com/merkle-proof.json?&address=0x)

  

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

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

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

  

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

  

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

  

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

  

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

0xb825f7406f485914D2d28098D8e22F22A36AEe81

  

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

[https://backend.yu-gi-yn.com/merkle-proof.json?&address=0x](https://backend.yu-gi-yn.com/merkle-proof.json?&address=0x)

  

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

  

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

  

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

  

善用 etherscan，走合约直接 mint
-----------------------

  

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

  

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

  

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

[https://opensea.io/assets/ethereum/0x477f885f6333317f5b2810ecc8afadc7d5b69dd2/8192](https://opensea.io/assets/ethereum/0x477f885f6333317f5b2810ecc8afadc7d5b69dd2/8192)

  

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

  

打开 etherscan 上直接搜索地址：

[https://etherscan.io/address/0x477f885f6333317f5b2810ecc8afadc7d5b69dd2](https://etherscan.io/address/0x477f885f6333317f5b2810ecc8afadc7d5b69dd2)

  

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

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

[https://etherscan.io/txs?a=0x477f885f6333317f5b2810ecc8afadc7d5b69dd2&p=190](https://etherscan.io/txs?a=0x477f885f6333317f5b2810ecc8afadc7d5b69dd2&p=190)

  

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

  

随便点进去看一笔，拉到 input data处，点击 Decode input data：

  

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

  

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

  

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

  

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

  

回到合约初始页，点击 contract - write contract：

  

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

  

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

  

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

点开后，长这样：

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

  

1、payableAmount(ether)

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

[https://etherscan.io/txs?a=0x477f885f6333317f5b2810ecc8afadc7d5b69dd2&p=190](https://etherscan.io/txs?a=0x477f885f6333317f5b2810ecc8afadc7d5b69dd2&p=190)

  

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

2、quantity(uint256)

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

  

3、merkle proof（byte32\[\]）

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

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

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

 **不能有单引号，双引号，空格，逗号用英文的！**

  

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

  

最终填的数据：

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

  

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

  

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

  

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

  

测试网模拟合约mint
-----------

  

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

  

合约地址如下：

  

[https://goerli.etherscan.io/address/0x835f3d61463e0e4bf5be2adbbfdb7cc6dc6b5cbd](https://goerli.etherscan.io/address/0x835f3d61463e0e4bf5be2adbbfdb7cc6dc6b5cbd)

  

goerli测试网领测试币地址（可以自己先去挖点，再去 mint ）：

[https://goerli-faucet.pk910.de/](https://goerli-faucet.pk910.de/)

  

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

  

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

  

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

  

结语
==

  

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

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

---

*Originally published on [dami.eth](https://paragraph.com/@yidakoumi/yu-gi-yn-mint)*
