DSRV
Published in

DSRV

[KO] 솔라나에서의 NFT 구현 2편: 캔디머신을 활용한 NFT 민팅 과정 이해하기

캔디머신을 이용하여 솔라나 NFT 민팅 과정 이해하기

시작하기 전에..

1. 실습해보기

1.1. 개발 환경 설정

ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts --help
alias candy-machine="ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts"

1.2. 캔디머신 업로드 파일 준비

nft-example
├── assets
│ ├── 0.json
│ └── 0.png
└── config.json
💡 우리가 이번 시간에 실습해볼 때는, whitelist mint 설정이나 hidden settings 등 자세한 설정을 제외한, NFT 발행에 필요한 기본값을 설정할 것입니다.
💡 Configuration의 각 설정 값이 궁금하시다면 아래 3. 부록을 참고해주세요!
[그림 2–1] DSRV 로고 이미지, 출처: DSRV

1.3. 캔디머신에 업로드

candy-machine verify_assets ./assets
candy-machine upload -e devnet -c example -k ~/.config/solana/devnet.json -cp config.json ./assets
💡 DSRV’s Tip: Arweave(알위브)란 무엇인가요? 
Arweave(알위브)는 Web3의 모든 데이터를 담아내려는 목표를 가진 탈중앙화 분산 스토리지 서비스입니다. 자체적으로 Blockweave와 Endowment Pool라는 방식을 사용하여 스토리지 서비스의 확장성을 높였습니다. NFT의 메타데이터를 담아내는 탈중앙화된 방식으로 IPFS와 Arweave 두 가지를 꼽아볼 수 있습니다. 솔라나 NFT 생태계에서는 주로 Arweave를 사용하여 메타데이터를 보관합니다. [3]

1.4. NFT 민팅

candy-machine verify_upload -e devnet -c example -k ~/.config/solana/devnet.json
verify_upload 명령어 수행 결과 화면
candy-machine mint_one_token -e devnet -c example -k ~/.config/solana/devnet.json
mint_one_token 명령어 수행 결과 화면

2. 전체 과정

캔디머신 사용 과정
[그림 2–2] 캔디머신 사용 과정, 출처: Twitter, @pencilflip
1번 및 2번 Instruction 수행 결과 화면
1번, 2번 및 3번 Instruction 수행 결과 화면
4번 Instruction 수행 결과 화면
5번 Instruction 수행 결과 화면

2.1. InitializeCandyMachine Instruction

캔디머신 Initialization 과정에서의 Account 도표
[그림 2–3] 캔디머신 Initialization 과정에서의 Account 도표, 출처: @c0wjay
💡 DSRV’s Tip: 캔디머신 PDA 계정은 어떻게 초기화 과정이 이루어지나요?
handle_initialize_candy_machine 은 캔디머신 프로그램 내부에서 캔디머신 PDA 계정을 초기화하는 과정입니다. 미리 생성만 된 PDA 계정을 캔디머신 프로그램이 넘겨 받은 후, 해당 PDA 계정을 초기화하는 작업만 캔디머신이 작업하는 것이라고 이해하시면 되겠습니다.
일반적으로 10KiB 용량보다 작은 Data Account의 경우에는 #[account(init)] attribute를 사용하여 프로그램이 생성과 동시에 초기화하는 것이 일반적입니다. 이 때, CPI를 활용하여 Data Account를 생성합니다.다만 10KiB 용량보다 큰 Account의 경우엔, 위 방식의 CPI를 통한 계정 생성 및 초기화가 불가능합니다. 이러한 용량 제한이 왜 존재할까요? 솔라나의 런타임이 계정을 생성할 때 미리 공간을 어느 정도 할당합니다. 이 때 CPI를 통해 계정의 크기를 사전 할당할 수 있는 “realloc” 리밋이 존재하는데, 이것이 10KiB입니다. 밸리데이터들의 RAM 용량을 너무 많이 차지하지 않도록 하기 위한 조치로 보입니다. [4]만약 10KiB 용량보다 큰 Account를 초기화하고 싶다면, CPI를 활용하지 않고 미리 System Program을 호출하여 PDA 계정만 생성시키고 빈 계정을 캔디머신에 넘겨, 캔디머신은 초기화만 합니다. [5]자세한 사항은 Anchor Language 문서에서 #[account(init, payer = <target_account>, space = <num_bytes>)]#[account(zero)] 애트리뷰트 설명을 확인하시기 바랍니다.PDA 계정의 초기화 과정은 3편 캔디머신 코드 분석에서 상세하게 설명하도록 하겠습니다.
🎛️ Config 설정 값의 예로는 go_live_date, gatekeeper, whitelist_mint_settings 등이 있습니다. 이에 대한 자세한 내용은 3. 부록 을 참고해 주세요.
💡 자세한 코드 이야기는 3편에서 다룰 예정이며, 구체적으로 각 인자들이 어떤 역할을 하는지에 대해서는 3. 부록을 참고해주세요!

2.2. MintNFT instruction

전체 캔디머신 Account 도표
[그림 2–4] 전체 캔디머신 Account 도표, 출처: @c0wjay
🎛️ DSRV’s Tip! MintNFT Instruction을 실행하기 전에 꼭 확인하세요.MintNFT Instruction이 실행되기 전에, NFT 자체는 이미 발행되어 있어야 합니다. 이 말은 위 도표에서 NFT Token Mint 계정과, Token Account는 미리 Token Program을 호출하여 만들어진다는 것입니다.이는 위에서 우리가 살펴봤던 예시 NFT의 블록 익스플로러를 확인해봐도 알 수 있습니다. 앞서 말했듯이, 1번부터 4번 instruction이 MintNFT instruction 실행 전에 이루어져, NFT에 대한 Mint account와 ATA를 생성하고, 해당 ATA에 토큰 1개를 민팅해줍니다.즉, 아래의 사항이 반드시 만족되어야 MintNFT Instruction을 실행할 수 있습니다.1. NFT의 Token Mint 계정이 생성되어 있어야 합니다. 
2. 해당 Token Mint 계정에 대한 ATA (Associated Token Account) 가 생성되어 있어야 합니다. 참고로, ATA는 NFT를 보관하기 위해 사용됩니다.
3. 1개의 NFT가 해당 ATA에 존재합니다.

2.3. 정리

캔디머신의 Instructions 목록

3. 부록

Config 설정 목록

글을 마무리하며..

--

--

[DSRV’s Official Publication on Medium | DSRV 공식 미디엄 채널입니다] “Onboarding the World to Web3”

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store