Metaplex 캔디머신v2를 사용해보자. (Solana, NFT, Metaplex, Candy Machine v2)

Jay Lee
11 min readJan 3, 2022

캔디머신2를 이용한 민팅 서비스를 만들어 보겠습니다.

프로젝트 개요

참조

https://github.com/alvinsga/candy-machine-v2

Solana 문서

Metaplex candy marchine v2 문서

개발환경

  1. Node.js
  2. Solana tool suite
  3. Metaplex
  4. Phantom
  5. Svelte

시작

개발환경이 갖춰져 있다고 가정하고 시작합니다.

🍭캔디머신2

왜 사용할까? 여러사람이 동시에 민팅할 경우, 보안 문제, 병렬처리 문제를 쉽게 해결해줍니다.

시작하기 전에, 팬텀지갑을 Devnet으로 바꿉니다.

위와 같이 보이면, 준비가 끝났네요.

🏦Metaplex!!

% git clone https://github.com/metaplex-foundation/metaplex.git ~/metaplex

종속성 설치

% yarn install --cwd ~/metaplex/js/

CMv2 버전 체크

% ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts --version
0.0.2

솔라나 주소 체크

% solana address2sTFsUw3yNK8A5UVsEk14D3xYReWtCoPGffej4yXHBBZ

솔 체크

% solana balance18.085220249 SOL

없으면 airdrop 합니다.

% solana airdrop 1Requesting airdrop of 1 SOLSignature: eZGwVctwSr5TKbibp9hjtoexbFLDvqgD85z7gRc7RpdWbm2ZpZdqFToN5kTdJ2cvLde9t3cBRU4pPYAyuGzZxBH19.085220249 SOL

CMv2에서는 YOUR_PROJECT_ROOT/candies/config.json파일에 설정값을 저장합니다.

https://docs.metaplex.com/candy-machine-v2/Configuration 에서 확인하세요.

Metaplex 문서에 나오는 최소 구성을 따르겠습니다.

이것은 최소 정보 입니다.

solTreasuryAccount를 본인 지갑으로 바꾸세요.

🎨아트 & 💿메타데이터

0.json , 0.png

이미지와 메타데이터 쌍을 준비합니다.

https://docs.metaplex.com/nft-standard ←참고하세요.

0부터 시작하여, 빈 숫자 없이 나열되어야합니다.

단순한 0.json 의 예)

{
"name": "Number #0001",
"symbol": "NB",
"description": "Collection of 10 numbers on the blockchain. This is the number 1/10.",
"seller_fee_basis_points": 500,
"image": "0.png",
"attributes": [
{"trait_type": "Layer-1", "value": "0"},
{"trait_type": "Layer-2", "value": "0"},
{"trait_type": "Layer-3", "value": "0"},
{"trait_type": "Layer-4", "value": "1"}
],
"properties": {
"creators": [{"address": "N4f6zftYsuu4yT7icsjLwh4i6pB1zvvKbseHj2NmSQw", "share": 100}],
"files": [{"uri": "0.png", "type": "image/png"}]
},
"collection": {"name": "numbers", "family": "numbers"}
}

메타데이터를 만들 때, 너무 긴 “name”을 사용하지마세요. 온체인에 올라가는 데이터입니다.

아래와 같이 보일 것입니다.

// NFT #1 
0.png 0.json
// NFT #2
1.png 1.json
// NFT #3
2.png 2.json
.
.
.

🍬캔디머신v2 만들기🍬

YOUR_PROJECT_ROOT/candies/assets 디렉토리를 만듭니다. 아트와 메타데이터를 복사해주세요.

candies % tree ./  -L 1./├── assets├── candies└── config.json

upload 명령을 실행합니다.

% ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts upload \
-e devnet \
-k /Users/jaylee/.config/solana/id.json \
-cp config.json \
-c example \
./assets

devnet에서 config.json을 따르고, example를 캐시파일접미사로 갖는 자산을 업데이트합니다. -k는 지갑쌍 위치입니다. (% solana config get 에서 확인)

Error: The file assets/.DS_Store is not a supported file type. 맥의 경우, .DS_Store 파일 때문에 에러가 발생할 수 있습니다. Finder로 디렉토리를 열면 자동 생성됩니다. .DS_Store을 지워주세요.

assets % rm -rf ./.DS_Store

실패시, 재실행할때는 .cache 안에 파일을 제거해주세요.

