Skip to content

糖果卫士

作者 崔棉大师 X:@MasterCui Youtube: 崔棉大师

知识点

现在我们知道了糖果机的工作原理和如何装载它们,现在是时候讨论拼图的最后一块了:Guard

Guard模块是一段模块化代码,可以限制对糖果机铸币权限的访问,甚至可以为其添加新功能!

有大量的Guard设置可供选择,每个Guard设置都可以随意激活和配置。

我们将在本文档的后面介绍所有可用的保护,但让我们通过这里的几个例子来说明这一点。

  • 当启用开始日期保护时,在预设日期之前禁止铸造。还有一个结束日期保护,用于在给定日期之后禁止铸造。
  • 启用Sol 支付保护后,铸币钱包必须向配置的目标钱包支付配置的金额。或者可以使用特定集合的代币或 NFT 付款。
  • 代币门 (Token Gate)和NFT 门 (NFT Gate)Guard 分别将铸造限制给特定的代币持有者和 NFT 持有者。
  • 允许列表保护仅当钱包属于预定义钱包列表的一部分时才允许铸币。有点像铸币的嘉宾名单。

如您所见,每个 Guard 只负责一项职责,这使得它们可组合。换句话说,您可以挑选所需的 Guard 来创建完美的糖果机。

课程

1.糖果卫士账号

如果你还记得我们的 Candy Machine 账户的内容,你就不会在那里看到任何守卫的迹象。这是因为守卫住在另一个名为Candy Guard账户的账户中,该账户是由Candy Guard程序创建的。

每个 Candy Machine 帐户通常应与其自己的Candy Guard帐户相关联,这将为其增加一层保护。

实现方法是创建一个Candy Guard账户,并使其成为 Candy Machine 账户的Mint Authority。这样一来,就无法再直接从主Candy Machine程序(称为 Candy Machine Core 程序)进行铸造。相反,我们必须通过Candy Guard程序进行铸造,如果所有保护都成功解决,则将交给Candy Machine Core程序来完成铸造过程。

candy-guard-account

请注意,由于 Candy Machine 和 Candy Guard 账户协同工作,我们的 SDK 将它们视为一个实体。当您使用我们的 SDK 创建 Candy Machine 时,默认情况下还会创建一个关联的 Candy Guard 账户。更新 Candy Machines 时也是如此,因为它们允许您同时更新防护装置。我们将在本页上看到一些具体示例。

2.为什么是另一个程序?

守卫不驻留在糖果机主程序中的原因是为了将访问控制逻辑与糖果机的主要职责(即铸造 NFT)分开。

这使得防护装置不仅模块化,而且可扩展。任何人都可以创建和部署自己的 Candy Guard 程序来创建自定义防护装置,同时依靠 Candy Machine Core 程序完成其余所有工作。

candy-guard-another-program

请注意,我们的 SDK 还提供注册您自己的 Candy Guard 程序及其自定义防护装置的方法,以便您可以利用其友好的 API 并轻松地与他人共享您的防护装置。

3.所有可用 Guard

现在我们了解了什么是 Guard,让我们看看我们可以使用哪些默认 Guard。

  • 地址门:将铸币限制在一个地址。
  • 允许列表:使用钱包地址列表来确定谁被允许铸造。
  • 机器人税:可配置的税,用于收取无效交易的费用。
  • 结束日期:确定结束铸币的日期。
  • 冻结 Sol 支付:设置 SOL 铸币价格,并设定冻结期。
  • 冻结代币支付:设置代币铸币价格,并设定冻结期。
  • Gatekeeper:通过 Gatekeeper 网络限制铸造,例如 Captcha 集成。
  • 铸币限制:指定每个钱包的铸币数量限制。
  • NFT 销毁:将铸币限制为指定收藏品的持有者,要求销毁 NFT。
  • Nft Gate:将铸币限制为指定收藏品的持有者。
  • Nft 支付:将铸币的价格设定为指定收藏品的 NFT。
  • 赎回金额:根据铸造的总金额确定铸造的结束时间。
  • SOL 支付:以 SOL 设定铸币的价格。
  • 开始日期:确定铸币的开始日期。
  • 第三方签名者:交易中需要额外的签名者。
  • 代币销毁:将铸币限制为指定代币的持有者,要求销毁代币。
  • 代币门:将铸币权限制为指定代币的持有者。
  • 代币支付:以代币数量设定铸币价格。

4.创建一个带守卫的糖果机

到目前为止,我们创建的糖果机尚未启用任何防护装置。现在我们知道了所有可用的防护装置,让我们看看如何设置启用一些防护装置的新型糖果机。

具体实现取决于您使用的 SDK(见下文),但主要思想是通过提供所需的设置来启用防护。任何未设置的防护都将被禁用。

js
import { some, sol, dateTime } from "@metaplex-foundation/umi";

await create(umi, {
  // ...
  guards: {
    botTax: some({ lamports: sol(0.01), lastInstruction: true }),
    solPayment: some({ lamports: sol(1.5), destination: treasury }),
    startDate: some({ date: dateTime("2023-04-04T16:00:00Z") }),
    // All other guards are disabled...
  },
}).sendAndConfirm(umi);

完整代码

5.更新守卫

你的 Guard 设置有误吗?你改变了铸币价格的想法吗?你需要稍微推迟铸币的开始时间吗?不用担心,可以按照创建时使用的相同设置轻松更新 Guard。

您可以通过提供设置来启用新的防护装置,或者通过给它们空的设置来禁用当前的防护装置。

您可以按照创建糖果机防护装置的方式更新它们。也就是说,通过在guards函数对象内提供它们的设置updateCandyGuard。任何设置为none()或未提供的防护装置都将被禁用。

请注意,整个guards对象将被更新,这意味着它将覆盖所有现有的保护!

js
import { some, sol, none } from "@metaplex-foundation/umi";

const candyGuard = fetchCandyGuard(umi, candyMachine.mintAuthority);
await updateCandyGuard(umi, {
  candyGuard: candyGuard.publicKey,
  guards: {
    ...candyGuard.guards,
    botTax: none(),
    solPayment: some({ lamports: sol(3), destination: treasury }),
  },
});