实操讲解:如何装饰你的ERC721非同质化资产?

栏目: Python · 发布时间: 5年前

内容简介:前面2课讲解了如何部署ERC721非同质化资产,并作为海洋商店发布在OpenSea测试网络。 本文以野狼队的队员TOKEN为例,讲解如何配置图形/文字特有的ERC721非同质化资产。 通过本文学习,你可以了解: (1)如何安装python; (2)如何通过python部署Http服务,用于提供meta信息; (3)通过REMIX发布ERC721到Rinkeby测试网络; (4)发布资产到OpenSea商店;在上一篇Creature的合约地址:

1、摘要

前面2课讲解了如何部署ERC721非同质化资产,并作为海洋商店发布在OpenSea测试网络。 本文以野狼队的队员TOKEN为例,讲解如何配置图形/文字特有的ERC721非同质化资产。 通过本文学习,你可以了解: (1)如何安装python; (2)如何通过 python 部署Http服务,用于提供meta信息; (3)通过REMIX发布ERC721到Rinkeby测试网络; (4)发布资产到OpenSea商店;

2、内容

2.1 ERC721资产的metadata说明

在上一篇 《如何创建自己的ERC721非同质化资产生物商店?》 文章中,我们描述了发布ERC721后,如何在OpenSea环境创建店铺的方法。

Creature的合约地址: 0x5c1188ac19ce51cd5d2dcd10ff5c749417da42d1

不过这些店铺商品(ERC721资产)对应的LOGO和属性还是OpenSea默认的,并不是我们野狼队期望的LOGO资产。我们最好能够通过配置修改为我们支持的资产,我们就在OpenSea上修改资产配置吧。

要让OpenSea引入链下元数据(MetaData),这需要你的合约能返回查找元数据的位置。为此需要使用tokenURIERC721中的方法。让我们仔细看看tokenURICryptoPuff合同中的方法。

/**
   * @dev Returns an URI for a given token ID
   */
  function tokenURI(uint256 _tokenId) public view returns (string) {
    return Strings.strConcat(
        baseTokenURI(),
        Strings.uint2str(_tokenId)
    );
  }
tokenURI在ERC721资产中的功能应返回HTTP或IPFS URL,例如 https://api.cryptopuff.io/api/creature/3 。查询时,此URL应依次返回你的通证(token)对应的metadata元数据的JSON数据块。作为在自有服务器上托管meta的替代方案,您可以使用 Abacus协议

自动将元数据与您的TOKEN ID相关联。 【备注2019.01.30:请测试和跟Abacus CTO确认,他们网站已不提供metaDATA调用服务,还得自己搭建服务器了。】

OpenSea支持根据官方 ERC721元数据 标准构建的元数据。此外也还支持其他几个属性,以便更丰富地显示您的资产信息,也支持OpenSea市场上的所有 排序 和过滤功能。

以下是其中一个OpenSea生物的元数据示例:

{
  "description": "Friendly OpenSea Creature that enjoys long swims in the ocean.", 
  "external_url": "https://openseacreatures.io/3", 
  "image": "https://storage.googleapis.com/opensea-prod.appspot.com/puffs/3.png", 
  "name": "Dave Starbelly",
  "attributes": [ ... ], 
}

以下是每个属性的工作原理:

实操讲解:如何装饰你的ERC721非同质化资产?

属性

为了让您的商品更具吸引力,我们还允许您为元数据添加自定义“属性”,这些属性将显示在每个资产的下方。例如,以下是 其中一个OpenSea生物

的属性。

实操讲解:如何装饰你的ERC721非同质化资产?

要生成这些属性,元数据中包含以下属性数组:

...
{
"attributes": [
    {
      "trait_type": "base", 
      "value": "starfish"
    }, 
    {
      "trait_type": "eyes", 
      "value": "big"
    }, 
    {
      "trait_type": "mouth", 
      "value": "surprised"
    }, 
    {
      "trait_type": "level", 
      "value": 5
    }, 
    {
      "trait_type": "stamina", 
      "value": 1.4
    }, 
    {
      "trait_type": "personality", 
      "value": "sad"
    }, 
    {
      "display_type": "boost_number", 
      "trait_type": "aqua_power", 
      "value": 40
    }, 
    {
      "display_type": "boost_percentage", 
      "trait_type": "stamina_increase", 
      "value": 10
    }, 
    {
      "display_type": "number", 
      "trait_type": "generation", 
      "value": 2
    }
  ]
}

