NFT 智能合约中的元数据(Metadata)

简介: 如何在智能合约中添加和存储元数据(Metadata)?

如何在智能合约中添加和存储元数据(Metadata)?

元数据(Metadata)是所有 NFT 合约的重要组成部分,每个代币都有数据可供 OpenSea 等市场检索并用于显示 NFT 的内容,因此智能合约元数据(Metadata)是一个需要了解的重要信息。

那么如何存储它,甚至将它存储在哪里?以及如何在 NFT 中实现元数据存储(Metadata)?

什么是元数据(Metadata)文件?

NFT 合约的元数据(Metadata)文件是存储在区块链之外某处的 JSON 文件。通过一些技巧,可以在链上执行此操作,也可以在 IPFS 上执行此操作,或者在自己构建的服务器上执行,可以考虑使用 CDN。

这些文件可能以它们存储的令牌数据命名 tokenId。像 OpenSea,它们的内容如下:

{
  "description": "Friendly OpenSea Creature that enjoys long swims in the ocean.", 
  "image": "https://storage.googleapis.com/opensea-prod.appspot.com/puffs/9.png", 
  "name": "Dave Starbelly",
  "attributes": [
    {
      "trait_type": "Base", 
      "value": "Starfish"
    }, 
    {
      "trait_type": "Eyes", 
      "value": "Big"
    }
  ], 
}

如下述代码所示有描述、图像链接、名称和一些可选属性。这是一种相当简单的 JSON 格式,可以在此处了解有关元数据标准的更多信息。接下来看看如何将这些数据从 IPFS 或 CDN 应用到智能合约中。

ERC721 TokenURI 和 BaseURI

ERC721 是需要在智能合约中实施才能被称为 NFT 的标准。它实现了 IERC721,即 ERC721 标准的接口。它的功能不多,但即便如此,大多数收藏品都从OpenZeppelin导入智能合约,避免重复造轮子。

OpenZeppelin 的 ERC721 合约有一些不错的额外功能和一些可选扩展。但基础 ERC721 智能合约有两个值得注意的功能,即存储元数据、tokenURI 以及 _baseURI 。

_baseURI 整个 tokenURI 的基础。例如,如果有 10k 个令牌的集合,可能已将元数据保存在 CDN 或 IPFS 上的文件夹中。这意味着每个令牌的整个 URI 都是完全相同的,除了最后一部分,通常是 tokenId 。

因此,如果 _baseURI 是 ipfs://your_folder_hash/,并且特定令牌的 tokenId 是 1234,那么完整的 tokenURI 将是 ipfs://your_folder_hash/1234。

但是,需要自己实际实现 _baseURI 函数。如果它什么都不返回,则 tokenURI 函数将返回一个空字符串。

string private _baseUri;
function setBaseURI(string calldata baseUri) external onlyOwner() {
    _baseUri = baseUri;
}
function _baseURI() internal view override returns (string memory) {
    return _baseUri;
}

在智能合约中,添加一个包含 _baseURI 的字符串类型变量(公共或私有)。可以通过从任何地方调用 setBaseURI() 来设置这个变量。当有人调用 tokenURI() 时,智能合约会检索它,因为这会自动将 tokenId 附加到 OpenZeppelin 的 ERC721 智能合约中的 baseURI。

ERC721URIStorage

它的一个扩展是 ERC721URIStorage,它允许为每个令牌设置不同的 tokenURI。如果为可能在 IPFS 或 CDN 中不共享同一文件夹的 1/1 艺术品创建智能合约,这可能会很有用,增加了以下功能。

  • tokenURI(tokenId)
  • _setTokenURI(tokenId, _tokenURI)

铸造时,调用 _setTokenURI() 为该新令牌设置 tokenURI,它还为这个新功能覆盖了 tokenURI 函数。

总结

元数据(Metadata)是 NFT 的重要组成部分。它存储图像和其他基本数据,文章介绍了如何使用 OpenZeppelins ERC721 合约和 ERC721URIStorage 的小扩展来实现它。


相关文章
|
存储 Docker 容器
Docker安装默认存储路径修改与镜像恢复
Docker安装默认存储路径修改与镜像恢复
734 0
|
监控 Java 索引
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
vue3使用vue-clipboard3复制到剪切板
vue3使用vue-clipboard3复制到剪切板
3728 0
|
11月前
|
JavaScript 前端开发 vr&ar
JSAR 粒子系统实战:打造炫酷 3D 烟花秀
本文介绍如何使用 JSAR 与 Babylon.js 打造 3D 烟花粒子系统。无需 Unity,前端开发者可借助熟悉的技术栈,在 Rokid AR 眼镜上实现沉浸式空间应用,涵盖粒子系统原理、性能优化及跨平台开发实践。
540 3
|
自然语言处理 搜索推荐 小程序
博物馆导览系统:提升观众参观效率与满意度
在这个快节奏时代,博物馆面临挑战与机遇。传统导览方式难以满足个性化、互动性和沉浸式学习需求。本文深入解析博物馆智能导览系统,包括精准定位导航、展品解说和AR技术应用,提升观众参观效率与满意度。
1130 5
|
运维 安全 网络安全
.NET HttpWebRequest(请求被中止: 未能创建 SSL/TLS 安全通道)和(基础连接已经关闭: 发送时发生错误)问题查找解决
.NET HttpWebRequest(请求被中止: 未能创建 SSL/TLS 安全通道)和(基础连接已经关闭: 发送时发生错误)问题查找解决
2166 0
.NET HttpWebRequest(请求被中止: 未能创建 SSL/TLS 安全通道)和(基础连接已经关闭: 发送时发生错误)问题查找解决
|
API
【threejs教程】让你的场景更加真实:灯光对物体的影响
【8月更文挑战第6天】threejs教程:让你的场景更加真实,灯光对物体的影响
1115 6
【threejs教程】让你的场景更加真实:灯光对物体的影响
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之报错:org.apache.flink.table.api.validationexception如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
1629 1
|
IDE JavaScript 前端开发
Remix IDE 使用与 VSCode 搭建 Solidity 开发环境
Remix IDE 使用与 VSCode 搭建 Solidity 开发环境
3955 0
FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频
这篇博客主要介绍了如何使用FFmpeg进行多线程RTSP推流和ffplay拉流操作,以及如何将视频流保存为多路AVI格式的视频文件。
2030 0

热门文章

最新文章