Jason chen

Posted on Mar 29, 2022Read on Mirror.xyz

如何在一级市场发行NFT系列(1):区块链合约开发

在上一篇文章中,已经为大家介绍了NFT是什么,以及为什么值钱的逻辑,那如何才能入局NFT分到一杯羹呢?方法有二:

1.在二级市场直接购买NFT

2.在一级市场发行自己的NFT

对于第一种门槛是最低的,目前最大的NFT交易市场是opensea,可以将其理解为NFT领域的淘宝或证券交易所,你只需要注册一个小狐狸钱包MetaMask登陆至opensea,即可在上面购买你认为有增值潜力的NFT,但是这其中的风险也是极其大的,一个以太币ETH目前价值约2万人民币,毕竟目前NFT领域依然存在野蛮生长不规范的情况,用动辄几万元购买的NFT可能会砸在手里,也可能会翻几十上百倍。

第二种则是等于自己做庄家,在一级市场发行NFT让别人来购买,庄家收益则来源于mint费+版税费,这是相对最安全的方式,但是门槛较高,首先一个NFT能否发行成功最重要的是运营,有大量的玩法、know how,甚至也可以看到不少NFT会和明星大V联动,从而才能达成第一篇文章中提到最重要的“共识”,这种重运营的门槛已经挡住了一大批普通玩家,其次除运营外还有技术门槛,包括区块链合约开发、NFT图片批量生成、前端官网开发三部分。

因运营非常重资源投入,本文重点会讲解技术上的实现方式,即如何能够开发出一套NFT,虽然重点讲技术,但建议非技术想入局NFT的同学尽量可以看下去,可能会有些枯燥,但通过了解技术实现才能更清晰的看清NFT本质。

刚才提到发行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少了对于白名单用户的校验。

最后是一个提款函数,用户所有支付的钱都会先到合约地址,需要合约拥有人调用该函数将钱提到自己的钱包中。

以上我带大家了解一个NFT项目合约代码是如何编写的,下篇文章会将该代码跑一遍,包括如何进行mint实操等。如有不对的地方非常欢迎指正讨论,感兴趣可添加微信交流:cj350306878,请备注姓名、公司与来意,谢谢。

往期文章:

Subscribe to Jason chen

Receive new entries directly to your inbox.

Subscribe

https://twitter.com/jasonch06170240

NFT