天天看點

Opensea中繼資料标準:怎樣從智能合約中提取數字資産并顯示的?

作者:李留白
如何将豐富的中繼資料添加到您的 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伺服器的例子。

Opensea中繼資料标準:怎樣從智能合約中提取數字資産并顯示的?

請參閱下面有關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]的屬性。

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 是 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
    }           
Opensea中繼資料标準:怎樣從智能合約中提取數字資産并顯示的?

如果你不想為一個特定的特征有一個trait_type,你可以在特征中隻包含一個值,它将被設定為一個通用屬性。比如說。

{
    "value": "Happy"
  }           
Opensea中繼資料标準:怎樣從智能合約中提取數字資産并顯示的?

我們也支援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]。

Opensea中繼資料标準:怎樣從智能合約中提取數字資産并顯示的?

引用連結

[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/

繼續閱讀