1 个稳定版本

1.1.0 2022年2月7日

#24#edition

Apache-2.0AGPL-3.0

190KB
4K SLoC


标题:代币元数据程序

背景

Solana的编程模型以及本文档中使用的Solana术语定义可在以下位置找到:

源代码

Token Metadata Program的源代码可在github上找到。

还有一个位于github的Rust客户端示例,可以用于学习和运行(如果需要,可以使用cargo run --bin metaplex-token-metadata-test-client)。它允许测试各种场景。

界面

链上Token Metadata程序是用Rust编写的,可在crates.io上作为mpl-token-metadatadocs.rs找到。

该软件包提供四个指令,create_metadata_accounts()update_metadata_account()create_master_edition()mint_new_edition_from_master_edition_via_token(),以便轻松为程序创建指令。

操作概述

这是一个非常简单的程序,旨在允许对给定的铸币进行元数据标记,并提供一个更新权限,可以更改未来的元数据。可选地,元数据的所有者可以选择将此元数据标记为主版,然后使用此主版来标记子铸币作为此主版未来的“限量版”。元数据的所有者不需要参与每个步骤,因为任何持有主版铸币令牌的人都可以将其铸币标记为限量版,而不需要所有者的参与或签名,这允许主版印刷品的销售和分发。

主版操作流程

在深入架构之前,将主版的流程作为一个故事来阐述会有所帮助,因为它更容易理解。

  1. 用户通过 create_metadata_accounts() 创建一个用于铸造的新元数据,从而创建新的 Metadata
  2. 用户希望他们的铸造是一个主版,并确保在铸造中只有所需的一个供应量。
  3. 用户请求程序在他们的元数据上指定 create_master_edition(),这将创建一个新的 MasterEdition,在这个例子中我们将说它有一个无限的供应量。作为函数参数的一部分,用户必须创建一个新的名为“印刷铸造”的铸造,他们拥有铸造权限,并将这些信息告知合同,并由合同存储在 MasterEdition 上。
  4. 用户从印刷铸造中铸造一个代币并将其送给他们的朋友。
  5. 他们的朋友创建一个供应量为1的新铸造,并调用 mint_new_edition_from_master_edition_via_token(),这将为他们创建新的 MetadataEdition 记录,表示这个铸造是主版原始的版次子记录。

如果 create_master_edition() 被赋予一个最大供应量:铸造权限在程序中被锁定在印刷铸造中,所有铸造都立即在 create_master_edition() 中完成到用户提供的并拥有的指定账户 - 用户随后使用这个固定池作为他们未来授权令牌的来源,以防止以未经授权的方式生成新的供应量。

权限和架构

应用中有三个不同的主要结构:Metadata、MasterEditions 和 Editions。一个 Metadata 可以有零个或一个 MasterEdition,或者可以有零个或一个 Edition,但不能同时与一个 MasterEdition 和一个 Edition 关联。这意味着一个 Metadata 要么是一个主版,要么是另一个主版的版次子记录。

只有铸造上的铸造权限可以创建元数据账户。一个元数据账户持有铸造的名称、符号、uri 以及铸造id。为了确保铸造的元数据唯一性,元数据账户的地址是一个由程序推导出的地址,由种子组成

["metadata".as_bytes(), program_id.as_ref(), mint_key.as_ref()]

主版是这个PDA的扩展账户,简单地

["metadata".as_bytes(), program_id.as_ref(), mint_key.as_ref(), "edition".as_bytes()]

从这个铸造中铸造的任何有限版都有相同的地址,但结构类型不同。这两个不同的结构(Edition 和 MasterEdition)共享相同的地址是为了确保没有元数据同时具有这两个,这在当前架构中是没有意义的。

create_metadata_account

(铸造权限必须是签署者)

此操作创建 Metadata 账户。

update_metadata_account

(更新权限必须是签署者)

更新权限可以在任何时候调用此调用以更新任何元数据的URI或元数据的更新权限,以及以后的字段。

create_master_edition

(更新权限必须是签署者)

这只能调用一次,并且只有当铸造的供应量为一时。它将创建一个 MasterEdition 记录。现在其他铸造可以在有适当的授权令牌的情况下成为此 Metadata 的 Edition。

mint_new_edition_from_master_edition_via_token

(新铸造的铸造权限必须是签署者)

如果您拥有一枚来自主版印刷厂的令牌,以及一枚全新的没有Metadata的印刷厂,并且该印刷厂只有一个供应量,那么可以通过调用此端点将该印刷厂转换为主版Master EditionEdition。此端点既创建EditionMetadata记录,又销毁令牌。

进一步扩展

此程序设计为可以通过进一步扩展账户桶。

如果我们想要添加YouTube元数据,我们可以创建一个新的结构体叫做Youtube,并用种子值初始化它

["metadata".as_bytes(), program_id.as_ref(), mint_key.as_ref(), "youtube".as_bytes()]

然后只有对那些元数据感兴趣的人需要搜索它,并且其唯一性得到保证。它还可以有自己的更新操作,其模式与原始更新操作类似。

依赖项

~24–35MB
~585K SLoC