NFT的元数据存储

在NFT的ERC721等环境下,哪些数据应该上链呢?上链的数据结构是什么样子呢?上链的数据需不需要遵循什么规范呢?上链的数据有没有什么注意事项呢?这些问题或许都值得深思一下,尽可能去避免不规范的操作带来的负面后果。

首先我们需要知道区块链一般不直接存储大文件的,区块链主要写入对象是文本。因为区块链的存储成本会很高,而且访问性能也很差。区块链上的大文件数据一般通过链下的远端资源服务存储,远端资源服务会提供一个可以正常访问大文件的链接,区块链上写入这个可访问链接即可。

先来看看国内主流的远端资源存储服务有哪些呢?听说过OSS、IPFS、Swarm吗?

OSS,对象存储服务,是一个满足海量存储、高安全、低成本、高可靠的云存储服务。用户可以通过调用 API,在任何应用、任何时间、任何地点上传和下载数据,也可以通过用户 Web 控制台对数据进行简单的管理。OSS 适合存放任意文件类型,适合各种网站、开发企业及开发者使用。

IPFS,星际文件系统,是一个旨在实现文件的分布式存储、共享和持久化的网络传输协议。IPFS是一种内容可寻址的对等超媒体分发协议。在 IPFS 网络中的节点构成一个 分布式文件系统

Swarm,Swarm 是以太坊的去中心化和分布式的存储解决方案,与 IPFS 类似。 Swarm 是一种点对点数据共享网络,其中,文件通过其内容的哈希来寻址。Swarm可以同时从多个节点获取数据,只要单个节点承载分发数据,它就可以随处被访问。

国内的话,一般选择OSS或IPFS。

OSS的话,建议购买云服务商的OSS服务。一方面是运维少,稳定性高,安全可靠,不至于OSS服务突然宕机。另一方面是OSS基本配套有CDN服务,可以加速传输,在大文件预览方面,优势很明显。另外,涉及数据存储的,一般不建议自建,都建议使用云服务商的稳定成熟产品。

IPFS的话,也有对应的服务商,一种也是购买云服务商的产品,如:NFT.STORAGE。另一种是自建IPFS服务,自建的话,强烈建议做二级缓存,使用OSS做缓存,IPFS作为辅助服务,主要用来计算文件hash。IPFS根据文件内容寻址,可以容易比较出相同文件,在一些NFT场景中很有需求。自建的IPFS,访问肯定很慢,也没必要花费成本提高访问性能,用OSS缓存来大幅提高访问性能就足够啦。注意一点,自建的IPFS一般都是一个中心化的小IPFS。

通过链下存储方式解决了链上大文件的问题,那下面来看看,NFT的元数据应该怎么写入呢?

NFT的元数据是JSON格式的,JSON元数据信息应该遵循各个标准的Metadata部分,建议不论是721还是1155,都遵循1155的Metadata JSON Schema 65规范,必须包含name、image、description字段,再增加其他的附加描述字段等。

关于NFT元数据的image字段,有需求有条件的话,建议使用placeholder格式,让image的路径带上参数,如:"image": "https://xx.xxx.com/your-bucket/images/{id}.png",这样可以实现多个tokenId存储一个URI,而非每个tokenId存储一个URI。但是,这种需要另外实际实现 _baseURI 函数。

这样,NFT的元数据存储就大功告成啦。