本文深入探讨了Solana的Metaplex Token Metadata程序,详细阐述了如何创建NFT,包括上传艺术作品、创建唯一的Token Mint和铸造Token的步骤。文章介绍了多个关键功能和实现细节,适合开发者学习NFT技术的具体实现方式。
metaplex-token-metadata 程序是 Solana 上 NFT 的支柱。
想象一下你想为你的艺术作品创建一个 NFT,你基本上需要:
在第 2 步中,token mint 是特别的——它的供应量只有一个,必须与你的艺术信息(例如,名称、创作者、位置等)相关联。
Metaplex 创建了一个 用于此类“元数据”的规范,这些元数据可以通过 token-metadata 程序添加到每个(特殊的)token mint。
在本文章中,我们详细阐述 token-metadata 的实现细节。
在 Metaplex 创建的 NFT
token-metadata 程序有相当多的指令(总共超过 20 个)。以下四个是最常用的:
token-metadata 程序的交易日志
首先,通过调用函数 process_create_metadata_accounts_v2 创建元数据账户:
注意:每个元数据账户都是一个 PDA,token mint(mint_info)是 seeds 的一部分:
铸造权限(mint_authority_info)必须是签名者。
Metadata 结构有十个字段:
该函数基本上初始化每个字段,例如,metadata.mint、metadata.update_authority 和 metadata.data:
metadata.data 记录 NFT 的属性(例如,名称、uri 和创作者):
此元数据账户将作为 NFT 的 master_metadata。
然后,创建 NFT 的主版本账户,以便你可以使用它来打印多版(例如,限量供应 10)你的 NFT。
该函数 process_create_master_edition 用于为给定的 max_supply 创建一个 token mint 的主版本账户(edition_account_info):
注意1:每个主版本账户都是一个 PDA,token mint(mint_info)是 seeds 的一部分:
注意2:该函数只能由 token metadata 的 update_authority 为一个 token mint 调用一次,并且仅当 mint 的供应量为一时:
MasterEdition 记录有三个字段:
pub struct MasterEditionV2 {
pub key: Key,
pub supply: u64,
pub max_supply: Option,}
该函数基本上初始化这些字段:
最后,它将 token mint 的权限(AuthorityType::MintTokens 和 AuthorityType::FreezeAccount)转移到主版本账户:
之后,其他 token mints 可能成为该元数据的版本,代表 NFT 的限量版。
函数 process_mint_new_edition_from_master_edition_via_token 用于从主版本铸造 NFT 的新版本:
调用者提供一个 新 mint 账户和一个 版本编号,并且必须是 该 master_metadata.mint 的 token 账户的签名者(即,NFT 的拥有者):
该函数将使用版本编号和 NFT 的 mint(master_metadata.mint)创建一个新的 edition_marker PDA,作为 seeds 的一部分:
然后,调用 mint_limited_edition 函数以铸造新版本:
在 mint_limited_edition 中,将根据新的 mint 账户(mint_info)创建一个 新元数据 账户:
新的 mint 必须不同于 master_metadata.mint,并且其供应量必须为一:
新的 mint 账户也是创建新版本 PDA 的 seeds 的一部分:
最后,类似于 CreateMasterEditionV3,设置 新 mint 账户的权限(AuthorityType::MintTokens 和 AuthorityType::FreezeAccount)为新版本账户:
函数 process_update_metadata_accounts_v2 可以由元数据的 update_authority 在任何时间用于更新元数据:
要更新 metadata.data 记录,metadata.is_mutable 必须为 true:
元数据的 update_authority 也可以更新,以及 metadata.primary_sale_happened:
token-metadata 程序还有其他几个功能,比如验证 NFT 创作者( 查看完整代码):
MetadataInstruction::SignMetadata => {
msg!(“指令:签名元数据”);
process_sign_metadata(program_id, accounts)}
MetadataInstruction::RemoveCreatorVerification => {
msg!("指令:移除创作者验证");
process_remove_creator_verification(program_id, accounts)}
在接下来的几篇文章中,我们将继续强调一些其他流行 Solana 程序的技术细节。
- 原文链接: sec3.dev/blog/solana-pro...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!