2个稳定版本
1.2.4 | 2022年2月8日 |
---|---|
1.2.3 | 2022年2月7日 |
#18 in #metaplex
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_metadata和docs.rs提供。
该软件包提供了四个指令,create_metadata_accounts()
、update_metadata_account()
、create_master_edition()
、mint_new_edition_from_master_edition_via_token(),
以方便地为程序创建指令。
运营概述
这是一个非常简单的程序,旨在允许对特定的铸币进行元数据标记,并具有可以更改未来元数据的更新权限。可选地,元数据的所有者可以选择将此元数据标记为主版,然后使用此主版来标记子铸币为主版的“限量版”。元数据的所有者无需参与过程的每一步,因为任何持有主版铸币令牌的人都可以将其铸币标记为限量版,无需所有者的参与或签名,这允许主版印刷品的销售和分发。
主版运营流程
在深入架构之前,将主版次的流程以故事的形式展现出来会有所帮助,因为这使其更容易理解。
- 用户使用
create_metadata_accounts()
创建他们代币的新元数据,这会创建新的Metadata
- 用户希望他们的代币是主版次,并确保代币供应量中只有一个是必需的。
- 用户请求程序将他们的元数据上的
create_master_edition()
指定,这将创建一个新的MasterEdition
,在这个例子中我们将说这是一个无限供应。作为函数的参数之一,用户必须创建一个名为印刷代币的新代币,他们拥有代币铸造权限,并将其告诉合约并存储在MasterEdition
上。 - 用户从印刷代币中铸造代币并将其赠送给朋友。
- 他们的朋友创建了一个供应量为1的新代币,并调用
mint_new_edition_from_master_edition_via_token()
,这为他们创建了新的Metadata
和Edition
记录,表示这个代币是主版次原始的版次子记录。
如果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