# NFT玩家如何提前获取白名单的merkle proof？

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

---

前言
--

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

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

距离上次写游戏苑那篇文章，已经过去有一段时间，当时评论区留言反馈比较多的是，大家希望可以写一写如何通过技术手段，提前获取到自己白名单的 merkle proof ？

当然，如果你是已经编程领域的老手，对于爬虫，网络请求都已经非常了解，那本篇可以忽略，本篇文章的面向人群，是非技术领域的 NFT 玩家，本篇尝试用通俗易懂的语言来把原理给大家讲清楚，并且通过举例近期的 NFT 实战项目告诉大家方法。

那么，今天就来用最近我参与过的 NFT 项目，一一来举例。

上篇文章回顾详见，游戏苑文章：[https://mirror.xyz/yidakoumi.eth/0Lnbf4ZhFJHM3zlO--JFQr3HTktqKeHsIJlz6ln0\_H8](https://mirror.xyz/yidakoumi.eth/0Lnbf4ZhFJHM3zlO--JFQr3HTktqKeHsIJlz6ln0_H8)

浏览器 & 网络请求
----------

在正式开始之前，我需要先来科普一下，浏览器和网络请求的一些知识，这些知识不用担心看不懂，我尽量以通俗易懂的图去讲解。

正常情况下，当我们访问一个网站，我们都需要用到浏览器，比如，当我们访问百度，它背后到底发生了什么，我们就能看到百度的主页了？

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

下图是一个正常我们访问网页的流程：

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

我们通过访问浏览器，让浏览器发送一个网络请求到对应的服务器，最终服务器在把数据给我们返回，当然，我这里省略了很多细节，比如浏览器对页面的一些渲染之类的。

对于非技术小白来说，只需要明白上面的流程，我们在网页上看到的一些数据展示，都是通过远程服务器给我们返回的，服务器，大家可以理解为一台性能很好的电脑即可。

那，当我们在 MINT NFT 的时候，和项目方做的前端网页究竟发生了怎么样的流程？他们又是怎么获取到我们的 merkle proof 的，我来按照项目来给大家举例。

**举例的顺序，是按照从容易到困难，从常见到极端。**

NFT实战举例获取 merkle proof
----------------------

获取 Merkle Proof 一般是在开始前获取，我们可以提前登录到项目的 MINT 网站，然后分析网络请求。以下例子仅限于项目把合约开源了，如果是合约没有进行开源，那就没有意义了。

比如当时的 dudulab ，合约没开源，都是从前端 mint 的，当时网址还被冲击崩掉了几分钟。

### 后端服务器接口返回 Proof

先来讲第一种情况，就是和上面网络请求原理一样，由项目方的后端服务器算出你的 merkle proof，通过网络请求将数据给你返回。

#### Friday Beers

这里第一个案例，讲的是 Friday Beers ，10月底，一个永远的痛，当时在推特非常火热，但是如果你当时没来记得跑，那么最终一定是亏了不少。

让我们来看看，当时他们的网站是什么形式去获取白名单的 merkle proof 的？

1、下图是当时他们的官网，我们可以在页面上右键，点击 inspect ，如果你是中文，这个单词是检查

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

2、然后可以看到浏览器下图会弹出来一个铺满代码的新的窗口，点击到 Network，即网络

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

3、然后我们可以通过最简单的方式，直接 Ctrl + F ，搜索关键词【proof】，可以看到下面的图：

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

在文章上面的时候，我们介绍了网络请求，而下面你看到的这些一行行数据，每一行就是一个网络请求。

4、当你单击地址后，可以看到这个网络请求的网址是什么：

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

同时，如果 Request Method 写的是 GET ，说明我们是可以通过浏览器直接访问这个网址的。

5、复制 Request URL 的地址到浏览器打开：

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

我们可以看到，这便 Friday Beers 项目方，通过服务器后端给我们返回的 Merkle Proof。

6、为了好看一些，我们可以把浏览器这个内容全部复制到 json.cn 的网址中，让它自动格式化下，下面的 proof 的内容，便是你当时的 merkle proof 了，如果想通过合约 mint ，只需要观察白名单的 mint 函数是否需要 proof 进行传入：

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

当然，这里教大家一个小技巧如何确认，一般使用 merkle tree 作为白名单的项目方，都会在合约的记录中，有一个 Set Merkle Root 的动作，搜到了，一般就是说明当前合约白单使用的是 Merkle Tree，

打开 etherscan ，可以 Ctrl + F 搜索下：

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

#### Machina

有的时候，由于开发人员对命名规则的不同，你不一定能上来直接搜到 proof 相关的网络请求，那怎么去观察查找呢，这里以本周 Machina 项目为例。

1、依然是浏览器打开【右键-检查】，弹出下面的窗口，点击到 Fetch/XHR ，这个菜单的选项意思是，动态数据的网络请求，都会被过滤出来，然后按顺序从上到下，看看有没有【wl】或者【你的钱包地址】的相关关键词，如果有，一般这个网络请求，就是从服务端获取到的 proof 请求：

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

2、找到后，点击到 Response ，顺便点击下左下角的花括号，可以很好地格式化当前的网络请求响应数据，然后你可以找到 proofs 的内容，便是你的 Merkle proof：

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

#### 游戏苑

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

有些时候，还有一种情况，获取 proof 的网络请求，会在网站开启 MINT 的时候，才会触发后端获取 proof 的真正网络请求。

比如当时的游戏苑，如果你通过上面的两种方式去查找 proof ，会发现压根找不到请求。而游戏苑就是这种场景，点击 MINT 后，才会触发后端获取 proof 的真正网络请求。

但大家可以从上图看到，实际上 MINT 的时候，按钮是置灰的，我们从前端页面是点击不了的。那么，该如何做？

还是同样的操作，我们可以利用【右键-检查】，先去点击左下方的箭头，然后在点击到项目网站的 MINT 按钮：

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

单击后，可以看到下面的代码变亮了：

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

然后可以发现，源代码中，有个 disable 的英文，我们双击一下这行代码：

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

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

删掉后，回车，你会发现，上面的 MINT 按钮变得可以点击了：

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

后面的操作就正常了，和上面介绍的两个项目中一样，点击后，触发真实的网络请求，得到自己的 proof 即可。

PS：这招是 [@TBP](https://twitter.com/TheBlackPear1_) 前端大佬 [@梁哥](https://twitter.com/liang3472) 教我的，收获颇多，感谢，这里不得不在吹一波 TBP ，氛围是真的好。。各种氛围，懂的都懂~

### 前端代码算出 proof

#### 海盗

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

我印象里，海盗这个项目当时 MINT 合约是没开源的，记得当时 [@梁哥](https://twitter.com/liang3472) 直接撸了一个在线生成 proof 和 16进制的小工具打算给群友使用。

虽然海盗当时 mint 没开源，但是海盗这个生成 proof 的案例，确是一个很好的案例。

因为海盗当时的 Merkle root 原地址，是写到前端 js 代码里的，下面来教大家，如果项目从后端接口中没有返回 proof，那么前端如何查找到自己的 proof。

1、首先，如果你知道自己是白，那么，同样的操作，按照下图，点到 NetWork（网络），点击到 JS 菜单（目的是过滤出 js 相关文件），然后 Ctrl + F 直接搜素自己的白单钱包地址，

然后最关键的一步，靠耐力和经验，通过 js 的文件名，猜测哪个文件是最有可能包含真实信息的，当时我看有个叫 mintxx.js ，意思就是在 mint 时候，和浏览器发生交互的 js 文件：

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

2、直接单击，同样点击到Response，然后左下方的代码格式化：

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

3、格式化好后的代码很整齐，但由于浏览器不便于查找，你可以全选，复制：

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

4、开发人员一般都有 vscode 编辑器，对于非技术人员，你可以直接新建一个 word 或者 txt 文档，直接粘贴进来。

然后全局搜索自己的钱包地址：

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

可以看到，var sc = 后面的这一堆地址，就是要生成 Merkle tree 的源头钱包地址，对 merkle tree 原理不熟悉的同学，回顾我这篇游戏苑文章：[https://mirror.xyz/yidakoumi.eth/0Lnbf4ZhFJHM3zlO--JFQr3HTktqKeHsIJlz6ln0\_H8](https://mirror.xyz/yidakoumi.eth/0Lnbf4ZhFJHM3zlO--JFQr3HTktqKeHsIJlz6ln0_H8)

有了全部的白名单钱包源地址和你自己的地址后，我们可以通过下面这个网站，直接生成自己的 merkle proof：

[https://lab.miguelmota.com/merkletreejs/example/](https://lab.miguelmota.com/merkletreejs/example/)

用法如下，把你拿到的所有钱包地址，全部复制到 input 框里，然后选到 Keccak-256，点击计算即可：

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

下面找到自己的钱包地址，便可以获取到对应的 proof 了：

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

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

### 最难搞的一种情况

#### tsukimi

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

如果是合约中，需要带签名的这种，对于技术小白来说就直接放弃吧，花钱使用现成的工具，或者直接求助于有代码功底的朋友。

什么样子的合约 mint 是签名类的，就像下图的 tsukimi 一样，在合约中找到对应的 mint 方法，一般都有个下面的名称：

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

我们也可以找到一笔成功的链上数据去看下：

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

如果是有编程经验的人，需要了解 web 逆向相关的知识，与其说是逆向，不如说是断点调试的功底，只要会用浏览器 debug ，打好断点，一步步找到对应的加签方法，最终还是能跑出结果的。

### 结语

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

关于合约 MINT 的详情，看第一篇内容比较好，我当时在测试网上部署了游戏苑的合约，有需求的小伙伴可以联系我哈！

PS：欢迎更多有才能的小伙伴共同加入 [@TBP](https://twitter.com/TheBlackPear1_) 一起在 NFT 世界航行，共创社区~

---

*Originally published on [dami.eth](https://paragraph.com/@yidakoumi/nft-merkle-proof)*
