1 个不稳定版本

0.0.1 2021 年 10 月 13 日

#30 in #edition

Download history 254/week @ 2024-03-13 316/week @ 2024-03-20 366/week @ 2024-03-27 347/week @ 2024-04-03 262/week @ 2024-04-10 399/week @ 2024-04-17 297/week @ 2024-04-24 310/week @ 2024-05-01 276/week @ 2024-05-08 289/week @ 2024-05-15 271/week @ 2024-05-22 334/week @ 2024-05-29 293/week @ 2024-06-05 233/week @ 2024-06-12 280/week @ 2024-06-19 245/week @ 2024-06-26

1,106 每月下载量
9 个crate中使用 (6 个直接使用)

Apache-2.0

235KB
5K SLoC


标题:Token Metadata Program

背景

Solana 的编程模型和本文档中使用的 Solana 术语的定义可在以下网址找到:

来源

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

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

接口

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

该 crate 提供了四个指令,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() 中进行到用户提供的和拥有的指定账户 - 用户然后使用这个固定池作为他们未来授权令牌的来源,以防止以未经授权的方式生成新的供应。

权限和架构

应用中有三个不同的主要结构:元数据、主版和版本。一个元数据可以有零个或一个主版,或者可以有零个或一个版本,但不能同时有一个主版和一个版本与其相关联。这意味着一个元数据要么是一个主版,要么是另一个主版的版本(子记录)。

只有铸币的铸币权限可以创建元数据账户。元数据账户持有铸币的名称、符号和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()]

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

create_metadata_account

(铸币权限必须是签名者)

此操作创建 Metadata 账户。

update_metadata_account

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

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

create_master_edition

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

这只能调用一次,并且只有在铸币供应为一种时。它将创建一个MasterEdition记录。现在其他铸币可以成为此元数据的版本,如果它们有适当的授权令牌。

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()]

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

依赖项

~16–25MB
~425K SLoC