Solana程序第4部分:Metaplex糖果机

  • Sec3dev
  • 发布于 2022-05-30 13:19
  • 阅读 25

本文详细介绍了Metaplex糖果机(Candy Machine)的工作原理,它是Solana上最受欢迎的NFT铸造智能合约之一。文章探讨了如何设置、使用和配置糖果机,描述了铸造NFT所需的步骤,以及糖果机如何检测并收取机器人交易的费用。还分析了糖果机与元数据程序之间的区别,提供了丰富的技术细节和代码示例。

Metaplex Candy Machine 是在 Solana 上用于 NFT 铸造的最流行智能合约之一。最近,它甚至实现了检测和征收机器人税的复杂逻辑

candy machine program 的内部工作机制是什么?它的预期使用案例和依赖是什么?它如何检测机器人?本文详细介绍这些技术细节。

什么是 Metaplex Candy Machine?

Candy Machine 是一个分配程序,用于:

  1. NFT 创建者设置要分发的一系列 NFT(例如,10,000 个多样化的Okay Bears
  2. 用户铸造第 1 步中创建的 NFT(注意:机器人也可以铸造 NFT!)

对于步骤 1,分发者必须首先调用 InitializeCandyMachine 指令来创建 candy machine:

一个 candy machine 有几个重要的信息:

  • authority:谁被授权更新 candy machine、提取资金等
  • wallet:接收 NFT 铸造者付款的钱包
  • token_mint:用于钱包的可选 SPL 代币铸造(如果付款以 SPL 代币进行)
  • items_redeemed:迄今为止铸造的 NFT 总数
  • data:NFT 元数据(类型为 CandyMachineData
  • 每个 NFT 的其他配置(例如,nameuri

CandyMachineData 包含 NFT 铸造所需的属性:

price 是用户铸造 NFT 时支付的价格,可以在 whitelist_mint_settings 中配置可选的折扣。

creators 指定 NFT 集合的创建者列表。

items_available 是集合中 NFT 的数量。

对于步骤 2,任何人都可以通过调用 MintNFT 指令在步骤 1 中创建的 candy machine 中铸造 NFT。 MintNFT 是一个相当复杂的指令(在 Rust 中超过 600 行源代码)。我们接下来将详细解释 MintNFT

铸造 NFT

在 Metaplex 上铸造 NFT 有几个基本步骤(请参阅第 3 部分:Metaplex 代币元数据):

  1. 创建一个新的代币铸造(待铸造 NFT 的唯一标识符),并铸造一个代币到用户的代币账户
  2. 为 NFT 创建一个新的元数据账户(这将调用代币元数据程序的 CreateMetadataAccountV2 指令)
  3. 创建 NFT 的母版版本账户(这将调用代币元数据程序的 CreateMasterEditionV3 指令)
  4. 将元数据的 update_authority 设置为用户提供的账户(或 candy_machine.authority,如果 candy_machine.data.retain_authority 为真);这将调用代币元数据程序的 UpdateMetadataAccountV2 指令

MintNFT 指令依赖于代币元数据程序,它包括上述所有四个步骤,并且增加了用户为铸造的 NFT 支付费用和检测和征收机器人的逻辑。

用户如何在 Candy Machine 上铸造 NFT?

为了处理 MintNFT 指令,调用函数 handle_mint_nft,并传入多个输入账户,例如 candy_machinecandy_machine_creatorwalletmetadatamintmint_authority 等。

用户必须支付一个 price 来铸造每个 NFT。价格在 candy machine 中指定,可以是 SPL 代币或 Sol:

当使用 SPL 代币时,代币铸造由 candy_machine.token_mint 指定,付款通过 spl_token_transfersource 代币账户转移到 candy_machine.wallet 账户(第 468 行):

否则,price 数量的 Sol 直接通过 system_instruction::transferpayer 账户转移到 wallet 账户(第 482 行):

分发者还可以通过在 candy_machine.data 中配置 whitelist_mint_settings 为用户提供折扣价格:

从集合中铸造哪个 NFT?

对于集合中的每个 NFT,candy machine 维护一个 ConfigLine,包含 NFT 的 nameuri

如果 candy_machine.data.hidden_settings 被设置,铸造的 NFT 名称按 mint_number 排序(例如Okay Bear #1756):

mint_number 在每次成功调用 MintNFT 后递增。

如果 hidden_settings 未设置,则 MintNFT 指令使用从 recent_slothashes.data 计算出的 index 来确定从集合中铸造哪个 NFT:

get_config_line 函数以 modded 索引作为输入,并遍历集合中剩余的 NFT(使用位掩码):

最后,在检查所有约束并设置 CPI 账户数据以调用代币元数据程序后,按书写顺序调用以下三个函数以完成 NFT 铸造过程:

config_line 包含铸造 NFT 的信息

请注意 candy_machine_creator 账户(由 candy machine 程序创建的 PDA)也被指定为 NFT 的创建者:

为什么不直接使用代币元数据程序?

读者可能会想,为什么铸造 NFT 时应该使用 candy machine 而不是直接调用代币元数据程序?

这两个程序有不同的使用案例:

  • 对于 candy machine,用户从分发者创建的 NFT 集合中铸造(即,分发者代表原始 NFT 创建者)
  • 对于代币元数据,用户逐一创建他们自己的 NFT

Candy Machine 如何检测和征税机器人?

candy machine 程序检测机器人并对每个对 MintNFT 指令的机器人的调用收取费用(BOT_FEE: 0.01 Sol):

机器人检测逻辑实现于 handle_mint_nft 函数中,考虑了许多不同的场景:

步骤 1。 机器人通过 CPI 调用 handle_mint_nft。 只有通过the Gumpdrop program 调用的 CPI 不被视为机器人。 GUMDROP_ID: gdrpGjVffourzkdDRrQmySw4aTHr8a3xmQzzxSwFD1a

**

步骤 2。 机器人在铸造指令中缺少设置集合(对于设置了收集的 candy machine):

步骤 3。 机器人交易中包含来自未知程序的任何 CPI:

已知程序包括系统程序、SPL 代币程序、关联代币程序,以及 candy machine 程序本身。包含来自未知程序的任何 CPI 的交易被视为机器人。

步骤 4。 在铸造停止后机器人呼叫 MintNFT(在特定时间戳后):

步骤 5。 在所有可用 NFT 被赎回后机器人呼叫 MintNFT

步骤 6。 当 candy machine 的 gatekeeper 设置时,机器人缺少网关Token:

步骤 7. 机器人在 candy machine 的 go_live_date 之前调用 MintNFT

步骤 8。 机器人调用 MintNFT 时提供了不正确的 whitelist_token_mint

步骤 9。 机器人在 candy machine 没有折扣和没有预售时调用 MintNFT,同时提供了 whitelist_token_account(即,实施了强制白名单):

更新和配置 Candy Machine

权限用户可以通过另外几个指令更改 candy machine: UpdateCandyMachineAddConfigLinesSetCollectionRemoveCollectionSetCollectionDuringMint 以及 WithdrawFunds。这些指令是有权限的(由 candy_machine.authority 签名),否则将中止交易。

  • 原文链接: sec3.dev/blog/solana-pro...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Sec3dev
Sec3dev
https://www.sec3.dev/