Skip to content

配置糖果机

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

知识点

  • 本章节学习糖果机上所有可用的配置,我们将重点介绍影响糖果机本身的 NFT 配置,而不是影响铸造过程guards的配置

课程

1.权限

  • authority在创建新的糖果机时,你需要提供授权方的地址,以便以后能够更新糖果机、向其中插入物品、删除糖果机等。当使用我们的 SDK 时,糖果机总是会默认与guards关联,因此您不必担心这个铸币权限。

2.所有 NFT 共享的设置

许多 NFT 属性对于所有铸造的 NFT 都是相同的。因此,我们不必每次在糖果机中加载物品时都重复这些属性,而是在糖果机设置中设置一次即可。

以下是所有铸造的 NFT 之间共享的属性列表:

  • sellerFeeBasisPoints卖家费用基点:应以基点为单位设定的二级销售版税。例如,250 意味着 2.50%版税
  • symbol符号:铸造 NFT 上使用的符号 — 例如“MYPROJECT”。这可以是最多 10 个字符的任何文本,也可以通过提供空文本来使其成为可选项。
  • maxEditionSupply最大版本供应量:从每个 NFT Item 中可以再次打印的版本数量(类似 ERC1155)。在大多数情况下,您需要将其设置为,0 以防止铸造的 NFT 被多次打印。请注意,您无法将其设置为null这意味着 Candy Machines 不支持无限版本。
  • isMutable是否可变:铸造的 NFT 是否应可变。除非有特殊原因,否则我们建议将其设置为true。您可以在将来随时使 NFT 不可变,但您不能再使不可变的 NFT 可变。
  • creators创造者:应在铸造的 NFT 上设置的创造者列表。
    • address创造者地址
    • verified是否验证
    • percentageShare版税分配比例,例如 5 即 5%
  • tokenStandard代币标准:铸造 NFT 时使用的代币标准,目前仅支持两种代币标准 NonFungibleProgrammableNonFungible
  • ruleSet规则集:如果糖果机使用ProgrammableNonFungible代币标准,它可以提供一个明确的规则集,该规则集将分配给每个铸造的可编程 NFT。如果没有提供规则集,它将默认使用 Collection NFT 上的规则集(如果有)。否则,将在没有规则集的情况下铸造可编程 NFT
js
const candyMachineSettings = {
  sellerFeeBasisPoints: percentAmount(33.3, 2),
  symbol: "MYPROJECT",
  maxEditionSupply: 0,
  isMutable: true,
  creators: [
    { address: creatorA, percentageShare: 50, verified: false },
    { address: creatorB, percentageShare: 50, verified: false },
  ],
  tokenStandard: TokenStandard.NonFungible,
};

3.Metaplex 认证合集

每台糖果机都必须与一个称为Metaplex 认证合集的特殊 NFT 相关联。此Collection NFT可以将铸造的 NFT 组合在一起 ,并在链上验证该信息。

为了确保其他人无法在他们的糖果机上使用您的 Collection NFT,需要 Collection 的更新权限来签署任何更改糖果机上 Collection 的交易。因此,糖果机可以安全地自动验证所有铸造 NFT 的 Collection。

js
// 创建合集更新权限keypair
const collectionUpdateAuthority = generateSigner(umi);
// 创建合集的mint账户keypair
const collectionMint = generateSigner(umi);
// 创建合集
await createNft(umi, {
  mint: collectionMint, // 合集的mint账户
  authority: collectionUpdateAuthority, // 合集的更新权限
  name: "My Collection NFT",
  uri: "https://example.com/path/to/some/json/metadata.json",
  sellerFeeBasisPoints: percentAmount(9.99, 2), // 9.99%
  isCollection: true,
}).sendAndConfirm(umi);

// 将合集的更新权限配置到糖果机中
const candyMachineSettings = {
  collectionMint: collectionMint.publicKey,
  collectionUpdateAuthority: collectionUpdateAuthority,
};

4.Item 设置

糖果机设置还包含有关其中已装入或将要装入的 Item 的信息。itemsAvailable属性属于该类别,并存储了糖果机将铸造的最大 NFT 数量。

js
const candyMachineSettings = {
  itemsAvailable: 500,
};

除了itemsAvailable属性之外,还有两个属性定义 Item 在糖果机中的加载方式。您必须选择其中一个属性,另一个属性留空。这些属性是:

  • configLineSettings配置行设置
  • hiddenSettings隐藏设置

configLineSettings配置行设置

configLineSettings属性允许我们描述已插入或将要插入糖果机的 Item。通过提供 Item 名称和 URI 的精确长度以及提供一些共享前缀以缩短长度,它使我们能够将糖果机的大小保持在最小。Config Line Settings属性是一个包含以下属性的对象:

  • prefixName通用名称前缀:所有插入 Item 共享的名称前缀。此前缀最多可包含 32 个字符。
  • nameLength名称长度:每个插入 Item 的名称的最大长度(不包括名称前缀)。
  • prefixUri通用 URI 前缀:所有插入 Item 共享的 URI 前缀。此前缀最多可包含 200 个字符。
  • uriLengthURI 长度:每个插入 Item 的 URI 的最大长度(不包括 URI 前缀)。
  • isSequentialtrue表示按顺序铸造 NFT,false表示按随机顺序。我们建议将其设置为false以防止买家预测下一个将铸造哪个 NFT。请注意,在创建新的糖果机时,我们的 SDK 将默认使用配置行设置,并将是否按顺序设置为false