Beginning the upload for 20 (img+json) pairsstarted at: 1640846212270Size 20 { mediaExt: '.png', index: '0' }Processing asset: 0initializing candy machineinitialized config for a candy machine with publickey: 5Wv74JvnzCCkfLpuBcbNcBUAHzDfL9datKnkTKgfzL6qProcessing asset: 0Processing asset: 1Processing asset: 2Processing asset: 3Processing asset: 4Processing asset: 5Processing asset: 6Processing asset: 7Processing asset: 8Processing asset: 9Processing asset: 10Processing asset: 11Processing asset: 12Processing asset: 13Processing asset: 14Processing asset: 15Processing asset: 16Processing asset: 17Processing asset: 18Processing asset: 19Writing indices 0-9Writing indices 10-19Done. Successful = true.

이제 캐시를 확인해보세요.

5Wv74JvnzCCkfLpuBcbNcBUAHzDfL9datKnkTKgfzL6q ←캐디머신주소

% cat ./.cache/devnet-example.json

이번에는 데이터 검증입니다.

% ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts verify \
-e devnet \
-k /Users/jaylee/.config/solana/id.json \
-c example
wallet public key: 2sTFsUw3yNK8A5UVsEk14D3xYReWtCoPGffej4yXHBBZKey size 20uploaded (20) out of (20)ready to deploy!

이제 민트해봅니다.

candies % ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts mint_one_token \-e devnet \-k ~/.config/solana/id.json \-c example

민트가 성공하면, 확인할 수 있습니다.

candies % spl-token accountsToken                                         Balance---------------------------------------------------------------7jMP28VNSoK35hcXpNDYSyDRzx5QxPuLcYCjqRUmGZwB  1

https://explorer.solana.com/address/7jMP28VNSoK35hcXpNDYSyDRzx5QxPuLcYCjqRUmGZwB?cluster=devnet 위에 키로 브라우저에서 확인 가능합니다.

지갑에서 솔이 잘 나가고 있는지도 확인 가능합니다.

candies % solana balance17.945680586 SOLcandies % ts-node ~/metaplex/js/packages/cli/src/candy-machine-v2-cli.ts mint_one_token \-e devnet \-k ~/.config/solana/id.json \-c examplewallet public key: 2sTFsUw3yNK8A5UVsEk14D3xYReWtCoPGffej4yXHBBZNo instructions providedNo instructions providedmint_one_token finished 63z9tKhPMercbzC3CTHeuVxw9fDctPfrkbaWBs2ofKhc3RQBEZWaxQatp49SXvRyQ8nSSVdbzREDdj8hG9Jxjgidcandies % solana balance16.933694386 SOL

생성한 캐디머신 주소로 로그를 확인합니다. https://explorer.solana.com/address/5Wv74JvnzCCkfLpuBcbNcBUAHzDfL9datKnkTKgfzL6q?cluster=devnet

잘동작하는 걸로 보이는 군요.

📱프론트 페이지 (CMv2)

https://github.com/alvinsga/candy-machine-v2를 사용하겠습니다. 포크 후, 클론하세요.

YOUR_ROOT_PROJECT % git clone https://github.com/<YOUR_GIT_NAME>/candy-machine-v2 mintsite

YOUR_ROOT_PRJECT/mintsite/.env를 생성 후 추가합니다.

VITE_APP_CANDY_MACHINE_ID=<YOUR_CANDY_MACHINE_ID>
VITE_APP_SOLANA_NETWORK=devnet
VITE_APP_SOLANA_RPC_HOST=https://api.devnet.solana.com

YOUR_ROOT_PRJECT/mintsite/src/App.svelte 안에 키들을 원하는 값으로 바꾸세요.

/***********************************/  // Customise the app by changing the following variables.  
const TITLE = "Shapes";
const DESCRTIPTION = "A collection of shapes on the blockchain"; const HEADER_TITLE = "shapes.xyz";
const HEADER_LINK = "https://lanablocks.xyz";
// Your image or GIF needs to be in the /public folder for this to work const IMAGE_LINK = "/example.gif"; /***********************************/

종속성 추가 후 빌드

mintsite % yarn 
mintsite % yarn dev
Example

충분한 SOL이 들어 있는 팬텀지갑으로 연결 후, 민트해보세요. 민트 후 NFT는 팬텀 지갑에서도 확인 가능합니다.

민트 전, devnet인지 꼭 확인하세요.

--

--