ERC721非同质化资产配置Metadata及部署

ERC721非同质化资产配置Metadata及部署

## 1,摘要 前面2课讲解了如何部署ERC721非同质化资产,并作为海洋商店发布在OpenSea测试网络。 本文以野狼队的队员TOKEN为例,讲解如何配置图形/文字特有的ERC721非同质化资产。 通过本文学习,你可以了解: (1)如何安装python; (2)如何通过python部署Http服务,用于提供meta信息; (3)通过REMIX发布ERC721到Rinkeby测试网络; (4)发布资产到OpenSea商店; 辉哥系统整合出了ERC721从理论到实践的文章,可按需查看: (1) [【ERC721实践】迷恋猫从玩耍到开发](https://learnblockchain.cn/2018/05/31/684490db252c) (2) [如何创建自己的ERC721非同质化资产生物商店?](https://learnblockchain.cn/2018/12/31/57d58b1cd53a) (3) [采用TRUFFLE框架如何创建自己的ERC721非同质化资产生物商店?](https://learnblockchain.cn/2019/01/05/e1c7191b5f70) (4) [如何配置Metadata以便装饰你的ERC721非同质化资产?](https://learnblockchain.cn/2019/01/30/d5710a41a388) ## 2,内容 ### 2.1 ERC721资产的metadata说明 在《第三十三课 如何创建自己的ERC721非同质化资产生物商店?》文章中,我们描述了发布ERC721后,如何在OpenSea环境创建店铺的方法。 Creature的合约地址: [0x5c1188ac19ce51cd5d2dcd10ff5c749417da42d1](https://rinkeby.etherscan.io/address/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](https://api.cryptopuff.io/api/creature/3) 。查询时,此URL应依次返回你的通证(token)对应的metadata元数据的JSON数据块。作为在自有服务器上托管meta的替代方案,您可以使用 [Abacus协议](https://docs.abacusfi.com/tutorial) 自动将元数据与您的TOKEN ID相关联。 **【备注2019.01.30:请测试和跟Abacus CTO确认,他们网站已不提供metaDATA调用服务,还得自己搭建服务器了。】** OpenSea支持根据官方 [ERC721元数据](https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md) 标准构建的元数据。此外也还支持其他几个属性,以便更丰富地显示您的资产信息,也支持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": [ ... ], } ``` 以下是每个属性的工作原理: ![](https://img.learnblockchain.cn/2020/02/01_/439001838.png) #### 属性 为了让您的商品更具吸引力,我们还允许您为元数据添加自定义“属性”,这些属性将显示在每个资产的下方。例如,以下是 [其中一个OpenSea生物](https://rinkeby.opensea.io/assets/0x7dca125b1e805dc88814aed7ccc810f677d3e1db/25) 的属性。 ![](https://img.learnblockchain.cn/2020/02/01_/125313161.png) 要生成这些属性,元数据中包含以下属性数组: ``` ... { "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" }], } ``` ![](https://img.learnblockchain.cn/2020/02/01_/142406332.png) #### 属性指南 在提出您的属性时,有几个重要的注意事项!您应该将字符串属性包含为字符串(记住引号),将数字属性包含为浮点数或整数,以便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》](https://www.jianshu.com/p/a1c965e954f8) 完成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://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非同质化资产生物商店?](https://learnblockchain.cn/2018/12/31/57d58b1cd53a) 完成合约部署。 获得智能合约的地址:0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73 点击mintTo函数,发布5个 ERC721 TOKEN。 ![](https://img.learnblockchain.cn/2020/02/01_/129908549.png) 4.REMIX发布合约.png #### 2.3.3 创建商店 点击进入 [https://rinkeby.opensea.io/get-listed/step-two](https://rinkeby.opensea.io/get-listed/step-two) 网址,输入该ERC721的智能合约地址:0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73 就可以发布野狼队队徽商铺了。 可点击查看: > [https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/1](https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/1) > [https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/2](https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/2) > ... > [https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/6](https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/6) ![](https://img.learnblockchain.cn/2020/02/01_/609679714.png) >Duncan Wang 徽标 / *本文操作得到大明同学的指导支持,深表感谢。* / ## 3,参考 1) [OpenSea开发指南之增加metadata](https://docs.opensea.io/docs/2-adding-metadata) 2) [OPEN API接口](https://docs.opensea.io/v1.0/reference) 3) [ERC-721 metadata standards and IPFS](https://medium.com/blockchain-manchester/erc-721-metadata-standards-and-ipfs-94b01fea2a89) 4) [Walking Through the ERC721 Full Implementation](https://medium.com/blockchannel/walking-through-the-erc721-full-implementation-72ad72735f3c) 5) [【实践】如何在Ubuntu系统安装python3.6](https://www.jianshu.com/p/a1c965e954f8)

1,摘要

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

辉哥系统整合出了ERC721从理论到实践的文章,可按需查看: (1) 【ERC721实践】迷恋猫从玩耍到开发 (2) 如何创建自己的ERC721非同质化资产生物商店? (3) 采用TRUFFLE框架如何创建自己的ERC721非同质化资产生物商店? (4) 如何配置Metadata以便装饰你的ERC721非同质化资产?

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": [ ... ], 
}

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

属性

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

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

...
{
"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"
  }],
}

属性指南

在提出您的属性时,有几个重要的注意事项!您应该将字符串属性包含为字符串(记住引号),将数字属性包含为浮点数或整数,以便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。

4.REMIX发布合约.png

2.3.3 创建商店

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

https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/1 https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/2 ... https://rinkeby.opensea.io/assets/0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73/6

Duncan Wang 徽标

/ 本文操作得到大明同学的指导支持,深表感谢。 /

3,参考

1) OpenSea开发指南之增加metadata 2) OPEN API接口 3) ERC-721 metadata standards and IPFS 4) Walking Through the ERC721 Full Implementation 5) 【实践】如何在Ubuntu系统安装python3.6

  • 发表于 2019-01-30 20:01
  • 阅读 ( 3011 )
  • 学分 ( 6 )
  • 分类:以太坊

评论