本文详细介绍了Metaplex糖果机(Candy Machine)的工作原理,它是Solana上最受欢迎的NFT铸造智能合约之一。文章探讨了如何设置、使用和配置糖果机,描述了铸造NFT所需的步骤,以及糖果机如何检测并收取机器人交易的费用。还分析了糖果机与元数据程序之间的区别,提供了丰富的技术细节和代码示例。
Metaplex Candy Machine 是在 Solana 上用于 NFT 铸造的最流行智能合约之一。最近,它甚至实现了检测和征收机器人税的复杂逻辑。
candy machine program 的内部工作机制是什么?它的预期使用案例和依赖是什么?它如何检测机器人?本文详细介绍这些技术细节。
Candy Machine 是一个分配程序,用于:
对于步骤 1,分发者必须首先调用 InitializeCandyMachine 指令来创建 candy machine:
一个 candy machine 有几个重要的信息:
CandyMachineData 包含 NFT 铸造所需的属性:
price 是用户铸造 NFT 时支付的价格,可以在 whitelist_mint_settings 中配置可选的折扣。
creators 指定 NFT 集合的创建者列表。
items_available 是集合中 NFT 的数量。
对于步骤 2,任何人都可以通过调用 MintNFT 指令在步骤 1 中创建的 candy machine 中铸造 NFT。 MintNFT 是一个相当复杂的指令(在 Rust 中超过 600 行源代码)。我们接下来将详细解释 MintNFT。
在 Metaplex 上铸造 NFT 有几个基本步骤(请参阅第 3 部分:Metaplex 代币元数据):
MintNFT 指令依赖于代币元数据程序,它包括上述所有四个步骤,并且增加了用户为铸造的 NFT 支付费用和检测和征收机器人的逻辑。
为了处理 MintNFT 指令,调用函数 handle_mint_nft,并传入多个输入账户,例如 candy_machine 、 candy_machine_creator 、 wallet 、 metadata 、 mint 、 mint_authority 等。
用户必须支付一个 price 来铸造每个 NFT。价格在 candy machine 中指定,可以是 SPL 代币或 Sol:
当使用 SPL 代币时,代币铸造由 candy_machine.token_mint 指定,付款通过 spl_token_transfer 从 source 代币账户转移到 candy_machine.wallet 账户(第 468 行):
否则,price 数量的 Sol 直接通过 system_instruction::transfer 从 payer 账户转移到 wallet 账户(第 482 行):
分发者还可以通过在 candy_machine.data 中配置 whitelist_mint_settings 为用户提供折扣价格:
对于集合中的每个 NFT,candy machine 维护一个 ConfigLine,包含 NFT 的 name 和 uri:
如果 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 程序检测机器人并对每个对 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: UpdateCandyMachine、 AddConfigLines、 SetCollection、 RemoveCollection、 SetCollectionDuringMint 以及 WithdrawFunds。这些指令是有权限的(由 candy_machine.authority 签名),否则将中止交易。
- 原文链接: sec3.dev/blog/solana-pro...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!