Appearance
配置糖果机
作者 崔棉大师 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 时使用的代币标准,目前仅支持两种代币标准NonFungible
和ProgrammableNonFungible
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 个字符。uriLength
URI 长度:每个插入 Item 的 URI 的最大长度(不包括 URI 前缀)。isSequential
:true
表示按顺序铸造 NFT,false
表示按随机顺序。我们建议将其设置为false
以防止买家预测下一个将铸造哪个 NFT。请注意,在创建新的糖果机时,我们的 SDK 将默认使用配置行设置,并将是否按顺序
设置为false
。
为了更好地理解这些Name
和URI
属性,让我们来看一个例子。假设您要创建具有以下特征的糖果机:
- 其內容包含 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 个字符。但是,如果我们使用前缀,我们可以显著减少创建糖果机所需的空间,从而减少在区块链上创建它的成本。
- Name Prefix = "My NFT Project #"
- Name Length = 4
- URI Prefix = "https://arweave.net/"
- URI Length = 43
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 通常指向预告
teaser
JSON 元数据,明确表示即将发生揭露。 - 然后,买家用相同的 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,
}),
};