前言
为OpenSea等平台提供资产元数据可以为数字资产提供丰富的数据并轻松地在应用程序中显示它们。给定智能合约上的数字资产通常仅由唯一标识符(例如,ERC721 中的 token_id
表示,因此元数据允许这些资产具有其他属性,例如名称、描述和图像。
实现令牌URI
为了让 OpenSea 为 ERC721 和 ERC1155 资产提取链下元数据,您的合约需要返回一个 URI,我们可以在其中找到元数据。为了找到这个URI,我们使用ERC721中的方法和ERC1155中的方法。首先,让我们仔细看看Creature 合约中的方法。
/**
* @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,例如https://opensea-creatures-api.herokuapp.com/api/creature/3。查询时,此 URL 应反过来返回一个 JSON 数据块,其中包含您的令牌的元数据。
元数据结构
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": [ ... ],
}
image | 这是项目图像的 URL。可以是几乎任何类型的图像(包括 SVG,OpenSea 将缓存到 PNG),并且可以是IPFS URL 或路径。我们建议使用 350 x 350 的图像。 |
---|---|
image_data | 原始 SVG 图像数据,如果您想动态生成图像(不推荐)。仅当您不包含参数时才使用它。 |
external_url | 这是显示在 OpenSea 上资产图像下方的 URL,允许用户离开 OpenSea 并在您的站点上查看该项目。 |
description | 项目描述。 |
name | 项目的名称。 |
attributes | 这些是项目的属性,将显示在项目的 OpenSea 页面上。 |
background_color | OpenSea 上项目的背景颜色。必须是不带前置 # 的六字符十六进制。 |
animation_url | 项目多媒体附件的 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
}
]
}
日期特征
OpenSea 还支持. 这种类型的特征将出现在“排名”和“统计”附近的右栏中。传入一个 unix 时间戳(秒)作为值.
{
"display_type": "date",
"trait_type": "birthday",
"value": 1546360800
}
IPFS 和 Arweave URI
OpenSea 支持将 NFT 元数据存储在分散的文件网络中,因此它们不能被中央方修改。
如果您使用IPFS来托管元数据,则您的URL应采用ipfs://<hash>
. 例如ipfs://QmTy8w65yBXgyfG2ZBg5TrfB2hPjrDQH3RCQFJGkARStJb
。
Arweave的等价物是. 例如ar://<hash>
。
ar://<hash>ar://jK9sR4OrYvODj7PD3czIAyNJalub0-vdV_JAg1NqQ-o