
IPFS NFT
- 资料简介
- 学员评分
使用 IPFS 存储 NFT 数据的最佳实践
IPFS 非常适合存储和寻址 NFT 或不可替代令牌的数据。本指南是关于如何在 IPFS 上存储 NFT 的数据,以便 NFT 创建者和所有者拥有经得起时间考验的出色体验。
由于 NFT 在创建后无法轻易更改,因此最好考虑一下 NFT 的数据如何存储、寻址以及如何随着时间的推移保持持久性。这就是为什么我们将讨论如何准备 NFT 元数据的细节,我们还将研究指向 IPFS 内容的不同类型的链接以及何时应该使用每个链接。最后,我们将了解为什么为数据的持久性制定计划对于良好的用户体验很重要。通过遵循这些建议,您可以帮助确保您的 NFT 数据有一个长期健康的未来。
本指南面向构建 NFT 平台和其他工具的开发人员,重点介绍如何格式化数据并链接到数据以获得最佳的长期结果。如果您正在寻找有关智能合约交互以及代币铸造如何工作的详细信息,请转到我们的使用 IPFS 铸造 NFT的指南,我们将使用以太坊测试网络从端到端了解整个过程。
如果您有兴趣深入了解 NFT 最佳实践和一般 NFT 开发的世界,请前往NFT 学校 (打开新窗口)用于概念指南、教程和操作方法。
IPFS 链接的类型以及何时使用它们
有几种不同的方式来引用 IPFS 上的数据,每种方式最适合不同的用例。
客户识别号
CID 唯一标识一段内容。CID 可以以紧凑的二进制形式通过网络存储和发送,但在向用户显示时,它们表示为看似随机的字符串。下面是一个例子:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
IPFS 使用两个版本的 CID。上面的示例是版本 1 CID(或 CIDv1),它比旧的“版本 0”格式有一些优势,尤其是在使用 IPFS 网关在 Web 上查看 IPFS 内容时。最好在 base32 编码中使用版本 1 CID 来寻址 NFT 数据。
要在使用 IPFS 命令行时启用 CIDv1,请--cid-version=1在运行ipfs add命令时添加标志:
ipfs add --cid-version=1 ~/no-time-to-explain.jpeg
added bafkreigg4a4z7o5m5pwzcfyphodsbbdp5sdiu5bwibdw5wvq5t24qswula no-time-to-explain.jpeg
在 JavaScript 中,您可以为该ipfs.add方法使用以下选项:
const cid = await ipfs.add({ content }, {
cidVersion: 1,
hashAlg: 'sha2-256'
})
如果您的内容已经有版本 0 CID,则无需再次将其添加到 IPFS 以获得新的 CID 格式!您可以使用ipfs 命令行或在网络上的cid.ipfs.io将 v0 CID 转换为 v1 (打开新窗口). 如果您不确定自己使用的是哪个版本,则很容易区分。版本 0 CID 的长度始终为 46 个字符,以Qm.
小费
您可以在我们的内容寻址指南中了解有关 CID 的更多信息,或者按照ProtoSchool 上的交互式教程进行操作 (打开新窗口).
将数据添加到 IPFS 并获得 CID 后,您就可以准备令牌的元数据并在区块链上“铸造”令牌。要从智能合约或 NFT 元数据中链接到您的内容,您应该将 CIDv1 转换为 IPFS URI,如下所述。
IPFS URI
统一资源标识符或 URI 用于指定给定上下文中的特定内容。上下文由 URI 方案确定(作为前缀附加到 URI,后跟://)。IPFS 的 URI 方案很简单ipfs。
这是完整 IPFS URI 的示例:
ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
IPFS URI 是 IPFS 链接的规范表示,因为该ipfs方案明确表示 CID 指的是 IPFS 上的内容而不是其他系统。要生成 IPFS URI,只需在 CID 字符串前加上静态字符串ipfs://
。
您还可以在 IPFS URI 的路径组件中包含文件名。例如,如果您已将令牌的元数据存储在包装在目录中的 IPFS 上,则您的 URI 可能是:ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json
我们建议使用 IPFS URI 将您的智能合约链接到使用 IPFS 存储的任何外部数据,包括描述和上下文化令牌的任何元数据。
IPFS URI 也是从令牌内元数据链接到存储在 IPFS 上的图像和其他资产的推荐方式。有关更多详细信息,请参阅下面的元数据建议。
HTTP 网关 URL
HTTP 网关为无法本地解析 IPFS URI 的旧用户代理提供互操作性。
下面是一个例子: https://dweb.link/ipfs/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
具有内置 IPFS 支持的用户代理(通过 IPFS Companion 浏览器扩展,或通过本机支持,例如由 Brave 提供)将能够识别网关链接并使用本机 IPFS 协议解析内容。其他用户代理将简单地跟随网关的链接,网关将通过 IPFS 加载内容并使用 HTTP 为其提供服务。您可以在我们关于 IPFS 网关的概念文章中了解有关 HTTP 网关的更多详细信息。
网关链接非常适合互操作性,但它们不应成为 IPFS 上数据的主要或规范链接。虽然只要 IPFS 上的任何人拥有数据,IPFS URI 就将保持可访问,但如果网关运营商离线,网关链接可能会失败。
在使用网关链接的地方,开发人员应确保网关遵循正确的 URL 约定。以下任一 URL 结构都是可接受的:
https://<gateway-host>.tld/ipfs/<cid>/path/to/subresource
https://<cidv1b32>.ipfs.<gateway-host>.tld/path/to/subresource
在面向用户的应用程序中,开发人员应该通过以下两种方式链接到 IPFS 内容:
IPFS URI也是从令牌内元数据链接到存储在 IPFS 上的图像和其他资产的推荐方式。有关更多详细信息,请参阅下面的元数据建议。
HTTP 网关 URL
这将提供最佳的用户体验,直到更多浏览器支持 IPFS URI 方案的本机分辨率。请注意,两种网关链接都可以根据需要轻松地从 CID 或 IPFS URI 生成。
元数据
大多数 NFT 将需要某种结构化元数据来描述令牌的基本属性。可以使用许多编码和数据格式,但事实上的标准是将元数据存储为 JSON 对象,编码为 UTF-8 字节字符串。
以下是 NFT 的一些 JSON 元数据示例:
{
"name": "No time to explain!",
"description": "I said there was no time to explain, and I stand by that.",
"image": "ipfs://bafybeict2kq6gt4ikgulypt7h7nwj4hmfi2kevrqvnx2osibfulyy5x3hu/no-time-to-explain.jpeg"
}
为 NFT 构建元数据的方法有很多种,很多细节取决于 NFT 平台的特定用例。上面的例子使用了ERC-721 中定义的模式 (打开新窗口)标准。
一般来说,采用或扩展现有标准,如ERC-721 中定义的模式 (打开新窗口)和ERC-1155 (打开新窗口)是个好主意,因为您可以使用标准钱包和其他工具(如区块浏览器)查看您的 NFT。
要链接到图像、视频和其他媒体,只需使用IPFS URI。这比存储 HTTP 网关 URL 更好,因为它不绑定到特定的网关提供程序。如果您想使用网关 URL 来方便或互操作,您始终可以在应用程序的表示层中生成它们。
小费
在元数据中使用 IPFS URI 链接到图像和其他媒体有助于保持 NFT 数据的完整性!IPFS 链接在创建后不能被篡改或更改以指向不同的数据。
即使您今天没有使用 IPFS 存储数据,为您的媒体生成 IPFS URI 并将其包含在您的元数据中也将允许任何人在从其他来源下载数据后验证数据的完整性。如果您(或其他任何人)稍后将数据添加到 IPFS,URI 将开始工作!
因为您需要知道要在元数据中引用的图像和其他媒体的 CID,所以在将媒体资产添加到 IPFS 之后创建元数据是最简单的。
使用 IPFS 目录保留文件名
将数据添加到 IPFS 时,您可以通过将文件包装在目录中来保留人类可读的文件名。
在javascript中,您可以wrapWithDirectory在调用时设置选项ipfs.add:
const cid = await ipfs.add(
{ path: 'metadata.json', content: aJsonString },
{ wrapWithDirectory: true }
)
添加包装在目录中的文件时,ipfs.add返回目录对象的 CID。要为文件构建完整的 IPFS URI,您可以/在 CID 后添加一个字符,后跟文件名。例如:ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json。
持久性和可用性
当您的数据存储在 IPFS 上时,用户可以从任何具有副本的 IPFS 节点获取它,这可以提高数据传输的效率并减少任何单个服务器上的负载。当每个用户获取一段数据时,他们会保留一个本地副本,以帮助以后可能请求它的其他用户。但是,重要的是要记住,这些副本是临时的,最终会被删除,除非用户决定“固定”数据。固定 CID 告诉 IPFS,数据很重要,当节点接近其磁盘空间限制时不应删除。
如果您正在构建一个使用 IPFS 进行存储的平台,那么将您的数据固定到强大且高度可用的 IPFS 节点非常重要,这意味着它们可以在没有大量停机时间和良好性能的情况下运行。请参阅我们的服务器基础架构文档以了解IPFS 集群如何 (打开新窗口)可以帮助您管理自己的 IPFS 节点云,这些节点协调固定您平台的数据并将其提供给您的用户。
或者,您可以将基础设施责任委托给远程固定服务。像Pinata这样的远程固定服务 (打开新窗口)和永恒 (打开新窗口)为您的 IPFS 数据提供冗余、高度可用的存储,而无需任何供应商锁定。由于基于 IPFS 的内容由 CID 而非位置寻址,因此您可以随着平台的增长在固定服务之间切换或无缝迁移到您的私有基础设施。
您还可以使用Protocol Labs的服务 (打开新窗口)称为nft.storage (打开新窗口)将您的数据放入 IPFS,并由去中心化的Filecoin支持长期持久性 (打开新窗口)存储网络。为了帮助促进 NFT 生态系统的发展并保护NFT 所代表的文化文物的新数字公共资源,nft.storage (打开新窗口)为公共 NFT 数据提供免费存储和带宽。在https://nft.storage注册一个免费帐户 (打开新窗口)试试看!
要了解有关持久性和固定的更多信息,包括如何使用远程固定服务,请参阅我们对持久性、永久性和固定的概述。
有关与 NFT 数据存储的远程固定服务集成的示例应用程序,请参阅我们的使用 IPFS 铸造 NFT的指南。
概括
IPFS 允许 NFT 以经得起时间考验的安全、可验证和分布式的方式表示任何大小和格式的数据。
以下是我们建议的快速回顾:
使用 IPFS URI 作为 IPFS 上数据链接的规范形式,例如: ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json
HTTP 网关 URL 应该在您的应用程序的表示层中生成,以便为使用本机不支持 IPFS 的浏览器的用户提供良好的体验。如果可能,请在应用程序的用户界面中同时提供 IPFS URI 和网关 URL。
在 NFT 的元数据中,使用 IPFS URI 链接到图像和其他媒体资产。该ipfs://方案可以清楚如何获得数据,以及CID确保数据的完整性。
建议在添加到 IPFS 时将文件包装在目录中,因为它会保留文件名并使 IPFS URI 更易于阅读。
数据持久性应该是平台设计的一部分。运行您自己的 IPFS 基础设施或使用远程固定服务将使您的数据保持在线并可访问。