嘿,大家好,我是大咪,之前一直关注编程领域。现在入区块链的世界半年,不断关注了NFT、撸空投等领域,偶尔写一写自己的心得体会。目前是 @TBP 的船员,欢迎更多的小伙伴来交流探讨。
同时,也欢迎关注推特:@dami
距离上次写游戏苑那篇文章,已经过去有一段时间,当时评论区留言反馈比较多的是,大家希望可以写一写如何通过技术手段,提前获取到自己白名单的 merkle proof ?
当然,如果你是已经编程领域的老手,对于爬虫,网络请求都已经非常了解,那本篇可以忽略,本篇文章的面向人群,是非技术领域的 NFT 玩家,本篇尝试用通俗易懂的语言来把原理给大家讲清楚,并且通过举例近期的 NFT 实战项目告诉大家方法。
那么,今天就来用最近我参与过的 NFT 项目,一一来举例。
上篇文章回顾详见,游戏苑文章:https://mirror.xyz/yidakoumi.eth/0Lnbf4ZhFJHM3zlO--JFQr3HTktqKeHsIJlz6ln0_H8
在正式开始之前,我需要先来科普一下,浏览器和网络请求的一些知识,这些知识不用担心看不懂,我尽量以通俗易懂的图去讲解。
正常情况下,当我们访问一个网站,我们都需要用到浏览器,比如,当我们访问百度,它背后到底发生了什么,我们就能看到百度的主页了?
下图是一个正常我们访问网页的流程:
我们通过访问浏览器,让浏览器发送一个网络请求到对应的服务器,最终服务器在把数据给我们返回,当然,我这里省略了很多细节,比如浏览器对页面的一些渲染之类的。
对于非技术小白来说,只需要明白上面的流程,我们在网页上看到的一些数据展示,都是通过远程服务器给我们返回的,服务器,大家可以理解为一台性能很好的电脑即可。
那,当我们在 MINT NFT 的时候,和项目方做的前端网页究竟发生了怎么样的流程?他们又是怎么获取到我们的 merkle proof 的,我来按照项目来给大家举例。
举例的顺序,是按照从容易到困难,从常见到极端。
获取 Merkle Proof 一般是在开始前获取,我们可以提前登录到项目的 MINT 网站,然后分析网络请求。以下例子仅限于项目把合约开源了,如果是合约没有进行开源,那就没有意义了。
比如当时的 dudulab ,合约没开源,都是从前端 mint 的,当时网址还被冲击崩掉了几分钟。
先来讲第一种情况,就是和上面网络请求原理一样,由项目方的后端服务器算出你的 merkle proof,通过网络请求将数据给你返回。
这里第一个案例,讲的是 Friday Beers ,10月底,一个永远的痛,当时在推特非常火热,但是如果你当时没来记得跑,那么最终一定是亏了不少。
让我们来看看,当时他们的网站是什么形式去获取白名单的 merkle proof 的?
1、下图是当时他们的官网,我们可以在页面上右键,点击 inspect ,如果你是中文,这个单词是检查
2、然后可以看到浏览器下图会弹出来一个铺满代码的新的窗口,点击到 Network,即网络
3、然后我们可以通过最简单的方式,直接 Ctrl + F ,搜索关键词【proof】,可以看到下面的图:
在文章上面的时候,我们介绍了网络请求,而下面你看到的这些一行行数据,每一行就是一个网络请求。
4、当你单击地址后,可以看到这个网络请求的网址是什么:
同时,如果 Request Method 写的是 GET ,说明我们是可以通过浏览器直接访问这个网址的。
5、复制 Request URL 的地址到浏览器打开:
我们可以看到,这便 Friday Beers 项目方,通过服务器后端给我们返回的 Merkle Proof。
6、为了好看一些,我们可以把浏览器这个内容全部复制到 json.cn 的网址中,让它自动格式化下,下面的 proof 的内容,便是你当时的 merkle proof 了,如果想通过合约 mint ,只需要观察白名单的 mint 函数是否需要 proof 进行传入:
当然,这里教大家一个小技巧如何确认,一般使用 merkle tree 作为白名单的项目方,都会在合约的记录中,有一个 Set Merkle Root 的动作,搜到了,一般就是说明当前合约白单使用的是 Merkle Tree,
打开 etherscan ,可以 Ctrl + F 搜索下:
有的时候,由于开发人员对命名规则的不同,你不一定能上来直接搜到 proof 相关的网络请求,那怎么去观察查找呢,这里以本周 Machina 项目为例。
1、依然是浏览器打开【右键-检查】,弹出下面的窗口,点击到 Fetch/XHR ,这个菜单的选项意思是,动态数据的网络请求,都会被过滤出来,然后按顺序从上到下,看看有没有【wl】或者【你的钱包地址】的相关关键词,如果有,一般这个网络请求,就是从服务端获取到的 proof 请求:
2、找到后,点击到 Response ,顺便点击下左下角的花括号,可以很好地格式化当前的网络请求响应数据,然后你可以找到 proofs 的内容,便是你的 Merkle proof:
有些时候,还有一种情况,获取 proof 的网络请求,会在网站开启 MINT 的时候,才会触发后端获取 proof 的真正网络请求。
比如当时的游戏苑,如果你通过上面的两种方式去查找 proof ,会发现压根找不到请求。而游戏苑就是这种场景,点击 MINT 后,才会触发后端获取 proof 的真正网络请求。
但大家可以从上图看到,实际上 MINT 的时候,按钮是置灰的,我们从前端页面是点击不了的。那么,该如何做?
还是同样的操作,我们可以利用【右键-检查】,先去点击左下方的箭头,然后在点击到项目网站的 MINT 按钮:
单击后,可以看到下面的代码变亮了:
然后可以发现,源代码中,有个 disable 的英文,我们双击一下这行代码:
删掉后,回车,你会发现,上面的 MINT 按钮变得可以点击了:
后面的操作就正常了,和上面介绍的两个项目中一样,点击后,触发真实的网络请求,得到自己的 proof 即可。
PS:这招是 @TBP 前端大佬 @梁哥 教我的,收获颇多,感谢,这里不得不在吹一波 TBP ,氛围是真的好。。各种氛围,懂的都懂~
我印象里,海盗这个项目当时 MINT 合约是没开源的,记得当时 @梁哥 直接撸了一个在线生成 proof 和 16进制的小工具打算给群友使用。
虽然海盗当时 mint 没开源,但是海盗这个生成 proof 的案例,确是一个很好的案例。
因为海盗当时的 Merkle root 原地址,是写到前端 js 代码里的,下面来教大家,如果项目从后端接口中没有返回 proof,那么前端如何查找到自己的 proof。
1、首先,如果你知道自己是白,那么,同样的操作,按照下图,点到 NetWork(网络),点击到 JS 菜单(目的是过滤出 js 相关文件),然后 Ctrl + F 直接搜素自己的白单钱包地址,
然后最关键的一步,靠耐力和经验,通过 js 的文件名,猜测哪个文件是最有可能包含真实信息的,当时我看有个叫 mintxx.js ,意思就是在 mint 时候,和浏览器发生交互的 js 文件:
2、直接单击,同样点击到Response,然后左下方的代码格式化:
3、格式化好后的代码很整齐,但由于浏览器不便于查找,你可以全选,复制:
4、开发人员一般都有 vscode 编辑器,对于非技术人员,你可以直接新建一个 word 或者 txt 文档,直接粘贴进来。
然后全局搜索自己的钱包地址:
可以看到,var sc = 后面的这一堆地址,就是要生成 Merkle tree 的源头钱包地址,对 merkle tree 原理不熟悉的同学,回顾我这篇游戏苑文章:https://mirror.xyz/yidakoumi.eth/0Lnbf4ZhFJHM3zlO--JFQr3HTktqKeHsIJlz6ln0_H8
有了全部的白名单钱包源地址和你自己的地址后,我们可以通过下面这个网站,直接生成自己的 merkle proof:
用法如下,把你拿到的所有钱包地址,全部复制到 input 框里,然后选到 Keccak-256,点击计算即可:
下面找到自己的钱包地址,便可以获取到对应的 proof 了:
如果是合约中,需要带签名的这种,对于技术小白来说就直接放弃吧,花钱使用现成的工具,或者直接求助于有代码功底的朋友。
什么样子的合约 mint 是签名类的,就像下图的 tsukimi 一样,在合约中找到对应的 mint 方法,一般都有个下面的名称:
我们也可以找到一笔成功的链上数据去看下:
如果是有编程经验的人,需要了解 web 逆向相关的知识,与其说是逆向,不如说是断点调试的功底,只要会用浏览器 debug ,打好断点,一步步找到对应的加签方法,最终还是能跑出结果的。
好了,以上就是本文的全部内容了,希望你看完后能有所收获。
关于合约 MINT 的详情,看第一篇内容比较好,我当时在测试网上部署了游戏苑的合约,有需求的小伙伴可以联系我哈!
PS:欢迎更多有才能的小伙伴共同加入 @TBP 一起在 NFT 世界航行,共创社区~