2022 年 1 月 5 日, Flow NFT 仓库合并了 metadata 的新标准,本次 metadata 标准是由 Versus 与 Find 创始人Bjarte S. Karlsen 和 DapperLabs 工程师 Joshua Hannan 共同在 Flip-Fest 活动中完成,经过了将近三个月的讨论和完善,最终合并至 Flow 官方的 NFT 标准库中,本文将从代码的细节介绍 MetadataView 相关的标准细节。
写在前面
-
本次标准升级是非强制升级的,不会影响 NonFungibleToken 合约,也不会影响原有部署的合约的业务逻辑
-
已经部署在主网的合约需要升级才能应用新的 Metadata 标准
-
升级所覆盖的资源会影响到 Collection 继承的类型,也会影响 NFT 资源
-
Metadata 标准定义了一套灵活的接口实现,可以支持任意类型或自定义的 Metadata 格式
-
支持一个 NFT 拥有多种 Metadata 类型,并提供统一的读取方式
-
Metadata 标准是用一个全新的合约来定义,想要实现标准的合约需要在 NonFungibleToken 之外引入新的名为 MetadataViews 的新合约。
MetadataViews 合约详解
MetadataViews 又两个接口定义和四个推荐的 Metadata struct 组成(后续可能还会增补):
Interface
-
Resolver —— 由 NFT 资源继承
-
ResolverCollection —— 由存储 NFT 集合继承
Struct
-
Display
-
File
-
HTTPFile
-
IPFSFile
■ MetadataViews.Resolver
// A Resolver provides access to a set of metadata views.
//
// A struct or resource (e.g. an NFT) can implement this interface
// to provide access to the views that it supports.
//
pub resource interface Resolver {
pub fun getViews(): [Type] // getViews 返回 NFT 所支持的不同类型的 metadata 数据
pub fun resolveView(_ view: Type): AnyStruct? // 根据具体的 View 类型获取到 NFT 所实现的 Struct
}
Resolver 需要由 NFT 或 NFT 的数据结构继承,并实现其中定义的两个函数
■ MetadataViews.ResolverCollection
-
getViews —— 返回数组形式的 View 类型,也是 NFT 所支持的不同类型的 metadata 数据
-
resolveView —— 根据具体的类型,获得 NFT 的 struct数据
// ExampleNFT // 1. 比原有的实现增加了 MetadataViews.Resolver 接口,并实现了其定义的两个函数 pub resource NFT: NonFungibleToken.INFT, MetadataViews.Resolver { pub let id: UInt64 // 2. 为实现 MetadataViews.Display 所添加的属性,如果需要实现其他类型的 metadata 需要添加相应的字段 pub let name: String pub let description: