기능
민팅
지금까지 Candy Machine을 생성하고 유지하는 방법을 배웠습니다. 설정하는 방법과 가드 및 가드 그룹을 사용하여 복잡한 민팅 워크플로를 설정하는 방법을 보았습니다. 이제 퍼즐의 마지막 조각인 민팅에 대해 이야기할 때입니다!
기본 민팅
Candy Guards 페이지에서 언급했듯이 Candy Machine에서 NFT를 민팅하는 데 책임이 있는 두 가지 프로그램이 있습니다: NFT 민팅을 담당하는 Candy Machine Core 프로그램과 그 위에 구성 가능한 액세스 제어 계층을 추가하고 커스텀 가드를 제공하기 위해 포크될 수 있는 Candy Guard 프로그램입니다.
따라서 Candy Machine에서 민팅하는 두 가지 방법이 있습니다:
Candy Guard 프로그램에서 민팅을 Candy Machine Core 프로그램에 위임합니다. 대부분의 경우 훨씬 더 복잡한 민팅 워크플로를 허용하므로 이렇게 하고 싶을 것입니다. 계정에 구성된 가드에 따라 민팅 명령어에 추가 나머지 계정과 명령어 데이터를 전달해야 할 수 있습니다. 다행히 우리의 SDK는 몇 가지 추가 매개변수를 요구하고 나머지를 계산해 주어 이를 쉽게 만듭니다.
Candy Machine Core 프로그램에서 직접. 이 경우 구성된 민트 권한만 민팅할 수 있으므로 트랜잭션에 서명해야 합니다.
모든 것이 잘 진행되면 Candy Machine에 구성된 매개변수를 따라 NFT가 생성됩니다. 예를 들어, 주어진 Candy Machine이 순차적이 false로 설정된 구성 라인 설정을 사용하는 경우 다음 아이템을 무작위로 가져올 것입니다.
Candy Guard 프로그램의 버전 1.0부터 민팅 명령어는 기존 payer 서명자와 다를 수 있는 추가 minter 서명자를 받아들입니다. 이를 통해 NFT를 민팅하는 지갑이 더 이상 SOL 수수료(저장 수수료 및 SOL 민팅 결제 등)를 지불할 필요가 없는 민팅 워크플로를 만들 수 있습니다. payer 서명자가 해당 수수료를 추상화하기 때문입니다. minter 서명자는 여전히 토큰 기반 수수료를 지불해야 하며 구성된 가드를 검증하는 데 사용됩니다.
최신 민팅 명령어는 상당한 양의 컴퓨팅 유닛을 사용하는 최신 토큰 메타데이터 명령어에 의존한다는 점에 주목하세요. 따라서 트랜잭션이 성공하도록 하기 위해 트랜잭션의 컴퓨팅 유닛 한도를 늘려야 할 수 있습니다. 우리의 SDK도 이를 도울 수 있습니다.
Candy Machine에서 민팅
구성된 Candy Guard 계정을 통해 Candy Machine에서 민팅하려면 mintV2 함수를 사용하고 민팅된 NFT가 속할 컬렉션 NFT의 민트 주소와 업데이트 권한을 제공할 수 있습니다. minter 서명자와 payer 서명자도 제공할 수 있지만 각각 Umi의 identity와 payer로 기본 설정됩니다.
위에서 언급했듯이 mintV2 명령어가 성공하도록 하기 위해 트랜잭션의 컴퓨팅 유닛 한도를 늘려야 할 수 있습니다. 아래 코드 스니펫에서 설명한 대로 mpl-toolbox Umi 라이브러리의 setComputeUnitLimit 도우미 함수를 사용하여 이를 수행할 수 있습니다.
pNFT를 민팅하고 싶고(예: 로열티 강제를 위해) Candy Machine을 그에 맞게 설정한 경우 tokenStandard 필드를 추가해야 합니다. 기본적으로 NonFungible이 사용됩니다. 이전에 Candy Machine을 가져온 경우 candyMachine.tokenStandard를 사용할 수 있고, 그렇지 않으면 @metaplex-foundation/mpl-token-metadata에서 tokenStandard: TokenStandard.ProgrammableNonFungible을 사용하여 직접 할당해야 합니다.
import { mintV2 } from '@metaplex-foundation/mpl-candy-machine'
import { setComputeUnitLimit } from '@metaplex-foundation/mpl-toolbox'
import { transactionBuilder, generateSigner } from '@metaplex-foundation/umi'
const nftMint = generateSigner(umi)
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
tokenStandard: candyMachine.tokenStandard,
})
)
.sendAndConfirm(umi)
mintV2 명령어는 기본적으로 민트 및 토큰 계정을 생성하고 NFT 소유자를 minter로 설정합니다. 미리 이를 직접 생성하고 싶다면 서명자 대신 NFT 민트 주소를 공개 키로 제공하면 됩니다. 다음은 mpl-toolbox Umi 라이브러리의 createMintWithAssociatedToken 함수를 사용한 예시입니다:
import { mintV2 } from '@metaplex-foundation/mpl-candy-machine'
import {
createMintWithAssociatedToken,
setComputeUnitLimit,
} from '@metaplex-foundation/mpl-toolbox'
import { transactionBuilder, generateSigner } from '@metaplex-foundation/umi'
const nftMint = generateSigner(umi)
const nftOwner = generateSigner(umi).publicKey
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(createMintWithAssociatedToken(umi, { mint: nftMint, owner: nftOwner }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint: nftMint.publicKey,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
})
)
.sendAndConfirm(umi)
Candy Machine Core 프로그램에서 직접 민팅하고 싶은 드문 경우에는 대신 mintFromCandyMachineV2 함수를 사용할 수 있습니다. 이 함수는 Candy Machine의 민트 권한을 서명자로 제공해야 하며 명시적인 nftOwner 속성을 허용합니다.
import { mintFromCandyMachineV2 } from '@metaplex-foundation/mpl-candy-machine'
import { setComputeUnitLimit } from '@metaplex-foundation/mpl-toolbox'
import { transactionBuilder, generateSigner } from '@metaplex-foundation/umi'
const nftMint = generateSigner(umi)
const nftOwner = generateSigner(umi).publicKey
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintFromCandyMachineV2(umi, {
candyMachine: candyMachine.publicKey,
mintAuthority: umi.identity,
nftOwner,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
})
)
.sendAndConfirm(umi)
API 참조: mintV2, mintFromCandyMachineV2
가드와 함께 민팅
많은 가드를 사용하는 Candy Machine에서 민팅할 때 추가적인 가드별 정보를 제공해야 할 수 있습니다.
민팅 명령어를 수동으로 구축하는 경우 해당 정보는 명령어 데이터와 나머지 계정의 혼합으로 제공됩니다. 그러나 우리의 SDK를 사용하면 민팅 시 추가 정보가 필요한 각 가드는 민팅 설정이라고 부르는 설정 세트를 정의합니다. 이러한 민팅 설정은 프로그램이 필요로 하는 모든 것으로 파싱됩니다.
민팅 설정이 필요한 가드의 좋은 예는 NFT Payment 가드입니다. 이 가드는 민팅 비용으로 사용해야 하는 NFT의 민트 주소와 기타 정보를 필요로 합니다.
사용 가능한 각 가드에는 자체 문서 페이지가 있으며 해당 가드가 민팅할 때 민팅 설정을 제공해야 하는지 여부를 알려줍니다.
민팅 설정이 필요하지 않은 가드만 사용하는 경우 위의 "기본 민팅" 섹션에서 설명한 것과 같은 방식으로 민팅할 수 있습니다. 그렇지 않으면 필요한 모든 가드의 민팅 설정이 포함된 추가 객체 속성을 제공해야 합니다. SDK를 사용하여 실제로 어떻게 보이는지 살펴보겠습니다.
가드와 함께 Candy Machine에서 민팅
Umi 라이브러리를 통해 민팅할 때 mintArgs 속성을 사용하여 필요한 민팅 설정을 제공할 수 있습니다.
다음은 추가 서명자가 필요한 Third Party Signer 가드와 지갑이 Candy Machine에서 몇 번 민팅했는지 추적하는 Mint Limit 가드를 사용한 예시입니다.
import {
some,
generateSigner,
transactionBuilder,
} from '@metaplex-foundation/umi'
import { create, mintV2 } from '@metaplex-foundation/mpl-candy-machine'
import { setComputeUnitLimit } from '@metaplex-foundation/mpl-toolbox'
// 가드가 있는 Candy Machine 생성.
const thirdPartySigner = generateSigner()
await create(umi, {
// ...
guards: {
thirdPartySigner: some({ signer: thirdPartySigner.publicKey }),
mintLimit: some({ id: 1, limit: 3 }),
},
}).sendAndConfirm(umi)
// Candy Machine에서 민팅.
const nftMint = generateSigner(umi)
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
mintArgs: {
thirdPartySigner: some({ signer: thirdPartySigner }),
mintLimit: some({ id: 1 }),
},
})
)
.sendAndConfirm(umi)
API 참조: mintV2, DefaultGuardSetMintArgs
가드 그룹과 함께 민팅
가드 그룹을 사용하는 Candy Machine에서 민팅할 때 레이블을 제공하여 민팅하려는 그룹을 명시적으로 선택해야 합니다.
또한 이전 섹션에서 설명한 대로 민팅 설정도 필요할 수 있습니다. 그러나 민팅 설정은 선택된 그룹의 "해결된 가드"에 적용됩니다.
예를 들어 다음과 같은 가드가 있는 Candy Machine을 상상해보세요:
- 기본 가드:
- Bot Tax
- Third Party Signer
- Start Date
- 그룹 1
- 레이블: "nft"
- 가드:
- NFT Payment
- Start Date
- 그룹 2
- 레이블: "public"
- 가드:
- Sol Payment
그룹 1("nft" 레이블)의 해결된 가드는:
- Bot Tax: 기본 가드에서.
- Third Party Signer: 기본 가드에서.
- NFT Payment: 그룹 1에서.
- Start Date: 그룹 1에서 (기본 가드를 재정의하므로).
따라서 제공된 민팅 설정은 이러한 해결된 가드와 관련되어야 합니다. 위의 예시에서 Third Party Signer 가드와 NFT Payment 가드에 대한 민팅 설정을 제공해야 합니다.
가드 그룹과 함께 Candy Machine에서 민팅
가드 그룹을 사용하는 Candy Machine에서 민팅할 때 선택하려는 그룹의 레이블을 group 속성을 통해 제공해야 합니다.
또한 해당 그룹의 해결된 가드에 대한 민팅 설정을 mintArgs 속성을 통해 제공할 수 있습니다.
다음은 위에서 설명한 예시 Candy Machine에서 Umi 라이브러리를 사용하여 민팅하는 방법입니다.
// 가드가 있는 Candy Machine 생성.
const thirdPartySigner = generateSigner()
await create(umi, {
// ...
guards: {
botTax: some({ lamports: sol(0.001), lastInstruction: true }),
thirdPartySigner: some({ signer: thirdPartySigner.publicKey }),
startDate: some({ date: dateTime('2022-10-18T17:00:00Z') }),
},
groups: [
{
label: 'nft',
guards: {
nftPayment: some({ requiredCollection, destination: nftTreasury }),
startDate: some({ date: dateTime('2022-10-18T16:00:00Z') }),
},
},
{
label: 'public',
guards: {
solPayment: some({ lamports: sol(1), destination: solTreasury }),
},
},
],
}).sendAndConfirm(umi)
// Candy Machine에서 민팅.
const nftMint = generateSigner(umi)
await transactionBuilder()
.add(setComputeUnitLimit(umi, { units: 800_000 }))
.add(
mintV2(umi, {
candyMachine: candyMachine.publicKey,
nftMint,
collectionMint: collectionNft.publicKey,
collectionUpdateAuthority: collectionNft.metadata.updateAuthority,
group: some('nft'),
mintArgs: {
thirdPartySigner: some({ signer: thirdPartySigner }),
nftPayment: some({
mint: nftFromRequiredCollection.publicKey,
destination: nftTreasury,
tokenStandard: TokenStandard.NonFungible,
}),
},
})
)
.sendAndConfirm(umi)
API 참조: mintV2, DefaultGuardSetMintArgs
사전 검증과 함께 민팅
일부 가드는 Candy Machine에서 민팅하기 전에 추가 검증 단계가 필요할 수 있다는 점이 중요합니다. 이 사전 검증 단계는 일반적으로 블록체인에 계정을 생성하거나 검증의 증거 역할을 하는 토큰으로 지갑에 보상합니다.
라우트 명령어 사용
가드가 사전 검증 단계를 요구할 수 있는 한 가지 방법은 "route" 명령어를 통해 자체 특수 명령어를 사용하는 것입니다.
좋은 예는 Allow List 가드입니다. 이 가드를 사용할 때 route 명령어를 호출하고 유효한 머클 증명을 제공하여 우리의 지갑이 사전 정의된 지갑 목록에 속한다는 것을 검증해야 합니다. 이 route 명령어가 성공하면 해당 지갑에 대한 Allow List PDA가 생성되며, 민팅 명령어가 이를 읽어 Allow List 가드를 검증할 수 있습니다. Allow List 가드에 대한 자세한 내용은 전용 페이지를 참조하세요.
외부 서비스 사용
가드가 해당 사전 검증 단계를 수행할 수 있는 또 다른 방법은 외부 솔루션에 의존하는 것입니다.
예를 들어 Gatekeeper 가드를 사용할 때 구성된 게이트키퍼 네트워크에 따라 Captcha 완료와 같은 도전을 수행하여 게이트웨이 토큰을 요청해야 합니다. 그러면 Gatekeeper 가드는 해당 게이트웨이 토큰의 존재를 확인하여 민팅을 검증하거나 거부합니다. Gatekeeper 가드에 대한 자세한 내용은 전용 페이지를 참조하세요.
봇 세금과 함께 민팅
Candy Machine에 포함하고 싶어할 가능성이 높은 가드 중 하나는 실패한 민팅에 구성 가능한 SOL 금액을 청구하여 봇으로부터 Candy Machine을 보호하는 Bot Tax 가드입니다. 이 금액은 일반적으로 실제 사용자의 진정한 실수에는 영향을 주지 않으면서 봇을 해치기 위해 작게 설정됩니다. 모든 봇 세금은 Candy Machine 계정으로 전송되므로 민팅이 끝나면 Candy Machine 계정을 삭제하여 이 자금에 액세스할 수 있습니다.
이 가드는 조금 특별하며 다른 모든 가드의 민팅 동작에 영향을 줍니다. Bot Tax가 활성화되고 다른 가드가 민팅 검증에 실패하면 트랜잭션이 성공한 것처럼 가장합니다. 즉, 프로그램에서 오류가 반환되지 않지만 NFT도 민팅되지 않습니다. 이는 자금이 봇에서 Candy Machine 계정으로 전송되려면 트랜잭션이 성공해야 하기 때문입니다. Bot Tax 가드에 대한 자세한 내용은 전용 페이지를 참조하세요.
결론
축하합니다! 이제 Candy Machine이 A부터 Z까지 어떻게 작동하는지 알게 되었습니다!
관심이 있을 수 있는 추가 읽기 자료는 다음과 같습니다:
- 사용 가능한 모든 가드: 사용할 수 있는 모든 가드를 살펴보고 필요한 것을 선별하세요.
- 첫 번째 Candy Machine 만들기: 이 가이드는 자산을 업로드하고 "Sugar"라는 CLI 도구를 사용하여 처음부터 새로운 Candy Machine을 만드는 데 도움을 줍니다.
