元数据标准
https://docs.opensea.io/v2.0/docs/metadata-standards
如何将丰富的元数据添加到您的 ERC721 或 ERC1155 NFT
提供资产元数据允许像 OpenSea 这样的应用程序为数字资产提取丰富的数据并轻松地在应用程序中显示它们。给定智能合约上的数字资产通常仅由唯一标识符表示(例如,ERC721 中的 ),因此元数据允许这些资产具有其他属性,例如名称、描述和图像。<span class="cm-s-neo">token_id</span>
实现令牌 URI
为了让 OpenSea 为 ERC721 和 ERC1155 资产提取链下元数据,您的合约需要返回一个 URI,我们可以在其中找到元数据。为了找到这个URI,我们使用ERC721中的方法和ERC1155中的方法。首先,让我们仔细看看Creature 合约中的方法。<span class="cm-s-neo">tokenURI</span>``<span class="cm-s-neo">uri</span>``<span class="cm-s-neo">tokenURI</span>
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 中的函数或ERC1155合约中的函数应返回 HTTP 或 IPFS URL。查询时,此 URL 应反过来返回一个 JSON 数据块,其中包含您的令牌的元数据。您可以在此处查看用于在 OpenSea 生物存储库中提供元数据的简单 Python 服务器示例。<span class="cm-s-neo">tokenURI</span>``<span class="cm-s-neo">uri</span>
请参阅下面有关IPFS 和 Arweave的部分,了解如何处理去中心化元数据 URI。
元数据结构
OpenSea 支持根据官方 ERC721 元数据标准或Enjin 元数据建议构建的元数据。
此外,我们还支持其他几个允许多媒体附件的属性(包括音频、视频和 3D 模型)以及您的项目的交互式特征,为您提供 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": [ ... ],
}
以下是每个属性的工作原理:
图片 | 这是项目图像的 URL。几乎可以是任何类型的图像(包括 SVG,OpenSea 将缓存成 PNG),并且可以是IPFS URL 或路径。我们建议使用 350 x 350 的图像。 |
---|---|
图像数据 | 原始 SVG 图像数据,如果您想动态生成图像(不推荐)。仅当您不包含参数时才使用它。image |
外部网址 | 这是显示在 OpenSea 上资产图像下方的 URL,允许用户离开 OpenSea 并在您的站点上查看该项目。 |
描述 | 项目的人类可读描述。支持降价。 |
姓名 | 项目的名称。 |
属性 | 这些是项目的属性,将显示在项目的 OpenSea 页面上。(见下文) |
背景颜色 | OpenSea 上项目的背景颜色。必须是不带前置 # 的六字符十六进制。 |
动画网址 | 项目多媒体附件的 URL。支持文件扩展名 GLTF、GLB、WEBM、MP4、M4V、OGV 和 OGG,以及仅音频扩展名 MP3、WAV 和 OGA。Animation_url 还支持 HTML 页面,允许您使用 JavaScript 画布、WebGL 等构建丰富的体验和交互式 NFT。现在支持 HTML 页面中的脚本和相对路径。但是,不支持访问浏览器扩展。 |
youtube_url | YouTube 视频的 URL。 |
属性
为了让您的项目更有活力,我们还允许您将自定义“属性”添加到您的元数据中,这些属性将显示在您的每个资产下方。例如,以下是其中一种 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 的名称,是 trait的值,并且是一个字段,指示您希望它如何显示。对于特征,您不必担心.<span class="cm-s-neo">trait_type</span>``<span class="cm-s-neo">value</span>``<span class="cm-s-neo">display_type</span>``<span class="cm-s-neo">string</span>``<span class="cm-s-neo">display_type</span>
数字特征
对于数字特征,OpenSea 目前支持三种不同的选项,(下图中的右下角)、(上图中的左下角)和(类似于但不显示百分号)。如果您传入一个数字并且您没有设置 a ,则该特征将出现在“排名”部分(上图中的右上角)。<span class="cm-s-neo">number</span>``<span class="cm-s-neo">boost_percentage</span>``<span class="cm-s-neo">boost_number</span>``<span class="cm-s-neo">boost_percentage</span>``<span class="cm-s-neo">value</span>``<span class="cm-s-neo">display_type</span>
添加一个可选项为数字特征的可能值设置一个上限。它默认为 OpenSea 迄今为止在您的合同资产上看到的最大值。如果设置 a ,请确保不要传入更高的.<span class="cm-s-neo">max_value</span>``<span class="cm-s-neo">max_value</span>``<span class="cm-s-neo">value</span>
日期特征
OpenSea 还支持. 这种类型的特征将出现在“排名”和“统计”附近的右栏中。传入一个 unix 时间戳(秒)作为值。<span class="cm-s-neo">date</span>
<span class="cm-s-neo">display_type</span>
{
"display_type": "date",
"trait_type": "birthday",
"value": 1546360800
}
如果您不想为特定 trait 设置一个值,您可以在 trait 中只包含一个值,它将被设置为通用属性。例如,<span class="cm-s-neo">trait_type</span>
{
"value": "Happy"
}
我们还支持Enjin 元数据样式:
{
"properties": {
"base": "starfish",
"rich_property": {
"name": "eyes",
"value": "big",
"display_value": "Big",
}
...
}
}
虽然我们建议不要将元数据存储在链上,但如果您认为这对您的用例很重要,请通过support@opensea.io联系我们,我们会向您提出问题和后续步骤。
属性指南
提出您的属性时的几个重要注意事项!您应该将字符串属性包含为字符串(记住引号),将数字属性包含为浮点数或整数,以便 OpenSea 可以正确显示它们。字符串属性应该是人类可读的字符串。
部署元数据 API
欢迎您部署您认为合适的元数据 API:您可以将其托管在 IPFS、云存储或您自己的服务器上。为了帮助您入门,我们在 Python 和 NodeJS 中创建了一个示例 API 服务器:
我们将很快创建一个关于构建元数据服务器并将其部署到 Heroku 的教程!同时,请查看Heroku 关于该主题的资源。
IPFS 和 Arweave URI
OpenSea 支持将 NFT 元数据存储在分散的文件网络中,因此它们不能被中央方修改。
如果您使用IPFS来托管元数据,则您的URL 应采用. 例如,。如果您打算在 IPFS 上存储,我们建议使用Pinata轻松存储数据。这是 Chainlink 的入门教程:https ://blog.chain.link/build-deploy-and-sell-your-own-dynamic-nft/ 。<span class="cm-s-neo">ipfs://<hash></span>``<span class="cm-s-neo">ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb</span>
Arweave的等价物是. 例如,。<span class="cm-s-neo">ar://<hash></span>``<span class="cm-s-neo">ar://jK9sR4OrYvODj7PD3czIAyNJalub0-vdV_JAg1NqQ-o</span>
冻结元数据
您可以通过从智能合约发出此事件来向 OpenSea 指示 NFT 的元数据不再被任何人更改(换句话说,它被“冻结”):
<span class="cm-s-neo">event PermanentURI(string _value, uint256 indexed _id);</span>
如果您想将整个智能合约标记为已冻结,请联系我们。