Core Candy Machine
Core Candy Machineの作成
前提条件
Core Candy Machineアセットをコレクション(新規または既存)に作成したい場合は、Core Candy Machineの作成時にCoreコレクションを提供する必要があります。
Candy Machineの作成
Core Candy Machineの作成
// Candy Machineを作成します。
import { create } from '@metaplex-foundation/mpl-core-candy-machine'
import { generateSigner } from '@metaplex-foundation/umi'
const candyMachine = generateSigner(umi)
const createIx = await create(umi, {
candyMachine,
collection: collectionMint.publicKey,
collectionUpdateAuthority: umi.identity,
itemsAvailable: 1000,
authority: umi.identity.publicKey,
})
await createIx.sendAndConfirm(umi)
引数
createCandyMachine関数に渡すことができる利用可能な引数。
Core Candy Machineの作成に使用される新しく生成されたキーペア/サイナー。
CandyMachine作成引数
authorityPda (オプション)
Authority
authorityPda: string
authorityPdaフィールドは、ミントされたアセットをコレクションに検証するために使用されるPDAです。これはオプションであり、省略された場合はデフォルトのシードに基づいて自動的に計算されます。
authority (オプション)
authority
authority: string
payer (オプション)
トランザクションとレント費用を支払うウォレット。デフォルトはサイナーです。
authority
payer: publicKey
authorityフィールドは、Core Candy Machineの管理者となるウォレット/publicKeyです。
Collection
Core Candy Machineがアセットを作成するコレクション。
authority
collection: publicKey
Collection Update Authority
コレクションの更新権限。Candy Machineが作成されたアセットをコレクションに検証するためのデリゲートを承認できるよう、これは署名者である必要があります。
authority
collectionUpdateAuthority: signer
itemsAvailable
Core Candy Machineに読み込まれるアイテム数。
itemsAvailable
itemsAvailable: number
Is Mutable
作成時にアセットを可変または不変としてマークするブール値。
isMutable
isMutable: boolean
Config Line Settings
ランダム性
Config Line SettingsとHidden Settingsは相互に排他的です。一度に使用できるのは一つだけです。
アセットの「ランダム」ミントプロセスは完全に予測不可能ではなく、十分なリソースと悪意ある意図によって影響を受ける可能性があるため、リビールメカニズムにはHidden Settingsを利用することが推奨される場合があります。
Config Line Settingsは、Core Candy Machineにアセットデータを追加する高度なオプションを可能にするオプションフィールドで、Core Candy Machineのレント費用を大幅に安くします。
アセットの名前とURIプレフィックスをCore Candy Machineに保存することで、すべてのアセットに同じ名前とURIを保存する必要がないため、保存に必要なデータが大幅に削減されます。
例えば、すべてのアセットがExample Asset #1からExample Asset #1000まで同じ命名構造を持っている場合、通常は文字列Example Asset #を1000回保存する必要があり、15,000バイトを占有します。
名前のプレフィックスをCore Candy Machineに保存し、Core Candy Machineが作成されたインデックス番号を文字列に追加することで、レント費用でこれらの15,000バイトを節約できます。
これはURIプレフィックスにも適用されます。
ConfigLineSettingsオブジェクト
ConfigLineSettings = {
prefixName: string;
nameLength: number;
prefixUri: string;
uriLength: number;
isSequential: boolean;
}
prefixName
これはNFTの名前プレフィックスを保存し、ミント時に名前の末尾にミントされたインデックスを追加します。
アセットの命名構造がExample Asset #1の場合、プレフィックスはExample Asset #になります。ミント時にCore Candy Machineは文字列の末尾にインデックスを追加します。
nameLength
名前プレフィックスを除く、挿入される各アイテムの名前の最大長。
例:
- 1000アイテムを含むCandy Machine
- 各アイテムの名前は
Example Asset #X(Xは1から始まるアイテムのインデックス)
この場合、19文字を保存する必要があります。"My NFT Project #"で15文字、最高数の"1000"で4文字。prefixNameを使用する場合、nameLengthは代わりに4に削減できます。
prefixUri
可変識別IDを除く、メタデータのベースURI。
アセットのメタデータURIがhttps://example.com/metadata/0.jsonの場合、ベースメタデータURIはhttps://example.com/metadata/になります。
uriLength
prefixUriを除く、URIの最大長。
例:
- 20文字のベースURI
https://arweave.net/ - 最大43文字の一意の識別子
プレフィックスなしでは63文字の保存が必要になります。prefixUriを使用する場合、uriLengthはhttps://arweave.net/の20文字分削減され、一意識別子の43文字になります。
isSequential
順次インデックスジェネレーターを使用するかどうかを示します。falseの場合、Candy Machineはランダムにミントします。HiddenSettingsは常に順次です。
configLineSettings
configLineSettingsを適用してCore Candy Machineを作成する例を示します:
configLineSettingsでCore Candy Machineを作成
import { create } from '@metaplex-foundation/mpl-core-candy-machine'
const candyMachine = generateSigner(umi)
const coreCollection = publicKey('11111111111111111111111111111111')
const createIx = await create(umi, {
candyMachine,
collection: coreCollection,
collectionUpdateAuthority: umi.identity,
itemsAvailable: 5000,
configLineSettings: some({
prefixName: 'Example Asset #',
nameLength: 15,
prefixUri: 'https://example.com/metadata/',
uriLength: 29,
isSequential: false,
}),
})
await createIx.sendAndConfirm(umi)
Hidden Settings
Hidden Settingsにより、Core Candy Machineはすべての購入者に対して全く同じアセットをミントできます。この設計原理の背後にある考えは、人気の'リビール'メカニズムを後日実行できるようにすることです。Edition Guardと組み合わせることで、Core Editionの印刷も可能になります。
Hidden Settings
hiddenSettings = {
name: string,
uri: string,
hash: Uint8Array,
}
name
Hidden Settingsが有効な状態でミントされるすべてのアセットに表示される名前。Config Line Settingsのプレフィックスと同様に、Hidden SettingsのNameとURIには特別な変数を使用できることに注意してください。これらの変数は:
$ID$: これは0から始まるミントされたアセットのインデックスに置き換えられます。$ID+1$: これは1から始まるミントされたアセットのインデックスに置き換えられます。
これを使用して、希望するアセットをリビールされたデータに一致させることができるようにする必要があります。
uri
Hidden Settingsが有効な状態でミントされるすべてのアセットに表示されるURI。
hash
ハッシュの目的は、更新/リビールされた各NFTがCandy Machineからミントされたインデックスに一致する正しいものであることを検証するデータ片の暗号化ハッシュ/チェックサムを保存することです。これにより、ユーザーは検証をチェックでき、データが変更されているかどうか、実際にHidden NFT #39がRevealed NFT #39であり、元のデータがレアアイテムを特定の人/ホルダーに移動するために改ざんされていないことを確認できます。
リビールデータのハッシュ化
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 hash = crypto.createHash('sha256').update(string).digest()
console.log(hash)
Hidden SettingsによるCore Candy Machineの例
Hidden SettingsでCandy Machineを作成
import { create } from '@metaplex-foundation/mpl-core-candy-machine'
import crypto from "crypto";
const candyMachine = generateSigner(umi)
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 hash = crypto.createHash('sha256').update(string).digest()
const createIx = await create(umi, {
candyMachine,
collectionMint: collectionMint.publicKey,
collectionUpdateAuthority,
sellerFeeBasisPoints: percentAmount(10),
itemsAvailable: 5000,
hiddenSettings: {
name: "Hidden Asset",
uri: "https://example.com/hidden-asset.json",
hash,
}
})
await createIx.sendAndConfirm(umi)
ガード付きCore Candy Machineの作成
ガード付きのCore Candy Machineを作成するには、作成時にguards:フィールドを提供し、Candy Machineに適用したいデフォルトガードを指定できます。
これまでに作成したCore Candy Machineにはガードが有効になっていませんでした。利用可能なすべてのガードがわかったので、いくつかのガードを有効にして新しいCandy Machineを設定する方法を見てみましょう。
具体的な実装は使用するSDKによって異なります(以下を参照)が、基本的な考え方は、必要な設定を提供してガードを有効にすることです。設定されていないガードは無効になります。
ガード付きCore Candy Machineの作成
import { some, sol, dateTime } from '@metaplex-foundation/umi'
const createIx = 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') }),
// 他のすべてのガードは無効...
},
})
await createIx.sendAndConfirm(umi)
APIリファレンス: create, DefaultGuardSetArgs
