實操講解:如何裝飾你的ERC721非同質化資產?
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": [ ... ], }
以下是每個屬性的工作原理:
屬性
為了讓您的商品更具吸引力,我們還允許您為元資料新增自定義“屬性”,這些屬性將顯示在每個資產的下方。例如,以下是 其中一個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]# nohuppython3 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 root28202 147980 20:24 pts/000:00:00 python3 app.py root28204 282021 20:24 pts/000:00:02 /usr/bin/python3 app.py root29415 147980 20:28 pts/000:00:00 grep python32.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。
2.3.3 建立商店
點選進入 https://rinkeby.opensea.io/get-listed/step-two 網址,輸入該ERC721的智慧合約地址:0x2f4acf4e627b4c9dbf1a967a4b23be2874032a73 就可以釋出野狼隊隊徽商鋪了。 可點選檢視: