Core Candy Machine
特別なガード命令
前のページで見たように、ガードはCandy Machineのミントプロセスをカスタマイズする強力な方法です。しかし、ガードが独自のカスタム命令を提供できることをご存知でしたか?
Route命令
Core Candy Guardプログラムには**「Route」命令**と呼ばれる特別な命令が付属しています。
この命令により、Core Candy Machineから特定のガードを選択し、そのガードに固有のカスタム命令を実行できます。選択されたガードにリクエストをルーティングするため、「Route」命令と呼んでいます。
この機能により、ガードは独自のプログラムロジックを含めることができるため、さらに強力になります。ガードは以下を可能にします:
- 重い操作のために検証プロセスをミントプロセスから分離する。
- カスタムプログラムのデプロイが必要な機能を提供する。
Route命令を呼び出すには、どのガードに命令をルーティングするかを指定し、そのガードが期待するRoute設定を提供する必要があります。Route命令をサポートしていないガードを選択してRoute命令を実行しようとすると、トランザクションは失敗することに注意してください。
Candy Guardプログラムで登録されたガードごとに一つの「Route」命令しかあり得ないため、同じガードが提供する複数の機能を区別するために、Route設定でPath属性を提供することが一般的です。
例えば、ミントが終了した後にのみ解除できるFrozen NFTのサポートを追加するガードは、Route命令を使用してトレジャリーエスクローアカウントを初期化し、適切な条件の下で誰でもミントされたNFTを解除できるようにすることができます。前者には「init」、後者には「thaw」と等しいPath属性を使用してこれら2つの機能を区別できます。
Route命令をサポートする各ガードのRoute命令とその基盤となるパスの詳細な説明は、それぞれのページで見つけることができます。
例を提供してRoute命令がどのように機能するかを説明してみましょう。Allow Listガードは、ミントするウォレットが事前設定されたウォレットリストの一部であることを検証するためにRoute命令をサポートしています。
Merkle Treeを使用してこれを行います。つまり、許可されたウォレットの全リストのハッシュを作成し、そのハッシュ(Merkle Rootとして知られる)をガード設定に保存する必要があります。ウォレットが許可リストに載っていることを証明するには、プログラムがMerkle Rootを計算してガードの設定と一致することを確認できるハッシュのリスト(Merkle Proofとして知られる)を提供する必要があります。
したがって、Allow Listガードは指定されたウォレットのMerkle Proofを検証するためにRoute命令を使用し、成功した場合、ミント命令の検証証明として機能するブロックチェーン上に小さなPDAアカウントを作成します。
では、なぜミント命令内でMerkle Proofを直接検証できないのでしょうか?それは単に、大きな許可リストの場合、Merkle Proofがかなり長くなる可能性があるためです。特定のサイズ以降、既にかなりの量の命令を含むミントトランザクション内に含めることが不可能になります。検証プロセスをミントプロセスから分離することで、許可リストを必要な大きさにすることが可能になります。
ガードのRoute命令の呼び出し
Umiライブラリを使用してガードのRoute命令を呼び出すためにroute関数を使用できます。guard属性を通じてガードの名前を、routeArgs属性を通じてそのRoute設定を渡す必要があります。
ミント前にウォレットのMerkle Proofを検証するAllow Listガードを使用した例を示します。
import {
create,
route,
getMerkleProof,
getMerkleRoot,
} from '@metaplex-foundation/mpl-core-candy-machine'
// 許可リストを準備します。
// リストの最初のウォレットがMetaplexアイデンティティであると仮定しましょう。
const allowList = [
'GjwcWFQYzemBtpUoN5fMAP2FZviTtMRWCmrppGuTthJS',
'2vjCrmEFiN9CLLhiqy8u1JPh48av8Zpzp3kNkdTtirYG',
'AT8nPwujHAD14cLojTcB1qdBzA1VXnT6LVGuUd6Y73Cy',
]
const merkleRoot = getMerkleRoot(allowList)
// Allow Listガード付きCandy Machineを作成します。
await create(umi, {
// ...
guards: {
allowList: some({ merkleRoot }),
},
}).sendAndConfirm(umi)
// 今ミントしようとすると、失敗します
// Merkle Proofを検証していないためです。
// Route命令を使用してMerkle Proofを検証します。
await route(umi, {
candyMachine: candyMachine.publicKey,
guard: 'allowList',
routeArgs: {
path: 'proof',
merkleRoot,
merkleProof: getMerkleProof(
allowList,
'GjwcWFQYzemBtpUoN5fMAP2FZviTtMRWCmrppGuTthJS'
),
},
}).sendAndConfirm(umi)
// 今ミントしようとすると、成功します。
APIリファレンス: route, DefaultGuardSetRouteArgs
グループによるRoute命令
ガードグループを使用しながらRoute命令を呼び出す場合、選択したいガードのグループラベルを指定することが重要です。これは、異なるグループに同じタイプのガードが複数ある可能性があり、プログラムがRoute命令にどれを使用すべきかを知る必要があるためです。
例えば、一つのグループに厳選されたVIPウォレットのAllow Listがあり、別のグループに抽選の当選者のAllow Listがあるとします。そうすると、Allow ListガードのMerkle Proofを検証したいと言うだけでは不十分で、どのグループに対してその検証を実行すべきかも知る必要があります。
Route命令を呼び出す際のグループでのフィルタリング
グループを使用する場合、UmiライブラリーShopifyのroute関数は、選択したいグループのラベルに設定する必要があるOption<string>タイプの追加のgroup属性を受け入れます。
import {
create,
route,
getMerkleProof,
getMerkleRoot,
} from "@metaplex-foundation/mpl-core-candy-machine";
import { base58PublicKey, some } from "@metaplex-foundation/umi";
// 許可リストを準備します。
const allowListA = [...];
const allowListB = [...];
// 2つのAllow Listガード付きCandy Machineを作成します。
await create(umi, {
// ...
groups: [
{
label: "listA",
guards: {
allowList: some({ merkleRoot: getMerkleRoot(allowListA) }),
},
},
{
label: "listB",
guards: {
allowList: some({ merkleRoot: getMerkleRoot(allowListB) }),
},
},
],
}).sendAndConfirm(umi);
// 選択するグループを指定してMerkle Proofを検証します。
await route(umi, {
candyMachine: candyMachine.publicKey,
guard: 'allowList',
group: some('listA'), // <- 「allowListA」を使用して検証しています。
routeArgs: {
path: 'proof',
merkleRoot: getMerkleRoot(allowListA),
merkleProof: getMerkleProof(
allowListA,
base58PublicKey(umi.identity),
),
},
}).sendAndConfirm(umi);
APIリファレンス: route, DefaultGuardSetRouteArgs
まとめ
Route命令により、ガードは独自のカスタムプログラムロジックを含むことができるため、さらに強力になります。各ガードの完全な機能セットを確認するために、利用可能なすべてのガードの専用ページをチェックしてください。
Core Candy Machineとそのガードの設定について知るべきことをすべて知ったところで、ミントについて話す時が来ました。次のページでお会いしましょう!取得についても読みたいかもしれません。
