1 个不稳定版本

0.0.1 2021年8月14日

#29 in #edition

Download history 128/week @ 2024-03-11 131/week @ 2024-03-18 108/week @ 2024-03-25 142/week @ 2024-04-01 97/week @ 2024-04-08 122/week @ 2024-04-15 109/week @ 2024-04-22 113/week @ 2024-04-29 99/week @ 2024-05-06 114/week @ 2024-05-13 115/week @ 2024-05-20 106/week @ 2024-05-27 91/week @ 2024-06-03 72/week @ 2024-06-10 95/week @ 2024-06-17 94/week @ 2024-06-24

363 每月下载量
2 crate 使用

Apache-2.0

235KB
5K SLoC


标题:Token Metadata 程序

背景

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

源代码

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

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

界面

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

该框架提供四个指令,create_metadata_account()update_metadata_account()create_master_edition()mint_new_edition_from_master_edition_via_token(),以方便为程序创建指令。

操作概述

这是一个非常简单的程序,旨在允许将元数据标记到特定的铸造,并有一个可以更改该元数据的管理权限。可选地,元数据的所有者可以选择将此元数据标记为主版,然后使用此主版来标记子铸造为主版的后继“限量版”。元数据的所有者不需要参与流程的每一步,因为任何持有主版铸造令牌的人都可以将其铸造标记为限量版,而无需所有者参与或签名,这允许主版印刷品的销售和分发。

主版操作流程

在深入架构之前,用故事的形式说明主版的流程是有用的,因为它更容易理解。

  1. 用户使用create_metadata_account()为新铸造创建新的元数据,这将创建新的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()]

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

create_metadata_account

(铸币授权必须是签署者)

此操作创建Metadata账户。

update_metadata_account

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

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

create_master_edition

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

这只能调用一次,并且只有在铸币的供应为1时才能调用。它将创建一个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()]

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

依赖关系

~17–26MB
~442K SLoC