• 记录一个圣斗士NFT的制作流程(DEMO)


    赶在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网络),看看能不能收藏到自己喜欢的 ^_^

  • 相关阅读:
    split 使用
    python中接受上一条命令执行的结果----subprocess.check_output()
    k8s开启cadvisor http 服务
    Spring Cloud之配置中心搭建
    如何高效地学习开源项目
    Spring Boot之默认连接池配置策略
    Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: ..... this is incompatible with sql_mode=only_full_group_by
    com.netflix.zuul.exception.ZuulException: Forwarding error
    设置环境变量相关命令
    java.lang.NoClassDefFoundError: org/springframework/web/context/WebApplicationContext
  • 原文地址:https://www.cnblogs.com/sslin/p/15748266.html
Copyright © 2020-2023  润新知