这trait_type是特征的名称,是特征value的值,display_type是一个表示您希望如何显示特征的字段。对于string特质,你不必担心display_type。

对于数字特征,OpenSea目前支持三种不同的选项number(下图中右下方),boost_percentage(下图中左下方),boost_number(类似于boost_percentage但未显示百分号),以及ranking(右下图) )。默认值位于下图中的右上角。

最后,max_value是特征可能值的可选最大值。它默认为OpenSea迄今为止在合同资产上看到的最大值。

如果您不想拥有trait_type特定特征,则可以在特征中仅包含一个值,并将其设置为通用属性。例如,

{
    "value": "happy"
  }],
}

实操讲解:如何装饰你的ERC721非同质化资产?

属性指南

在提出您的属性时,有几个重要的注意事项!您应该将字符串属性包含为字符串(记住引号),将数字属性包含为浮点数或整数,以便OpenSea可以适当地显示它们。您还应该使用下划线大小写(例如,max_power)这些属性在OpenSea上显示为人类可读的字符串。

2.2 部署PYTHON的HTTP服务器用于输出metaDATA信息

2.2.1 安装PYTHON

辉哥登录到 12.124.104.209 测试服务器,上传工程文件到以下目录: /home/wwwroot/workspace/blocktest/opensea-creatures

(1)切换到NPM V8.11.4 ,安装Python3

nvm use v8.11.4 或者重新安装NPM V8.11.4版本。

(2) 完成python3的安装

参考 《【实践】如何在Ubuntu系统安装python3.6》

完成python3的安装。

2.2.2 安装配套软件

sudo apt install python3-pip

pip3 install flask 【成功输出结果】

[root@iZ23prr3ucfZ metadata-api]# pip3 install flask
Collecting flask
  Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB)
    100% |?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..| 92kB 271kB/s 
Collecting Werkzeug>=0.14 (from flask)
  Downloading https://files.pythonhosted.org/packages/20/c4/12e3e56473e52375aa29c4764e70d1b8f3efa6682bef8d0aae04fe335243/Werkzeug-0.14.1-py2.py3-none-any.whl (322kB)
    100% |?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..| 327kB 548kB/s 
Collecting click>=5.1 (from flask)
  Downloading https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl (81kB)
    100% |?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..| 81kB 5.4MB/s 
Collecting Jinja2>=2.10 (from flask)
  Downloading https://files.pythonhosted.org/packages/7f/ff/ae64bacdfc95f27a016a7bed8e8686763ba4d277a78ca76f32659220a731/Jinja2-2.10-py2.py3-none-any.whl (126kB)
    100% |?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..| 133kB 561kB/s 
Collecting itsdangerous>=0.24 (from flask)
  Downloading https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl
Collecting MarkupSafe>=0.23 (from Jinja2>=2.10->flask)
  Downloading https://files.pythonhosted.org/packages/08/04/f2191b50fb7f0712f03f064b71d8b4605190f2178ba02e975a87f7b89a0d/MarkupSafe-1.1.0-cp36-cp36m-manylinux1_x86_64.whl
Installing collected packages: Werkzeug, click, MarkupSafe, Jinja2, itsdangerous, flask
Successfully installed Jinja2-2.10 MarkupSafe-1.1.0 Werkzeug-0.14.1 click-7.0 flask-1.0.2 itsdangerous-1.1.0
You are using pip version 9.0.1, however version 19.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

pip3 install Pillow

【成功结果输出】

[root@iZ23prr3ucfZ metadata-api]# pip3 install Pillow
Collecting Pillow
  Downloading https://files.pythonhosted.org/packages/85/5e/e91792f198bbc5a0d7d3055ad552bc4062942d27eaf75c3e2783cf64eae5/Pillow-5.4.1-cp36-cp36m-manylinux1_x86_64.whl (2.0MB)
    100% |?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..?..| 2.0MB 245kB/s 
