本文介绍了 Solana 上为 SPL token 添加元数据的 Metaplex Token Metadata 标准。
我们已经部署并和 SPL 代币 进行了交互,但是它们都没有名称、符号或任何附加的元数据。相反,我们通过其 mint account 地址来识别每个代币。 与此相对,ERC20 代币包括用于读取代币名称和符号的函数(但值得注意的是,这些只是方便人类阅读的工具,没有任何东西可以阻止不同的代币具有相同的名称或符号)。 ERC721 和 ERC1155 还包括一个 tokenURI
函数,该函数返回一个指向链下元数据的 URI。
但是正如我们目前所见,SPL mint account 没有名称、符号或 URI 字段。
Solana 上有两种主要的解决方案:
Metaplex 代币元数据标准:这是在 Solana 上向代币添加元数据最广泛使用的方法。 当你看到带有图像的 NFT 或带有名称和符号的代币(例如著名的“dog wif hat”模因币)时,它们很可能正在使用此标准。 它通过链接到你的代币的单独元数据 account 来工作。 这与 ERC-721 的工作方式相反 —— 在 ERC-721 中,代币合约指向元数据,但在 Metaplex 中,元数据 account 指向代币 mint。
此图像显示了 SPL 代币 Mint、元数据 Account 和用于添加元数据的链下 JSON 之间的关系
SPL Token-2022: 这是一个与原始 SPL 代币程序不同的程序,它包括对代币元数据和其他高级功能的内置支持。 尽管更现代,但在撰写本文时,它尚未像 Metaplex 标准那样被广泛采用。
今天我们将重点关注 Metaplex 解决方案,并在另一篇文章中介绍 Token-2022。
我们将把对 Metaplex 解决方案的介绍分为两部分:在本文中,我们将介绍 Metaplex 并讨论它如何处理 SPL 代币的元数据。 在下一篇文章中,我们将使用 Anchor 实现 SPL 代币的 Metaplex 元数据。
Metaplex 是一组构建在 Solana 上的开放标准和工具。 这些标准由 Metaplex 基金会维护,并已成为在 Solana 上创建和管理数字资产的主要方式。
实际上:
这就是它的样子:https://explorer.solana.com/address/EKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm/metadata
Metaplex 提供了几个工具,但我们现在的重点是 代币元数据程序,它允许你将元数据附加到任何 SPL 代币。
Metaplex 代币元数据程序,地址为 metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s
,用于向 SPL 代币添加额外的元数据,例如名称、符号、图像和描述。 它创建并管理 元数据 account,这些 account 存储与特定 SPL mint 相关的结构化元数据。
就像 SPL 代币程序拥有所有 mint account 和 ATA 一样,Metaplex 代币元数据程序拥有其下的所有元数据 account。 这是一个可执行和可升级的程序。
从高层次上讲,该程序允许我们:
我们将在下面的“Metaplex 代币元数据程序指令”部分中更详细地介绍这些指令。
现在让我们看看这些元数据 account 是如何构建和创建的。
Metaplex 元数据 account 是一个程序派生地址 (PDA),通过 Metaplex 代币元数据程序创建,用于将额外数据附加到 SPL 代币。 PDA 使用三个种子派生:字符串 "metadata"
、token_metadata_program_id
和 mint_account_address
。
只有 mint 地址不同;"metadata"
字符串和程序 ID 是固定的。 这确保了只能为给定的 mint account 派生一个元数据 account。
虽然元数据 account 存储关于代币的基本链上信息,但它也可以保存指向链下资源的 URI。 例如,NFT 的元数据 account 可能会在链上存储代币名称和符号,而 URI 指向一个 JSON 文件,其中包含存储在 IPFS、Arweave 或 Web 服务器上的完整描述、图像和其他属性。
下图显示了 Metaplex 代币元数据程序和元数据 account 之间的关系。
下图显示了与我们讨论元数据 account 相关的字段,如果它们还没有完全理解,请不要担心,我们稍后会解释它们。
元数据 account 存储关于 mint account 的元数据(名称、符号、图像等)。 由于元数据 account 的地址可以直接从 mint account 的地址派生,因此钱包可以轻松发现元数据 account(如果存在)。
从上图来看,每个键代表什么:
key
:这是一个 account 鉴别器(目前为 MetadataV1)。 虽然变量名 key
不是最具描述性的(更准确的名称是 version
或 discriminator
),但这是 Metaplex 在其代码库中使用的名称。 它指示当前使用的元数据结构版本,并允许钱包和工具正确解析该 account。 每个 mint 只能有一个元数据 account,因为 PDA 派生机制使用 mint 地址作为唯一没有固定值的种子。update_authority
:有权更新元数据 account 的钱包地址。 此更新权限在元数据 account 创建期间设置,并且只有此权限才能在之后修改元数据。 更新权限可以将这些权利转移到另一个地址,或者通过将权限设置为 null 来永久放弃控制,从而使元数据不可变。 每个更新操作都需要来自当前权限地址的有效签名,这可以防止对代币元数据的未授权更改。 我们将在本文后面的讨论中讲解更新和转移权限的具体说明。mint
:这指向此元数据描述的 SPL 代币 mint account。 这将元数据链接到实际的代币。data
:此字段表示 SPL 代币资产数据。 它包含以下内容:
name
:代币的名称(例如,“Circle US Dollar Stablecoin”)。 限制为 32 个字节,因此名称必须简洁。 如 此处 定义。symbol
:代币的简短标识符(例如,“USDC”)。 限制为 10 个字节,并且通常为大写。uri
:指向链下 JSON 文件的链接,该文件包含扩展元数据,类似于 ERC721 和 ERC1155 中 NFT URI 的工作方式。 此 JSON 遵循标准化格式,并包括描述、图像、动画 URL、属性等字段。 URI 的大小限制为 200 个字节。 我们将在后面更详细地介绍此 JSONseller_fee_basis_points
:这表示应用于代币二级销售的特许权使用费,以基点表示(其中 1% 等于 100 个基点)。 市场使用此信息来确定他们在销售代币时应汇给创建者的金额。 特许权使用费信息是对市场的建议,而不是强制执行的规则,这些值的允许范围是 0 到 10,000(即 0% 到 100%)。creators
:最多 5 个地址 的向量,作为代币的创建者,每个地址分配了销售费(版税)的百分比。 这些百分比的总和必须等于 100。 creators
字段的使用是对市场的建议,而不是严格的规则。data
可以包括 NFT 的可选 collection
字段。 此字段包含两条信息:一个公钥 和 一个布尔标志。 公钥是另一个 NFT 的 mint 地址,该 NFT 用作集合的标识符。 与以太坊通常基于合约的集合不同,Metaplex 使用特殊的 NFT 来表示整个集合。 此“集合 NFT”使用与常规 NFT 相同的元数据 account,但其元数据 account 包括一个额外的 collection_details
字段,该字段将其标识为集合。 布尔标志(第二条信息)由集合的更新权限设置,以验证 NFT 是否合法属于该集合。 这种链上验证系统允许钱包和市场按其集合对 NFT 进行分组和显示。primary_sale_happened
:这是一个布尔标志,用于跟踪是否发生了初始销售。 一旦设置为 true,就无法撤消。 这会影响某些市场中的版税分配,因为大多数市场仅在主要销售发生后才开始强制执行版税。is_mutable
:确定元数据是否可以在创建后更新。 如果设置为 false,则元数据将永久冻结(这意味着即使是更新权限也无法进行进一步更新)。edition_nonce
: 一个可选字段,用于 Master Editions,这是一个高级功能,允许创建 NFT 的限量版副本。 这对于理解元数据如何工作并不重要。 如果你对此功能感兴趣,可以在 Metaplex 文档 中了解更多信息。token_standard
:一个枚举,用于标识代币类型,它可以是以下任何一种:
Fungible
(标准 SPL 代币),NonFungible
(没有版本的唯一 NFT),FungibleAsset
(具有元数据的可替代代币,它可以是与 ERC1155 具有相似用例的游戏内物品)Metaplex 代币元数据程序有几个我们可以从程序或客户端调用的指令。 通过它们,我们为 SPL 代币创建和管理元数据。
这些指令是:
CreateMetadataAccountV3
:此指令为 SPL 代币 mint 创建一个新的元数据 account。 它将元数据(如名称、符号、URI 和创建者信息)附加到代币。 这是除了 mint 地址之外,赋予你的代币身份的主要方式。 这里的 V3
仅表示它是此指令的第三个版本。 只有代币的 mint 权限才能为其创建元数据,这可以防止任何人为他们不控制的代币附加未经授权的元数据。UpdateMetadataAccountV2
:此指令更新现有代币的元数据。 它可以修改字段,如名称、符号、URI、创建者、将权限转移到新地址以及其他属性,只要元数据标记为可变且更新权限签署了交易。 只有指定的更新权限才能修改元数据,此权限在首次创建元数据时设置。UpdatePrimarySaleHappenedViaToken
:此指令标记 NFT 的主要销售已经发生。 一旦设置为 true,就无法撤消。 这会影响某些市场中的版税分配,因为大多数市场仅在主要销售之后才开始强制执行版税。 只有更新权限才能调用此指令。SignMetadata
:此指令允许元数据中列出的创建者通过签署元数据来验证其身份。 当创建者签署时,他们的“已验证”状态变为 true,这有助于买家确认代币的真实性。CreateMasterEditionV3
:此指令为 NFT 创建一个 master edition account。 每个 mint 只能调用一次,并且只有当供应量恰好为 1 时才能调用。 它将常规 NFT 转换为可以生成限量版副本的 master edition。 如前所述,只有 mint 的更新权限才能调用此指令。MintNewEditionFromMasterEditionViaToken
:此指令从 master edition 创建一个新的限量版 NFT。 新版本有自己的 mint 和元数据,但链接到 master edition。SetAndVerifyCollection
:此指令将 NFT 链接到集合并在一个步骤中对其进行验证。 它需要集合的更新权限来签署交易,以确认 NFT 是集合的正式部分。VerifySizedCollectionItem
:此指令验证 NFT 是否属于 sized collection。 Sized collection 跟踪它们包含的确切项目数量,这有助于在市场中准确表示。VerifyCollection
:此指令验证 NFT 是否属于集合。 它需要集合的更新权限来签名,以确认 NFT 在集合中的成员身份。UnverifyCollection
:此指令从集合中删除 NFT 的验证状态。 它需要集合的更新权限或 NFT 的更新权限来签名。Utilize
:此指令跟踪启用了“使用”功能的 NFT 的使用情况。 这允许 NFT 在过期或更改状态之前具有有限的使用次数。ApproveUseAuthority
:此指令将使用 NFT 的权限委托给另一个地址,允许其他人使用该 NFT 指定的次数。RevokeUseAuthority
:此指令撤销先前授予的使用权限,阻止被委托人进一步使用 NFT。ApproveCollectionAuthority
:此指令将验证集合项目的权限委托给另一个地址。RevokeCollectionAuthority
:此指令撤销先前委托的集合权限。BurnNft
:此指令销毁 NFT,销毁代币及其元数据。 这是不可逆转的,并且会从流通中删除 NFT。以下指令不太常用,但仍然是 Metaplex 代币元数据程序的一部分:
CreateMetadataAccount
:CreateMetadataAccountV3
的旧版本。CreateMetadataAccountV2
:CreateMetadataAccountV3
的旧版本。UpdateMetadataAccount
:UpdateMetadataAccountV2
的旧版本。CreateMasterEdition
:CreateMasterEditionV3
的旧版本。CreateMasterEditionV2
:CreateMasterEditionV3
的旧版本。VerifySizedCollectionItem
:这验证一个项目是否为 NFT 集合的一部分。SetAndVerifySizedCollectionItem
:这在一个指令中设置并验证一个项目是否为 NFT 集合的一部分。FreezeDelegatedAccount
:冻结委托的 account。ThawDelegatedAccount
:解冻(取消冻结)先前冻结的委托 account。RemoveCreatorVerification
:从 NFT 中删除创建者的验证。PuffMetadata
:通过用空字节填充较短的字段,将元数据 account 扩展到其最大大小。 当元数据字段(如名称、符号、URI)短于其允许的最大长度时,此指令将用零填充剩余空间。 最大大小为:名称(32 字节)、符号(10 字节)和 URI(200 字节)。总结一下:Metaplex 代币元数据程序通过一个链接到 mint 的单独元数据 account,为 SPL 代币提供了一个身份,例如名称、符号和图像。 此 account 是一个 PDA,并存储结构化字段,包括指向链下 JSON 的 URI。 我们分解了每个字段的含义以及它如何影响钱包和市场处理代币的方式。 最后,我们介绍了程序提供的指令以及它们各自的作用。
在下一个教程中,我们将为 SPL 代币创建元数据。
本文是Solana 教程系列的一部分。
- 原文链接: rareskills.io/post/metap...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!