🦊原文: IPFS & Blockchain Networks
🦊写在前面:原文档还讲述了 NFT 相关的内容,但本博客仅关注 IPFS 链接的类型。
IPFS 链接的类型以及何时使用它们
IPFS 是一种为了使网络更加分布式、高效和持久而设计的协议和对等网络。在 IPFS 中,有几种不同的方式来引用数据,每种方式都各有其适用的场景。
1 CID (Content Identifier)
CID 用于唯一标识 IPFS 网络中的一个内容片段。CID 可以以紧凑的二进制形式在网络上存储和传输,但当它们显示给用户时,它们被表示为看似随机的字符串。例如:
bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
个人理解:CID 以二进制的形式存储,在供人们使用时转换为字符串形式,以增加可读性。
IPFS 使用两种版本的 CID 。上面的例子是 CIDv1
版本,相较于较老的 CIDv0
版本有一些优势,特别是在通过 IPFS 网关在网页上查看 IPFS 内容时。在标识 NFT 数据时,使用 base32 编码的 CIDv1
最为合适。
要在使用 IPFS 命令行时启用 CIDv1
,请在运行 ipfs add
命令时添加 --cid-version=1
标志:
$ ipfs add --cid-version=1 ~/no-time-to-explain.jpeg
added bafkreigg4a4z7o5m5pwzcfyphodsbbdp5sdiu5bwibdw5wvq5t24qswula no-time-to-explain.jpeg
说明:在本文中,以 $ 开头的是命令,不以 $ 开头的是执行结果。
在 JavaScript 中,你可以为 ipfs.add
方法使用以下选项:
js
const cid = await ipfs.add({ content }, {
cidVersion: 1,
hashAlg: 'sha2-256'
})
其中,content 是数据内容,cidVersion 指定 CID 的版本,hashAlg 指定哈希函数的类型为
sha2-256
,cid 用于存放生成的 CID 。
如果你已经有了一个 CIDv0
版本的 CID,同时又想获取新版本的 CID 格式,那么你不需要再次将其添加数据内容到 IPFS 中!你可以使用 ipfs 命令行工具,或者在 cid.ipfs.io 网页 上将 CIDv0
版本转换为 CIDv1
版本。如果你不知道自己拥有的是哪个版本的 CID,那么可以以这种方式来区分它们:CIDv0
的 CID 总是 46 个字符长,且以 Qm
开头。
NFT 相关:一旦你将数据添加到 IPFS 并获得了 CID,你就可以准备你的代币元数据,并在区块链上 "铸造" 代币了。为了从智能合约或 NFT 的元数据内部链接到你的数据内容,你应该将自己的
CIDv1
转换为 IPFS URI,具体方法如下。
2 IPFS URI
统一资源标识符(URI)用于在给定上下文中指定特定的内容。上下文由 URI 方案确定,URI 方案是指附加到 URI 前的字符串,后面跟着 ://
。IPFS 的 URI 方案就是简单的 ipfs
。
以下是一个完整 IPFS URI 的示例:
ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
IPFS URI 是 IPFS 链接的规范表示,因为 ipfs
方案清楚地表明 CID 指的是 IPFS 上的内容,而不是其他系统。要生成一个 IPFS URI,只需将静态字符串 ipfs://
与 CID 字符串相结合。
你还可以在 IPFS URI 的路径组件中包含文件名。例如,如果您将您的代币元数据存储在 IPFS 上的一个目录中,您的 URI 可能如下所示:
ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json
个人理解:代币元数据是
metadata.json
,存储在baf...m
目录中。
我们建议你在智能合约中使用 IPFS URI 来链接任何通过 IPFS 存储的外部数据,这包括用于描述和提供代币背景信息的元数据。此外,你也可以在代币的元数据中使用 IPFS URI 来引用存储在 IPFS 上的图像和其他资源。
3 HTTP Gateway URL
内置了 IPFS 功能的用户代理,能够识别并使用原生 IPFS 协议来解析网关链接中的内容。
对于不支持原生 IPFS 解析的传统用户代理,它们将遵循链接到网关,由网关通过 IPFS 加载内容,并通过 HTTP 协议提供给用户。因此,HTTP 网关为自己无法解析 IPFS URI 的传统用户代理提供了互操作性。
如下是一个 HTTP 网关 URL 示例:
https://dweb.link/ipfs/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
虽然网关链接极大地促进了不同系统之间的互操作性,但它们不应当被视为指向 IPFS 上数据的首选或标准链接。IPFS URI 只要在 IPFS 网络中有人保存相应的数据,就会一直保持可用。相比之下,网关链接可能会因为网关服务器的离线而失效。
在使用网关链接的地方,开发者应确保网关遵循正确的 URL 约定。以下 URL 结构都是可以接受的:
https://<gateway-host>.tld/ipfs/<cid>/path/to/subresource
https://<cidv1b32>.ipfs.<gateway-host>.tld/path/to/subresource
在面向用户的应用程序中,开发人员应通过以下方式链接到 IPFS 内容:
- IPFS URI(An IPFS URI)
- HTTP 网关 URL(An HTTP gateway URL)
这将提供最佳的用户体验,直到更多浏览器支持 IPFS URI 方案的本机解析。请注意,这两种网关链接都可以根据需要轻松地从 CID 或 IPFS URI 生成。
个人理解:根据 CID 生成 IPFS URI 很容易,根据 IPFS URI 生成 HTTP 网关 URL 也很容易。