Installing collected packages: Pillow
Successfully installed Pillow-5.4.1
You are using pip version 9.0.1, however version 19.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

原来的APP.py还要安装以下插件,辉哥考虑到国内用户无GOOGLE相关服务,评估了相关代码。以下插件也就不要安装了。

pip3 install protobuf pip3 install --upgrade google.cloud pip3 install google-cloud-pubsub pip3 install --upgrade google-cloud-storage

2.2.3 运行PYTHON HTTP服务

python3 app.py

【成功输出结果】

* Detected change in '/home/wwwroot/workspace/blocktest/opensea-creatures/metadata-api/app.py', reloading
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 786-196-151
^C[root@iZ23prr3ucfZ metadata-api]# python3 app.py
 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 786-196-151

【常见问题1】python flask无法通过浏览器访问公网ip 用PYTHON3部署的HTTP服务,第一次只能本地访问,输出关键信息如下

  • Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

如果要更改IP为外部IP,修改app.py的代码为如下: app.run(host='0.0.0.0',port=5000,debug=True, use_reloader=True)

只要用户开启服务的情况下,就可以外部IP访问了: http://112.124.104.209:5000/api/creature/3 如果无法访问,应该是辉哥关闭该HTTP服务了。

【常见问题2】云服务器 ECS Linux SSH 客户端断开后保持进程继续运行配置方法 使用 nohup 执行可保持允许运行。 nohup 的作用顾名思义,它使得后面的命令不会响应挂断(SIGHUP)信号。也就是说,通过远程登录执行 nohup 后,即使退出登录后,程序还是会正常执行。通常情况下,nohup 命令最后会跟上 & 字符,表示将这个命令放至后台执行,这样才能真正做到将这个命令放至后台持续的执行。

nohup python3 app.py &

在命令头尾分别加上 nohup 和 &,变为nohup python3 app.py &,可以看到 nohup 输出了一行信息,再按一下回车键就跳回了 shell 命令行,此时命令已经在后台执行了,nohup 将命令的输出重定向至当前目录的 nohup.out 文件中。同时注意到 nohup 会将对应程序的 PID 输出,PID 可用于需要中断进程时 kill 进程。

[root@iZ23prr3ucfZ metadata-api]# nohup  python3 app.py &
[1] 28202
[root@iZ23prr3ucfZ metadata-api]# nohup: ignoring input and appending output to `nohup.out'

可以查看到28202进程在退出后还存在。

[root@iZ23prr3ucfZ metadata-api]#  ps -ef|grep python3 
root     28202 14798  0 20:24 pts/0    00:00:00 python3 app.py
root     28204 28202  1 20:24 pts/0    00:00:02 /usr/bin/python3 app.py
root     29415 14798  0 20:28 pts/0    00:00:00 grep python3
2.3 装饰ERC721非同质化资产

2.3.1 修改智能合约的metaDATA的服务器URI地址

文件名称: Creature.sol:

contract Creature is TradeableERC721Token { constructor(address _proxyRegistryAddress) TradeableERC721Token("Wild Wolf Team", "WOLF", _proxyRegistryAddress) public { }
function baseTokenURI() public view returns (string) {
  /*  return "https://opensea-creatures-api.herokuapp.com/api/creature/";*/
  return "http://112.124.104.209:5000/api/creature/";
  }
}
2.3.2 部署合约

参考 《第三十三课 如何创建自己的ERC721非同质化资产生物商店?》 完成合约部署。 获得智能合约的地址:0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73 点击mintTo函数,发布5个 ERC721 TOKEN。

实操讲解:如何装饰你的ERC721非同质化资产?

2.3.3 创建商店

点击进入 https://rinkeby.opensea.io/get-listed/step-two 网址,输入该ERC721的智能合约地址:0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73 就可以发布野狼队队徽商铺了。 可点击查看:


以上所述就是小编给大家介绍的《实操讲解:如何装饰你的ERC721非同质化资产?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

The Master Switch

The Master Switch

Tim Wu / Knopf / 2010-11-2 / USD 27.95

In this age of an open Internet, it is easy to forget that every American information industry, beginning with the telephone, has eventually been taken captive by some ruthless monopoly or cartel. Wit......一起来看看 《The Master Switch》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具