发行NFT需要完成三部分:
1.区块链合约开发:NFT运行在区块链网络上,所以需要开发一套可让NFT在区块链从产生到交易的代码。
2.NFT图片批量生成:大家可以看到几乎所有NFT项目都有成千上万个,这些NFT的图片都是由代码脚本批量生成的,生成过程中会随机调整某些图片素材的稀有度从而才会产生价格差异。
3.前端官网:发行NFT的过程就是让用户去mint,即产生一个区块存储用户和该NFT的信息,这个区块的产生用户需要缴纳mint费和gas费,mint费即项目方的纯收入。
如果你是第一次接触NFT,以上有大量的术语如mint、gas等可能难以理解,没关系后续我会逐个讲到,你也可以先自行百度了解。
本文不会详细解释编码过程,否则会非常冗长,仅会结构性的串讲整个过程,通过本系列你可以了解一个NFT是如何被开发出来的。
所以本系列将会先从区块链合约开发讲起,区块链具体的原理本文不再赘述,后续将会推出单独的系列讲解,一言以概之即:区块链是不可篡改、可追溯的一个分布式数据存储方式。区块链开发则具体指对数据进行处理的智能合约开发,智能合约是一套运行在区块链网络的代码,它的特性是合约代码被部署后将会按照预设逻辑永久执行下去,区块链网络目前非常多,主流的有比特币、以太坊等,我们则使用以太坊进行开发。
开发语言与工具:
1.solidity:以太坊使用的开发语言是solidity,语法和js比较像,如果有 前端开发经验的同学会相对好上手,https://docs.soliditylang.org/是solidity是官方手册。
2.remix:remix是一款在线的以太坊solidity开发IDE。
首先打开remix,可以看到IDE左侧分为代码编写区、编译区和部署区,在编写区会默认创建contracts文件夹,.sol结尾的即合约代码文件。
大部分NFT项目的合约代码都会开源,所以我们可以先参考别人的代码尝试去读懂,我们以最近比较火的doodles为例,在opensea打开其中一个NFT,在Details中点击Contract Address,这串编码是智能合约的合约地址。
点击后进入合约详情,再点击Contract,即可查看该合约的代码,在Code按钮旁可看到Read Contract和Write Contract,这两个分别用来做合约接口查询与合约接口写入,即合约中所有的查询和写入接口都会被暴露出来,当然你可以控制其可写可读的权限。
你会看到下方有13个代码文件,除第一个Doodles.sol外其他的都属于固定导入的包,可以先不用管,仅先将Doodles.sol内的代码复制,并回到remix,将contracts文件夹里自动生成的文件删除,并新建一个文件将其命名为NFT,然后再将刚才复制的代码粘贴进去。
点击右键,点击complie后即可进行编译,你会发现突然多出来了好多文件,那是因为在该合约中引用了很多第三方的包,所以会自动导入。
下图就是引入的包文件,可看到第一个是ERC721,这是NFT遵循的协议,建议有空将这三个包文件的代码都读一遍理解透,因时间关系本文不进行赘述。
编译后如果出现一个绿色的对勾,则说明编译成功。
接下来要进行部署,切换到部署窗口后,左侧自上到下分别是:
1.部署环境:可以选择在本地部署、测试网部署和正式网部署,区块链所有的写入操作包括部署都是要gas费的,每次折人民币几百到上千不等,所以你可以先在本地或者测试网进行部署测试,没问题后再发到正式网。
2.部署账号:先去注册一个小狐狸钱包,你会拥有一个自己的钱包账号,部署时需要使用钱包账号从而才能确定你是该合约的拥有人,在本地部署时会给你一堆测试账号,每个账号默认有100ETH。
3.缴纳gas费限制:限制该合约最多缴纳的gas费。
4.传入要支付的ETH数量:我们会用到一个全局参数msg.value,该参数在前端传入,payable函数接收到后就可以调出小狐狸让你支付对应的ETH。
5.部署的合约:具体要部署哪个合约,在这里我们点击选择NFT合约。
6.开始部署:点击按钮,开始执行部署。
7.已经部署的合约地址:如果你之前已经部署过合约,可以将其地址之间粘贴过来,避免重复部署,注意区块链的合约只能部署一次,区块链是没有迭代这个说法的,如果你发现你的合约代码有bug是无法升级的,再次部署并不会覆盖上一次的线上合约,而是会新开一个。
点击Deploy后可以看到右下侧出现了绿色的对勾,说明部署成功,余额少了,则是缴纳了gas费,左下侧则多出来了部署成功的合约,我是在本地进行测试部署,如果是在测试网或者正式网,点击部署后会调起小狐狸钱包要求你先支付gas费。
打开左下角部署成功的合约,可以看到有很多操作项,这些都是合约接口,黄色的意味着是写入,蓝色的则是读取,所有的写入都是需要支付gas费的,读取则不需要,你可以在这里直接对你的合约进行诸如设置白名单、开启mint等写入操作,以及查询mint数量等读取操作。
接下来让我们快速通读一遍代码模块,了解代码都做了些什么,因时间有限我不会每一行都解释。
打开代码自上而下,可以看到首先是参数变量定义,包括mint状态、价格等,你会看到_allowList的定义有些特殊上mapping,这是solidity特有的一个变量类型,有点类似数组指针。
下面有三个函数,分别是设置白名单是否开始mint,比如你决定今晚6点开始预售,于是在5点59分输入true,当然你也可以更高级些使用时间戳实现到点自动开启。
然后是写入白名单函数,你需要将所有白名单地址写入一个大数组中并输入,函数使用for循环遍历数组将白名单地址和可mint数量写入。
最后是设置白名单可mint数,如你限制每人最多mint10个,则可以在这里设置。
接下来到了重要的mint函数,可以看到这个函数多了一个paypal修饰符,表示调用该函数时需要用户支付费用,首先是一大堆require校验,包括校验是否开始预售、用户购买数量是否超过限额、用户是否在白名单中等,都校验通过后则使用for循环去执行mint操作,如我购买5个,则循环执行5次。
下方分别是一个转移NFT的函数,from是当前持有者地址,to是接收者地址,tokenid则是要转移的NFT编号。
然后是设置NFT对应URI地址,这个我会在后面讲解批量生成NFT图片中讲到,这里先略过。
最后是一个不需要支付mint费用的接口,估计应该是留给管理员来免费mint一批的。
以下分别是一个设置正式发售状态的接口,等到白名单预售结束后进入正式发售,你可以在这里开启。
然后是一个正式mint函数,相比于刚才的白名单mint少了对于白名单用户的校验。
最后是一个提款函数,用户所有支付的钱都会先到合约地址,需要合约拥有人调用该函数将钱提到自己的钱包中。