赶在2021过去之前,记录下今年一个有趣的尝试。
在今年6,7月份开始听闻NFT,一种数字货币与艺术品结合的个性化token,当时看不明白,也没引起足够的重视,但随着市场的发展,特别是opensea交易的繁荣,越发觉得这个东西很有趣。到10月份时候在老朋友鼓动下,尝试了自己编写一个NFT项目DEMO。制作过程涉及的区块链编程的知识比较多,时间有限,这不是一份教程,只是记录一些关于制作这个DEMO期间零碎的要点,记录一份自娱自乐和回忆:
DEMO建立在Rinkeby Net上,是以太坊的测试链,选取的是一套圣斗士题材的NFT(因为小时候就有收集圣斗士的爱好,这里作品资源仅作为测试使用,另外以太的主网很贵,就选择发布在测试链了),先上个做好的WEB:DEMO地址
NFT项目实际上是一份基于以太坊的智能合约,这种合约标准是ERC 721, 以前基于主链发币的合约标准是 ERC 20,后者是同质化的,前者是非同质化的货币,也就是NFT的字面意思,它在货币的基础上,增加了一个metaData属性,将艺术作品与数字货币结合。
关于这两个标准,相关文档可以看:ERC 721 文档 和 ERC 20 文档
openzepplin是一个合约的标准库,里面集成了大量的标准合约,:openzepplin的github仓库
制作这个DEMO的过程,大致可以分为三个阶段: 编写合约,发布合约,制作网站进行合约交互:
由于这些年都在使用Python,所以选择了一个python的框架 eth-brownie,brownie框架可以编写,编译和部署合约:
关于eth-brownie的安装和调试文档:brownie文档
具体使用可以参考这个项目说明,项目地址, 直接使用是不行的,由于编译器,语言,合约规范等迭代的变迁,但可以作为熟悉下brownie的一些操作;
注意:这里python程序与以太坊交互是需要一个访问以太网的网关的,可以再https://infura.io/注册一个,小量使用是免费的。(后面从web上与合约交互,借助metaMask即可)
框架调试好后,就可以开始编写合约了,这里涉及到了合约语言,我选择了solidity,
中文文档:文档地址
合约的编写过程,我参考了几份当时热门项目的合约,Doodle,mekaVerse这些,并把编译器升级到了当时最新的0.8.9版本;
Doodle项目合约:合约地址
MekaVerse项目合约:合约地址
这些好的项目代码给我很多启发:如何管理一个项目,开关的设定,资源地址的设置,费用的收取与分成方式,铸造的规则限制等等,值得细读;
编写的过程中遇到了许多问题,主要是由于solidity语言在不断的迭代中,编译器版本,合约版本,语言的变化,兼容导致的,记录几个印象比较深刻的:
1:相比0.6版本的编译器,0.8版本以后没有了_setTokenURI方法,这是一个将token与艺术品资源绑定的重要步骤:
理清楚:tokenURI(), setBaseURI(), _baseURI()的关系后,重新实现了0.6版本中的'_setTokenURI()';
如果有重写tokenURI的需求,可以参考ERC721URIStorage.sol里的几个函数方法;
2:安装编译器的方法:
比如当你需要一个低版本或高版本的编译器:
>>> from brownie.project.compiler import install_solc >>> install_solc("0.5.10")
3:合约编写的代码质量,直接关系到此后发布,mint,管理项目时的gas成本;(以太坊是一台巨大的状态机,任何改变状态机状态的动作,都要收取燃料费)
编写好后,就可以借助brownie命令把合约编译和发布了,查询发布到rinkeby测试网的合约,可以这个网址:地址
最后一步就是设计web与合约进行交互,web的制作与传统web一样,主要就是交互部分,这里用到了web3.js
js与合约的交互,和python brownie与合约的交互是类似的,函数接口,语言写法略有不同,参考文档即可:
web3.js中文文档:文档地址
web与合约的交互,你需要使用到metaMask钱包,去官网下载安装即可:安装地址
交互前记得连接合约地址,配置好合约的ABI接口(js就可以使用合约函数了);
关于python的全局代理设置方法,这只是连接方法,剩下要科学处理:(包括本文提及到的许多页面的访问都需要进行科学处理)
socks.set_default_proxy(socks.SOCKS5, '127.0.0.1', 10808) socket.socket = socks.socksockets
获取测试网的ETH代币:(如果是真的就好了)
免费领取地址 (备注:不常能成功,有时要多试几天)
最后,放上项目的demo地址(仅供学习娱乐):DEMO地址
mint之后就可以在testnets.opensea.io 上浏览到你mint的nft了,以下截图这是我的钱包里的 ❥(^_-):
觉得有趣的可以获取测试币尝试一下mint(记得把MetaMask钱包切换到rinkeby网络),看看能不能收藏到自己喜欢的 ^_^