有很多人听说过NFT,但是不知道如何Mint。Mint方式除了最简单的前端Mint,合约方法Mint以及16进制Mint.网上有很多文章详细地介绍了这三种方式,内容大同小异,我在这里就不重复他们的内容了。这篇文章主要是对他们内容的补充以及最新的合约Mint方式的讲解。零基础的朋友,需要先阅读下面这篇文章,本文偏技术性。
大多时候前端mint就像上面文章所提到的那样在网页上连接自己的钱包,然后点击一个Mint按钮,最后在钱包中确认即可。但是有些项目为了彰显自己的特色,Mint方式会设计的比较另类,比如下面这个网页。
当点击Mint按钮之后,就会跳转到这台计算机的界面,一开始可能比较懵,不知道下一步该干啥。仔细看一下右上角的便签,写着Mint方法,首先是在电脑上输入“connect-wallet”指令连接钱包,然后是输入"mint“指令,就可以成功Mint。
无论前端页面被设计的多么花里胡哨,就记住两个步骤:1.连接钱包 2.调用Mint方法,按照网站指示做即可。
上文讲的合约Mint是比较理想的情况,但是实际情况可能更复杂的多。比如前两天比较火的项目Debox老鹰,在白名单Mint阶段,前端页面点击Mint按钮之后一直在转圈圈,无法响应。一直卡了半个小时左右,才Mint成功,但是这也导致了很多白名单没有Mint上。
那么遇到这种情况,我们只能绕过前端,直接调用合约去mint。首先,如果已经有人mint上了,我们可以去OpenSea找到该集合,然后点击合约地址。
现在让我们回到当晚,可以在etherscan看到交易记录中,有好几条是调用了MintAllowList这个方法,我们可以找一个成功的点进去看看。
那么如下图所示,通过该方法调用是可以成功Mint到NFT的,再加上函数的命名,基本就可以确定白名单Mint方法,就是MintAllowList.
这个时候,我们就可以用上文提到的直接写合约的方式去Mint,按照下图步骤操作:
接下来就是展开MintAllowList方法,其他两个参数都好理解,但是这个proof是什么呢?
直接调用合约方法又不知道proof参数是什么意思,有些大聪明这时候肯定会说了,上面的文章不是说了还有一种16进制Mint方法吗,我们直接把成功Mint的人的数据拷贝过来就可以了嘛。但是事实是每一条成功的记录的proof都是不一样的,直接拿过来在钱包里调用是无法成功的。
首先我们先下拉到Input Data,然后点击Decode InputData
我们可以看到第一条记录的proof是这些数据
第二条数据的proof是这个样子的,二者明显不同。所以16进制这条路也给我们堵死了。
难倒我们的proof专业的叫法应该是Merkle proof,它的作用是用来检测钱包地址是否被写入了白名单中。
到这里,如果有懂技术的小伙伴,我相信一定会想起大名鼎鼎的Merkle Tree(默克尔树),这是一种高效的数据结构,大概长下面这个样子,在NFT领域广泛应用于白名单的验证,项目方只需要把默克尔树的根节点数据写入到合约中,可以大大地节省Gas(Money)。
这里简单介绍一下默克尔树验证白名单的原理,我们先来看看这棵树是如何形成的,我们可以把上图L1,L2,L3,L4看成是四个白名单地址,首先地址1和地址2 先经过hash运算(这是一种可以把任意大小的数据输出成固定长度数值的算法),他们会生成Hash 0-0 和Hash0-1,然后Hash0 的数值 = hash(Hash 0-0+Hash0-1),即父节点的Hash值是根据子节点的hash值生成的,同理Hash1的值也是根据地址3和地址4生成的最终可以得到根节点的哈希值。
所以项目方只要将根节点的数据写入合约中,当有一个钱包来mint时前端会用该钱包对应的merkle proof去验证该”叶子“是否”长“在这棵树上。
你获取的proof大概是这个样子的,['0x0d018f4e9d04e5ff56e36b0bb4b688d67076ea25c4462e258dbc6344b7d2031b','0x97fd676f3c4c0678051e7d3c8b4781c1313e2dcd3de2ffb23ce3463261721f59','0xa1344c1183827cbc918f1deb53259cdb6558effc8197449347752640f45b333e']
在填写的时候,不能有单引号,双引号,空格,逗号用英文的!
本文主要讲了在实际合约Mint过程中可能会遇到的问题,本文偏技术性,不太适用于新手,新手可以先阅读上方推荐的文章,如果有其他的问题,可以添加下方的微信,备注”撸白“进群交流或者加入Discord抽取更多白单: