zoukankan      html  css  js  c++  java
  • 记录一个圣斗士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网络),看看能不能收藏到自己喜欢的 ^_^

  • 相关阅读:
    加入创业公司有什么利弊
    Find Minimum in Rotated Sorted Array II
    Search in Rotated Sorted Array II
    Search in Rotated Sorted Array
    Find Minimum in Rotated Sorted Array
    Remove Duplicates from Sorted Array
    Spiral Matrix
    Spiral Matrix II
    Symmetric Tree
    Rotate Image
  • 原文地址:https://www.cnblogs.com/sslin/p/15748266.html
Copyright © 2011-2022 走看看