# NFT技术科普——Metadata篇

By [DK](https://paragraph.com/@iamdk) · 2022-05-20

---

NFT作为当前加密领域风头正盛的宠儿，成为了吸引普罗大众踏入加密圈的重要入口。NFT市场的参与人数和交易量也在不断扩大，各种新颖的应用层出不穷。但无论NFT的玩法和形式如何变化，一定都离不开一个最重要的组成部分：Metadata。

什么是Metadata
-----------

Metadata通常直译为“元数据”，本质上是NFT内容的描述数据。

通常一份Metadata长这样：

    // 从Amadeus工具中导出的Metadata 
     { 
      "name":"test #0",
      "description":"Your NFT collection!", 
      "image":"/0.png", 
      "attributes":[ 
        { "trait_type":"eye", "value":"blue" }, 
        { "trait_type":"body", "value":"thin" }, 
        { "trait_type":"arm", "value":"long" } 
      ] 
    }
    

> 注: 上面所展示的Metadata实际上是Opensea所支持的格式，是Opensea所制定的规范。如果你的项目想要在Opensea上进行展示，就一定要以这样的格式出现。 一份Metadata中包含几个关键部分：

1.  name：NFT的名称
    
2.  description：NFT的描述语句
    
3.  image：指向NFT最终展示Image的链接
    
4.  attributes：NFT所包含的特征
    

以上几个关键部分与Opensea上内容的对应关系如下图所示：

![Opensea与Metadata](https://storage.googleapis.com/papyrus_images/5efd1b7ae36bf1114c62e89eced4efaff94a44489ef1d98d32d7aec4a3588b8a.png)

Opensea与Metadata

也就是说，NFT的Metadata存储着用户在Opensea上所看到的内容。

为什么需要Metadata
-------------

我们都知道非同质化是NFT最重要的属性，就像那句“世界上没有两片相同的树叶”，而NFT的非同质化如何体现呢？仅仅是NFT的Token ID不同吗？

绝大多数NFT系列是由符合ERC-721标准或ERC-1155标准的合约所创建的，ERC-721和ERC-1155提供了Metadata的拓展选项，能让合约拥有者去诠释这份NFT资产的名称和数据内容。

而NFT的非同质化也更多的被Metadata中迥然不同的数据形式和内容所体现。

如何为NFT绑定Metadata
----------------

当我们在Opensea上查看自己最喜爱的NFT时，页面上通常展示出丰富的metadata。Opensea是如何获取这些信息的呢？

如果你曾经了解过ERC721和ERC1155标准，你就会发现，这两项标准中其实并没有对Metadata做出强制的规定。也就是说，如何将NFT与Metadata绑定实际上是一个非常自由的事情。

但显然，完全的自由不是一个逐渐走向统一规范市场的常态。

后续逐渐出现了ERC-721Metadata和ERC-1155Metadata规范，他们定义了NFT与Metadata绑定的标准方式（比如openzeppelin），后续的NFT项目在编写Metadata也有章可循。Opensea这样的Marketplace也无需苦苦思考如何适配市场海量的Metadata格式。

ERC-721Metadata和ERC-1155Metadata规范是对ERC-721和ERC-1155的一个扩展，他们总结了一套标准方法和必要的变量。例如，ERC-721Metadata定义了一个外部方法：tokenURI。该方法的具体功能是：当用户调用这一方法，给他传递要查看的token Id，就可以得到对应的Metadata。

Metadata的表现方式
-------------

上一部分中说到Opensea需要读取某个NFT项目背后智能合约的tokenURI方法(ERC-1155标准为uri方法)来获取某个NFT对应的Metadata。那么Opensea能够理解的Metadata有哪些呢?

1.  链接
    
    Opensea可以解析链接，包括HTTP/HTTPS/IPFS/AR。需要注意的是，首先链接需要通过最基本的GET请求获取内容。也就是说，将这一链接粘贴到HTTP浏览器/IPFS浏览器中可以获取到其中的内容，而不无需额外操作。
    
2.  Json文档
    
    直接返回内容，不需要Opensea做二次内容寻找。
    

上述两种方式各有优劣：

1.  对于链接的方案，优势在于可以减少链上存储的数据量，最直观的表现就是节省了部署时候的gas费用。但由于Metadata的实际内容上是由项目方的服务器所控制的，因此可以随意修改，用户权益依旧没有得到去中心化的保障。折中的解决方案就是使用IPFS链接，由于IPFS的不可修改性从而保证Metadata的不可修改。
    
2.  Json文档的方案优势在于所有的Metadata都以明文的形式写在合约中，用户可以直接读取到某个NFT的Metadata而不需要二次跳转。同时由于智能合约代码量的增加，部署价格也会略贵于链接的方案。并且对于以太坊，由于存在着代码部署大小的限制（编译产物单个文件最大不超过24.576KB），太多的明文写在合约中会占用过多空间，导致放不下更多功能。
    

总之，如果某NFT系列想要在Opensea等dapp正确读取并展示其metadata，需要遵照相应dapp的规范格式，具体细节请查看其官方文档。

### Image的表现方式

在Metadata中，name和description是对NFT的介绍信息，attributes更多的承载了检索的功能。而用户最关心的，也是最直观表现NFT的是其中的image，因此在这里特别讲解一些常见的Image表现方式。

在第一部分的Opensea Metadata格式中我们可以看到，image是其中的一个字段。和Metadata一样，也有两大类表现方式：

1.  图片链接。同样分为服务器链接和IPFS链接两种。链接所指向的内容应当是图像本身。
    
2.  图像本身：这里就涉及到了一些互联网中图像的绘制方式。可以以svg格式描述图像（Loot采用的方式），也可以用base64编码描述图像。具体的方式大家感兴趣可以自行了解一下~
    

优劣也与Metadata基本相同，这里就不再赘述。

Metadata的最佳实践
-------------

最佳实践的目标是实现一个不需要中心化服务器的NFT项目，因此Image和Metadata都选择IPFS存储。

**前期准备：**

1.  NFT集合的图像，文件名由0.png/jpg ~ n.png/jpg
    
2.  未填入image字段的metadata文档， 文件名由0~n
    
3.  已完成部署的智能合约
    
4.  注册好Pinata账户
    

**第一步：将图像上传至IPFS。** 进入Pinata，文件上传，将NFT集合的所有图像放置在一个文件夹内，进行上传。上传完毕后，你将可以在Pinata的已上传文件列表中看到刚刚上传的文件夹。将第二列CID中对应的值复制下来，待后续使用。 **第二步：为Metadata文档填入image字段。** 补全每个Metadata文档。例如对于0号Metadata文档：

    {
      "name":"test #0",
      "description":"Your NFT collection!",
      "image":"ipfs://[CID]/0.png",
      "attributes":[
        {
          "trait_type":"eye",
          "value":"blue"
        },
        {
          "trait_type":"body",
          "value":"thin"
        },
        {
          "trait_type":"arm",
          "value":"long"
        }
      ]
    }
    

将第一步中得到的CID填入上述文档中`[CID]`的位置即可。

**第三步：将Metadata文件夹上传至IPFS。**

进入Pinata，文件上传，将NFT集合的所有Metadata放置在一个文件夹内，与id一一对应，进行上传。上传完毕后，你将可以在Pinata的已上传文件列表中看到刚刚上传的Metadata文件夹。将第二列CID中对应的值复制下来，待后续使用。

**第四步：设置合约baseURI。**

在Etherscan上访问已完成部署的合约，调用setBaseURI方法，传入`"ipfs://[CID]/"`。将第三步得到的Metadata CID填入前面的`[CID]`即可。

至此，Metadata的最佳实践就完成啦，如果想要更换Collection的Metadata，可以再进行一次上述四个步骤。

总结
--

在我的视角来看，NFT就像是元宇宙中的物体，每一个物体都有自己的特点，都是不可取代的。Metadata则是这个物品的描述信息，记录着这个物品所包含的内容。Image则是物体真实的模样。 目前Opensea所支持的Metadata内容还是有限的，例如无法支持多个图片的组合和叠加等。NFT还有很大的提升与变化空间。

---

*Originally published on [DK](https://paragraph.com/@iamdk/nft-metadata)*
