1 个不稳定版本
0.0.0-alpha | 2022年2月3日 |
---|
#23 在 #metaplex
在 2 个包中使用(通过 agsol-gold-contract)
235KB
5K SLoC
标题:代币元数据程序
免责声明
这是 Metaplex 元数据程序的分支,对代码的唯一更改是提高一些 solana 和 spl 依赖项,以便能够将库编译为 wasm 目标。
背景
Solana 的编程模型和本文件中使用的 Solana 术语定义可在以下位置找到:
源代码
Token Metadata Program 的源代码可在 github 上找到
还有一个位于 github 的示例 Rust 客户端,可以浏览以学习,如果需要,可以使用 cargo run --bin metaplex-token-metadata-test-client
运行。它允许测试各种场景。
接口
链上的 Token Metadata 程序是用 Rust 编写的,并在 crates.io 上作为 metaplex-token-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()
中完成到用户提供的指定账户,用户随后使用这个固定池作为他们未来授权令牌的来源,以防止以未经授权的方式生成新供应。
权限和架构
应用程序中有三个不同的主要结构: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
记录。现在其他铸造者可以成为此元数据的版本,如果它们有适当的授权令牌。
mint_new_edition_from_master_edition_via_token
(新铸造权限必须是签名者)
如果一个人拥有来自主版印刷铸造的令牌以及一个全新的没有Metadata
的铸造,并且该铸造只有供应量为一个,则可以通过调用此端点将此铸造变成父Master Edition
的Edition
。此端点既创建了Edition
和Metadata
记录,又销毁了令牌。
进一步扩展
此程序旨在通过进一步的账户桶进行扩展。
例如,如果我们想为youtube元数据添加元数据,我们可以创建一个新的结构体名为Youtube,并用种子初始化它。
["metadata".as_bytes(), program_id.as_ref(), mint_key.as_ref(), "youtube".as_bytes()]
然后只有对那些感兴趣的数据进行搜索的人需要搜索它,并且它的唯一性得到保证。它也可以有自己的更新操作,该操作遵循与原始更新操作类似的模式。
依赖项
~16-25MB
~425K SLoC