Metaplex 캔디머신v2를 사용해보자. (Solana, NFT, Metaplex, Candy Machine v2)
캔디머신2를 이용한 민팅 서비스를 만들어 보겠습니다.
프로젝트 개요
참조
https://github.com/alvinsga/candy-machine-v2
개발환경
- Node.js
- Solana tool suite
- Metaplex
- Phantom
- 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를 본인 지갑으로 바꾸세요.
🎨아트 & 💿메타데이터
이미지와 메타데이터 쌍을 준비합니다.
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 examplewallet 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
충분한 SOL이 들어 있는 팬텀지갑으로 연결 후, 민트해보세요. 민트 후 NFT는 팬텀 지갑에서도 확인 가능합니다.
민트 전, devnet인지 꼭 확인하세요.