为了更好地理解这些NameURI属性,让我们来看一个例子。假设您要创建具有以下特征的糖果机:

  • 其內容包含 1000 項目。
  • 每个物品的名称是My NFT Project #X,其中 X 是从 1 开始的物品索引。
  • 每个 Item 的 JSON 元数据都已上传至 Arweave,因此它们的 URI 以https://arweave.net/开头,以最大长度为 43 个字符的唯一标识符结尾。

在这个例子中,如果没有前缀,我们最终会得到:

  • 名称长度 = 20。My NFT Project #为 16 个字符,最高数字1000为 4 个字符。
  • URI 长度 = 63。其中https://arweave.net/为 20 个字符,唯一标识符为 43 个字符。

当插入 1000 个 Item 时,仅存储 Item 信息就需要总共 83,000 个字符。但是,如果我们使用前缀,我们可以显著减少创建糖果机所需的空间,从而减少在区块链上创建它的成本。

1000 个 Item,我们现在只需要 47'000 个字符来存储我们的 Item。

但这不是全部!您可以在名称或 URI 前缀中使用两个特殊变量来进一步减小该大小。这些变量是:

  • $ID$:替换成从 0 开始的 Item 索引。
  • $ID+1$:这将被从 1 开始的 Item 索引替换。

在上面的例子中,我们可以利用$ID+1$变量作为名称前缀,这样我们就不需要在每个 Item 上设置它了。我们最终得到以下配置行设置:

  • Name Prefix = "My NFT Project #$ID+1$"
  • Name Length = 0
  • URI Prefix = "https://arweave.net/"
  • URI Length = 43

我们的名称长度现在为零,并且我们将所需的字符减少到 43'000 个字符。

最终代码片段:

js
const candyMachineSettings = {
  hiddenSettings: none(),
  configLineSettings: some({
    prefixName: "My NFT Project #$ID+1$",
    nameLength: 0,
    prefixUri: "https://arweave.net/",
    uriLength: 43,
    isSequential: false,
  }),
};

hiddenSettings隐藏设置

准备 Item 的另一种方法是使用隐藏设置hiddenSettings。这是一种与配置行设置configLineSettings完全不同的方法,因为使用隐藏设置,您无需将任何物品插入糖果机,因为每个铸造的 NFT 都将共享相同的名称和相同的 URI。您可能想知道:为什么有人想这样做?这样做的原因是创建一个隐藏和显示的 NFT 掉落,在铸造所有 NFT 后显示它们。那么它是如何工作的呢?

  • 首先,创建者使用隐藏设置配置每个铸造的 NFT 的名称和 URI。URI 通常指向预告teaserJSON 元数据,明确表示即将发生揭露。
  • 然后,买家用相同的 URI 铸造所有这些 NFT,因此也具有相同的预告teaser JSON 元数据。
  • 最后,当所有 NFT 都被铸造出来后,创建者会更新每个铸造的 NFT 的 URI,以指向特定于该 NFT 的真实 URI。

最后一步的问题在于,它允许创建者随意决定哪个买家获得哪个 NFT。为了避免这种情况,并允许买家验证 NFT 和 JSON 元数据之间的映射未被篡改,隐藏设置包含一个哈希属性,该属性应填充文件的 32 个字符哈希,该文件将 NFT 索引与其真实的 JSON 元数据进行映射。这样,在揭示之后,创建者可以将该文件公开给买家,并验证其哈希是否与隐藏设置中提供的哈希相对应。

因此,我们最终得到隐藏设置属性的以下特性:

  • Name所有铸造的 NFT 的隐藏名称。最多可包含 32 个字符。
  • URI所有铸造的 NFT 的隐藏URI。最多可包含 200 个字符。
  • Hash将 NFT 索引与其真实 JSON 元数据映射的文件的 32 个字符哈希值,允许买家验证它没有被篡改。

请注意,就像配置行设置hiddenSettings的前缀一样,隐藏设置的名称和 URI 可以使用特殊变量。提醒一下,这些变量是:

  • $ID$:替换成从 0 开始的 Item 索引。
  • $ID+1$:这将被从 1 开始的 Item 索引替换。

另请注意,由于我们没有将任何物品放入糖果机,因此隐藏设置可以产生非常大的掉落。唯一的警告是,在铸造后,需要一个链下流程来更新每个 NFT 的名称和

代码片段:

js
// 要计算哈希值,您可以使用以下函数:
import crypto from "crypto";

const revealData = [
  { name: "Nft #1", uri: "http://example.com/1.json" },
  { name: "Nft #2", uri: "http://example.com/2.json" },
  { name: "Nft #3", uri: "http://example.com/3.json" },
];

const string = JSON.stringify(revealData);
const hashOfTheFileThatMapsUris = crypto
  .createHash("sha256")
  .update(string)
  .digest();

console.log(hashOfTheFileThatMapsUris);

// 使用 Umi 时,你可以使用some和辅助函数分别通过和属性none告诉库是否使用配置行设置或隐藏设置。这两个设置只能使用一个,因此必须配置其中一个,并将另一个设置为。configLineSettingshiddenSettingsnone()

// 以下代码片段展示了如何使用 Umi 库设置上述示例。

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

const candyMachineSettings = {
  configLineSettings: none(),
  hiddenSettings: some({
    name: "My NFT Project #$ID+1$",
    uri: "https://example.com/path/to/teaser.json",
    hash: hashOfTheFileThatMapsUris,
  }),
};