如何将豐富的中繼資料添加到您的 ERC721 或 ERC1155 NFT[1]
提供資産中繼資料(asset metadata)允許像OpenSea這樣的應用程式為數字資産提取豐富的資料,并在應用程式中輕松顯示它們。特定智能合約上的數字資産通常僅由唯一的辨別符(例如ERC721中的token_id)表示,是以中繼資料允許這些資産具有額外的屬性,如名稱、描述和圖像。
實作token URI
為了讓OpenSea為ERC721和ERC1155資産提取鍊外中繼資料,您的合約需要傳回一個 URI,我們可以在其中找到中繼資料。為了找到這個URI,我們使用ERC721的tokenURI方法和ERC1155的uri方法。首先,讓我們仔細看一下Creature合同中的tokenURI方法。
NFT.sol:
/**
* @dev Returns an URI for a given token ID
*/
function tokenURI(uint256 _tokenId) public view returns (string) {
return Strings.strConcat(
baseTokenURI(),
Strings.uint2str(_tokenId)
);
}
你的ERC721中的tokenURI函數或ERC1155合約中的uri函數應該傳回一個HTTP或IPFS URL。當被查詢時,這個URL應該反過來傳回一個包含你的令牌中繼資料的JSON blob資料。你可以在OpenSea creatures repo[2]中看到一個用于提供中繼資料的簡單的Python伺服器的例子。
請參閱下面有關IPFS 和 Arweave的部分,了解如何處理去中心化中繼資料 URI。
中繼資料結構
OpenSea支援根據官方ERC721中繼資料标準[3]或Enjin中繼資料建議結構的中繼資料[4]。
此外,我們還支援其他幾個允許多媒體附件的屬性——包括音頻、視訊和 3D 模型——以及您的項目的互動式特征,為您提供 OpenSea 市場上的所有排序和過濾功能。
下面是一個OpenSea creatures 的中繼資料的例子。
{
"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": [ ... ],
}
以下是每個屬性的工作方式。
字段簡介image這是項目圖像的 URL。可以是幾乎任何類型的圖檔(包括SVG,它将被OpenSea緩存為PNG),可以是IPFS [5]URLs或路徑。我們建議使用350 x 350的圖檔。image_data原始的SVG圖檔資料,如果你想動态生成圖像(不推薦)。隻有在你不包括image參數的情況下才使用這個。external_url這是在OpenSea上出現在資産圖檔下面的URL,允許使用者離開OpenSea,在你的網站上檢視該項目。description項目的可讀描述。支援Markdown。name項目的名稱。attributes這些是項目的屬性,它們将顯示在項目的OpenSea頁面上。(見下文)background_color項目在OpenSea上的背景顔色。必須是一個不帶前置#的六位數的十六進制。animation_url一個指向項目的多媒體附件的URL。支援GLTF、GLB、WEBM、MP4、M4V、OGV和OGG等檔案擴充名,以及純音頻擴充名MP3、WAV和OGA。Animation_url也支援HTML頁面,允許你使用JavaScript畫布、WebGL等建立豐富的體驗和互動的NFTs。現在支援HTML頁面内的腳本和相對路徑。然而,不支援對浏覽器擴充的通路。youtube_url一個指向YouTube視訊的URL。
屬性
為了讓你的項目更有吸引力,我們還允許你為你的中繼資料添加自定義的 "屬性",這些屬性将顯示在你的每個資産下面。例如,這裡是OpenSea其中一個creatures[6]的屬性。
為了生成這些屬性,在中繼資料中包含了以下的屬性數組。
...
{
"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 是 trait 的名稱,value 是 trait 的值,而 display_type 是一個字段,訓示您希望它如何顯示。對于字元串特征,您不必擔心 display_type。
數值特征
對于數字特征,OpenSea目前支援三種不同的選項:number(下圖中的右下角)、boost_percentage(上圖中的左下角)和boost_number(類似于boost_percentage,但不顯示百分比符号)。如果你傳入的值是一個數字,而你沒有設定display_type,那麼該特性将出現在排名部分(上圖中的右上方)。
添加一個可選的max_value,為數字特征的可能值設定一個上限。它的預設值是OpenSea迄今為止在你的合同上看到的資産的最大值。如果你設定了max_value,請確定不要傳入一個更高的值。
日期特質
OpenSea也支援一個日期顯示類型。這種類型的特征将出現在右欄的 "排名 "和 "統計 "附近。傳入一個unix的時間戳(秒)作為值。
{
"display_type": "date",
"trait_type": "birthday",
"value": 1546360800
}
如果你不想為一個特定的特征有一個trait_type,你可以在特征中隻包含一個值,它将被設定為一個通用屬性。比如說。
{
"value": "Happy"
}
我們也支援Enjin Metadata風格。
{
"properties": {
"base": "starfish",
"rich_property": {
"name": "eyes",
"value": "big",
"display_value": "Big",
}
...
}
}
屬性指南
當你想出你的屬性時,有幾個重要的注意事項! 你應該把字元串屬性寫成字元串(記住引号),把數字屬性寫成浮點數或整數,這樣OpenSea就可以适當地顯示它們。字元串屬性應該是人類可讀的字元串。
部署你的中繼資料API
我們歡迎你以你認為合适的方式部署你的中繼資料API:你可以把它托管在IPFS、雲存儲或你自己的伺服器上。為了讓你開始,我們在Python和NodeJS中都建立了一個API伺服器樣本。
- • Python 示例 API 伺服器[7]
- • NodeJS 示例 API 伺服器[8]
我們将很快建立一個關于建構和部署中繼資料伺服器到Heroku的教程。同時,請檢視Heroku關于這個主題的資源[9]。
PFS and Arweave URIs
OpenSea支援在分散的檔案網絡中存儲NFT中繼資料,這樣它們就不能被中心方所修改。
如果你使用 IPFS[10] 來托管你的中繼資料, 你的 應該是這樣的格式: ipfs://<hash>。例如, ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb. 如果你打算在IPFS上存儲,我們推薦 Pinata[11] 來輕松存儲資料。 這裡有一個Chainlink提供的入門教程: https://blog.chain.link/build-deploy-and-sell-your-own-dynamic-nft/.
Arweave[12]的等價物是 ar://<hash>.。例如,ar://jK9sR4OrYvODj7PD3czIAyNJalub0-vdV_JAg1NqQ-o.
當機中繼資料
你可以通過從智能合約中發出這個事件,向OpenSea表明一個NFT的中繼資料不再能被任何人改變(換句話說,它被 "當機")。
event PermanentURI(string _value, uint256 indexed _id);
如果你想把整個智能合約标記為當機,請聯系我們[13]。
引用連結
[1] 如何将豐富的中繼資料添加到您的 ERC721 或 ERC1155 NFT: https://docs.opensea.io/edit/metadata-standards
[2] OpenSea creatures repo: https://github.com/ProjectOpenSea/opensea-creatures/tree/master/metadata-api
[3] 官方ERC721中繼資料标準: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
[4] Enjin中繼資料建議結構的中繼資料: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md#erc-1155-metadata-uri-json-schema
[5] IPFS : https://github.com/ipfs/is-ipfs
[6] OpenSea其中一個creatures: https://testnets.opensea.io/assets/0x7dca125b1e805dc88814aed7ccc810f677d3e1db/25
[7] Python 示例 API 伺服器: https://github.com/ProjectOpenSea/metadata-api-python
[8] NodeJS 示例 API 伺服器: https://github.com/ProjectOpenSea/metadata-api-nodejs
[9] Heroku關于這個主題的資源: https://devcenter.heroku.com/articles/git
[10] IPFS: https://ipfs.io/
[11] Pinata: https://pinata.cloud/
[12] Arweave: https://www.arweave.org/
[13] 請聯系我們: http://openseahelp.zendesk.com/