2个稳定版本

1.2.4 2022年2月8日
1.2.3 2022年2月7日

#18 in #metaplex

Apache-2.0 and AGPL-3.0

290KB
6K SLoC


标题:代币元数据程序

背景

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

测试

cargo test-bpf --bpf-out-dir ../../target/deploy/

构建

cargo build-bpf --bpf-out-dir ../../target/deploy/

源代码

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

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

界面

链上Token Metadata程序是用Rust编写的,并在crates.io上作为sol_nft_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()被提供了一个max_supply:铸造权限在程序中被锁定在印刷代币中,所有铸造都在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()]

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

创建元数据账户

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

此操作创建Metadata账户。

更新元数据账户

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

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

创建主版次

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

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

通过令牌从主版次铸造新的版次

(新代币的铸造权限必须是签名者)

如果持有一个来自大师版印刷厂的金币以及一个全新的、没有任何元数据的金币,且该金币只有一枚供应量,那么可以通过调用此端点将这个金币转换成这个父级大师版版次。此端点将创建版次元数据记录,并销毁该金币。

进一步扩展

此程序被设计为可以通过更多的账户桶进行扩展。

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

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

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

依赖项

~23-35MB
~579K SLoC