可以长久保存并防止篡改,这是NFT核心价值之一。不幸的是,目前许多面向消费者的NFT由于设计上的根本性漏洞,并没有这些属性。常常看到一些NFT号称的“在区块链上永存”,但实际上经常因为成本和区块链存储能力的限制,存储的只有所有权记录和关联NFT的元数据。
很多时候,这些链接是脆弱的(https://www.vice.com/en/article/pkdj79/peoples-expensive-nfts-keep-vanishing-this-is-why),用HTTP协议将用户引向特定位置,而非该资产本身。这意味着链接指向的内容可能在以后失效或者改变,造成原资产的丢失(只剩所有权记录是无价值的)。
IPFS可以解决这个问题,使用IPFS的NFT将享有优势。但只有遵从既有规范才能较好让数据得以永久保存并可访问。随着NFT的迅速流行,现在是一个好时机,让我们重温下在IPFS上存储和链接NFT数据的最佳实践。在本文中,我们将探讨两个近期热度话题:内容寻址和数据完整性。在IPFS文档网站上,有新的章节使用IPFS存储NFT数据的最佳实践,可帮您了解更多细节。
内容寻址
IPFS内容标识符(https://docs.ipfs.io/guides/concepts/cid/)(CID)在精准标识内容方面是极其强大和灵活的,无论该内容存于何处,以何种方式存储。为了最大限度地利用这些优点,开发者在链接IPFS数据时应遵循以下建议和惯例。
链接概述
本文并非对CID的全面解释(对此,已经有极佳的资料(https://docs.ipfs.io/how-to/address-ipfs-on-web/#dweb-addressing-in-brief))。但本文旨在让读者了解以下几点:
CID
CID是自描述的,是对任意内容唯一对应的标识。
例子:bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
CID应该用在您的应用代码中,以及其他明确是在使用IPFS的场景下。
我们建议在磁盘上将CID转为IPFS URI存储,特别是在元数据或者区块链记录这种写入后不再更改的记录中。给CID加上ipfs://的URI格式,增加了上下文信息,让用户和自动化的工具更容易找到所链接的内容。
IPFS URI
统一资源标识符URI(https://en.wikipedia.org/wiki/Uniform_Resource_Identifier)用于在协议中指定某特定内容。协议是由URI格式决定的(作为前缀附加到URI上,还加上://)。IPFS的URI格式是ipfs。有时URI可以在最后附加路径。
例子:
ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
ipfs://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4
IPFS URI是指向文件或者目录的标准IPFS链接。当从智能合约链接到IPFS数据时,IPFS URI表明该数据应该通过IPFS系统获取。
当在NFT的结构化元数据中对IPFS上的图像及其他媒体资源做链接时,也应该使用IPFS URI。
HTTP Gateway URL
HTTP gateway(https://docs.ipfs.io/how-to/address-ipfs-on-web/#http-gateways)帮助无法原生解析IPFS URI的旧版浏览器进行兼容。这种链接只应在应用程序的界面中使用,而不应该存入区块链或NFT的元数据中。
例子:https://dweb.link/ipfs/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi
需注意到,HTTP gateway又将内容分发中心化,是中间人攻击的可能载体并带来潜在的单点失效—— 如果gateway运营方下线或者失联,链接将失效。而内置IPFS支持的浏览器(通过IPFS Companion(https://docs.ipfs.io/install/ipfs-companion/)浏览器扩展,或原生支持,如Brave(https://brave.com/ipfs-support/))可以避免这些问题,因为它们可以自动从此类链接中提取CID,并根据用户设置从IPFS加载数据。
不同场景中的寻址
在不同场景下,开发者应根据具体情况使用合适的链接设置方式。
链上
NFT智能合约上对一个NFT对应的资源和元数据应该使用IPFS URI。
例子:ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json
我们建议在生成NFT之前先生成IPFS URI,并将URI完整存于链上。对传入一个URI的智能合约接口,这种方式最简单。而且 ipfs:// 的URI格式让应用知晓此数据位于IPFS上。
元数据
在NFT的元数据中,应使用IPFS URI,这是在文本中链接IPFS资源最明确,且长期可靠的方式。
下面是一个链向NFT媒体资产的IPFS URI的例子:ipfs://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4。
开发者可以用公共HTTP gateway(https://docs.ipfs.io/how-to/address-ipfs-on-web/#http-gateways)来获得兼容性。
同时应该避免其他链接到内容的方式(如非IPFS HTTP gateway的URL)。普通的HTTP链接至多只能作为内容的临时镜像,因为链接的内容很容易被改变。在区块链上,数据是永久存储而无法篡改的,所以在链上使用HTTP是脆弱的,有失效风险。
相比之下,IPFS URI是永久有效的,可被安全地作为数据的规范链接。通过使用IPFS URI作为“真理之源”链接,应用程序更容易使用多种不同的存储方案,或在未来切换不同的gateway,只要生成新的gateway链接。这比起将特定gateway链接“硬编码”到区块链的永久记录中更灵活。
应用
在面向用户的应用程序中,开发者应通过以下两种方式链接IPFS内容。
1. IPFS URI
2. HTTP gateway URL
直到更多的浏览器原生支持IPFS URI。请注意,这两种链接都是容易从原始CID或IPFS URI生成的。
下面是一个HTTP gateway URL指向公共的dweb.link:
https://dweb.link/ipfs/bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4
也可以使用CID作为子域名,而不是放在URL路径里:
https://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta.ipfs.dweb.link/nft.mp4
这两个例子都对应这个标准IPFS URI:ipfs://bafybeigvafaks2bvivtv46n2z7uxszpvl25jhvzc6dbhnjjgjkbeia5jta/nft.mp4。
数据完整性
关于NFT资产的一个重要的点在于其完整性 —— 包括资产本身和所有相关数据。IPFS使用CID来保护NFT数据的完整性,确保自链接创建以来没有篡改。
开发者应遵守以下建议,让IPFS内置的数据验证功能发挥最大效用。
链接资产元数据
元数据是NFT价值构成的有机部分。因此,为保全资产的价值,在IPFS上存储资产时也应存储元数据,并确保两者都可获取。
实现该目标的首选方法如下:
1. 创建两个新目录(一个用于资产,一个用于元数据)
2. 将资产添加到其目录中
3. 将资产的目录添加到IPFS中,记录其CID
4. 在相应目录创建元数据,使用步骤3中的CID创建IPFS URI。该URI应该包含目录的CID和资产文件名
5. 将元数据的目录添加到IPFS中,记录其CID。
6. 使用步骤5中的CID为元数据创建IPFS URI,将该URI存储在链上,加入所有权记录
该流程既能让开发者将文件名加入链接中(方便用户交互),又确保元数据和资产可被独立应用。
元数据将在以下位置被访问:ipfs://{元数据目录的CID}/元数据文件名
资产可以通过以下地址访问:ipfs://{资产目录的CID}/资产文件名
下面是JSON元数据例子,包含链接到图像文件的IPFS URI:
该图片可使用IPFS URI ipfs://bafybeidfjqmasnpu6z7gvn7l6wthdcyzxh5uystkky3xvutddbapchbopi/no-time-to-explain.jpeg`访问。在界面上,您的应用可以创建一个 gateway URL 方便用户使用HTTP获取该图片,例如 https://dweb.link/ipfs/bafybeidfjqmasnpu6z7gvn7l6wthdcyzxh5uystkky3xvutddbapchbopi/no-time-to-explain.jpeg。
一旦元数据创建完成,作为JSON文件在IPFS上存储后,其CID可用来创建如ipfs://bafybeibnsoufr2renqzsh347nrx54wcubt5lgkeivez63xvivplfwhtpym/metadata.json的URI。该URI可存入智能合约中。
整个过程的实战案例,可在IPFS文档网站上如何在IPFS上发行NFT(https://docs.ipfs.io/how-to/mint-nfts-with-ipfs/#a-short-introduction-to-nfts)查看。文档使用javascript详细演示了整个过程。
高可用
使用如IPFS这样的去中心化网络来提供内容的主要原因之一是为了防范链接失效(https://en.wikipedia.org/wiki/Link_rot)。这是通过让网络中别的节点共同运营数据镜像服务来实现的。但对数据可用性有高要求的开发者不应该依赖于别的节点的利他性。为了确保链接的内容可用,开发者应该pinning(https://docs.ipfs.io/concepts/persistence/)内容的CID在自己的存储节点上,并与愿意帮忙的节点一起存储分发该内容。如果愿意的话,开发者也可以使用pinning服务(https://docs.ipfs.io/how-to/work-with-pinning-services/)来代为运营。
联系客服