[암호화폐] Solana 토큰 만들기 — MeMe Coin

Solana 토큰 만들기 — MeMe Coin

Jay Lee
 

12 min read

나도 solana로 밈코인 만들 수 있을까?

솔라나에 밈코인을 발행해보자.

프로젝트 개요

참조

Solana 문서

Metaplex 문서

개발환경

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

준비

필자는 맥 터미널로 진행합니다.

최신 solana cli를 설치합니다.

[참조: https://docs.solanalabs.com/cli/install]

sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)"

현재 필자의 환경

workspace % node -v                                
v20.8.0
workspace % npm -v
10.1.0
workspace % yarn -v
1.22.19
workspace % ts-node -v
v10.9.2
workspace % solana --version                                                
solana-cli 1.18.4 (src:356c6a38; feat:3352961542, client:SolanaLabs)

~/workspace 에서 진행합니다.

일단, 작업 디렉토리를 생성해요.

workspace % mkdir meme
workspace % cd meme
meme %

밈코인을 만들려면 두가지 리소스가 필요합니다.

  1. 토큰 이미지 파일
  2. 메터데이터 json 파일

토큰 이미지는 ai 이미지 생성기에서 돌려 얻어보겠습니다.

푸른 바다, 푸른 하늘의 독도를 그려달라고 해봤어요.

자! 이제, 이미지를 https://nft.storage/에 올립니다. ipfs를 사용하는 off-chain 분산 스토리지를 제공하는 무료 서비스입니다.

올라가면, 주소*(View URL)를 볼 수 있어요.

https://bafybeif2gqc72oeefebn77kp4iomrgshfevzxnuyre6eqnu7xara7anlgm.ipfs.nftstorage.link/

제 경우는 위와 같이 나왔어요.

JSON 파일을 준비해 봅시다. 저는 아래와 같이 만들고

{
  "name": "Dokdo Coin",
  "symbol": "DOK",
  "description": "Dokdo Coin",
  "image": "https://bafybeif2gqc72oeefebn77kp4iomrgshfevzxnuyre6eqnu7xara7anlgm.ipfs.nftstorage.link"
}

다시, https://nft.storage/ 에 올렸습니다.

https://bafkreico2rt2pdqy57nakinjq4egzyj63w4mu5hixun32nvnim6dzphzmm.ipfs.nftstorage.link/

이제, 위에 주소를 가지고, 토큰을 만들어 보겠습니다.

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

일단, 두개의 지갑(계좌, Keypair?)이 필요합니다.

  1. 발행인의 지갑(발행비 결제 및 토큰 소유주)
  2. 밈코인 자체의 주소가될 Keypair

이왕이면 의미있는 주소였으면 좋겠습니다. 그래서 아래와 같이 만들겠습니다.

# east로 시작하는 주소 생성
workspace % solana-keygen grind --starts-with east:1
# Dokdo로 시작하는 주소 생성
workspace % solana-keygen grind --starts-with Dokdo:1

필자는 아래의 두개의 지갑 파일이 나왔습니다.
eastQhAYNCtxPGhG6YWifPWo1P3FVsSaH97vUSmDHjE.json DokdodChquwPecMeimj7jPGncNHXoHHFdoCEKav5KAp4.json

리소스 준비가 끝났으니, 시작해보겠습니다.

mint.ts라는 파일을 만들겠습니다.

import { percentAmount, generateSigner, signerIdentity, createSignerFromKeypair } from '@metaplex-foundation/umi'
import { TokenStandard, createAndMint } from '@metaplex-foundation/mpl-token-metadata'
import { createUmi } from '@metaplex-foundation/umi-bundle-defaults';
import { mplCandyMachine } from "@metaplex-foundation/mpl-candy-machine";
import  "@solana/web3.js";
import secret from './eastQhAYNCtxPGhG6YWifPWo1P3FVsSaH97vUSmDHjE.json';
import dokdo from './DokdodChquwPecMeimj7jPGncNHXoHHFdoCEKav5KAp4.json';

const umi = createUmi('https://api.devnet.solana.com/'); //원하는 endpoint로 변경, 데브넷, 테스트넷, 메인넷
const userWallet = umi.eddsa.createKeypairFromSecretKey(new Uint8Array(secret));
const userWalletSigner = createSignerFromKeypair(umi, userWallet);
const mintKeypair = umi.eddsa.createKeypairFromSecretKey(new Uint8Array(dokdo));
const mintSigner = createSignerFromKeypair(umi, mintKeypair);

const metadata = {
    name: "Dokdo Coin",
    symbol: "DOK",
    uri: "https://bafkreico2rt2pdqy57nakinjq4egzyj63w4mu5hixun32nvnim6dzphzmm.ipfs.nftstorage.link",
};

const mint = mintSigner;// generateSigner(umi);
umi.use(signerIdentity(userWalletSigner));
umi.use(mplCandyMachine())

createAndMint(umi, {
    mint,
    authority: umi.identity,
    name: metadata.name,
    symbol: metadata.symbol,
    uri: metadata.uri,
    sellerFeeBasisPoints: percentAmount(0),
    decimals: 8,
    amount: 51751000_000_00000000,
    tokenOwner: userWallet.publicKey,
    tokenStandard: TokenStandard.Fungible,
    }).sendAndConfirm(umi).then(() => {
    console.log("Successfully minted 1 million tokens (", mint.publicKey, ")");
});

일단, 환경을 확인해보겠습니다.

meme % solana config get
Config File: /Users/kjaylee/.config/solana/cli/config.yml
RPC URL: https://api.testnet.solana.com 
WebSocket URL: wss://api.testnet.solana.com/ (computed)
Keypair Path: /Users/kjaylee/workspace/solana.keys/DTPRZ8VZtcjmb9vxB8VRqsX7QKEp69ASgwHrWTtv7s38.json 
Commitment: confirmed

testnet으로 되어 있군요. 제가 주로 쓰는 Keypair(지갑)이 등록되어 있고요.

이 두개를 바꾸겠습니다. devnet으로 해보죠.

[참조: https://solana.com/docs/core/clusters]

meme % solana config set --url https://api.devnet.solana.com
Config File: /Users/kjaylee/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com 
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: /Users/kjaylee/workspace/solana.keys/DTPRZ8VZtcjmb9vxB8VRqsX7QKEp69ASgwHrWTtv7s38.json 
Commitment: confirmed

meme % solana config set --keypair ./eastQhAYNCtxPGhG6YWifPWo1P3FVsSaH97vUSmDHjE.json 
Config File: /Users/kjaylee/.config/solana/cli/config.yml
RPC URL: https://api.devnet.solana.com 
WebSocket URL: wss://api.devnet.solana.com/ (computed)
Keypair Path: ./eastQhAYNCtxPGhG6YWifPWo1P3FVsSaH97vUSmDHjE.json 
Commitment: confirmed

airdrop부터 하나 받고 하겠습니다.

당연하게도, 돈이 있어야 돈이 발행됩니다.

meme % solana airdrop 1
Requesting airdrop of 1 SOL

Signature: 5ciDBVVhJyi1HqsLZbST9FfMbWvQsLvSikXzFrsRXNfXNY7hrwKkdw8toB4gaKqDyU4NyCjdh8j1CW3pQGtJkTeU

1 SOL

meme % solana account eastQhAYNCtxPGhG6YWifPWo1P3FVsSaH97vUSmDHjE     

Public Key: eastQhAYNCtxPGhG6YWifPWo1P3FVsSaH97vUSmDHjE
Balance: 1 SOL
Owner: 11111111111111111111111111111111
Executable: false
Rent Epoch: 18446744073709551615

잘 들어온게 확인이 되죠? 아래, 소수점 표현 8과, amount는 정하시면 됩니다. (대한민국 1인당 1000개?)

...
decimals: 8,
amount: 51751000_000_00000000,
...

이제, 필요한 초기화를 하겠습니다.

meme % yarn init --yes
yarn init v1.22.19
warning The yes flag has been set. This will automatically answer yes to all questions, which may have security implications.
success Saved package.json
✨  Done in 0.03s.

meme % tsc --init

Created a new tsconfig.json with:                                                                                       
                                                                                                                     TS 
  target: es2016
  module: commonjs
  strict: true
  esModuleInterop: true
  skipLibCheck: true
  forceConsistentCasingInFileNames: true


You can learn more at https://aka.ms/tsconfig

tsconfig.json 파일을 열어서, 아래 줄을 찾아 주석을 제거해서 활성화해주세요.

"resolveJsonModule": true

필요한 라이브러리 설치

meme % yarn add @solana/web3.js @metaplex-foundation/umi @metaplex-foundation/mpl-token-metadata @metaplex-foundation/umi-bundle-defaults @metaplex-foundation/mpl-candy-machine bs58

밈코인 생성!!

meme % ts-node mint.ts                                             
Successfully minted 1 million tokens ( DokdodChquwPecMeimj7jPGncNHXoHHFdoCEKav5KAp4 )

https://explorer.solana.com/address/DokdodChquwPecMeimj7jPGncNHXoHHFdoCEKav5KAp4?cluster=devnet

짜잔@@~

[출처] https://pipln.medium.com/solana-%ED%86%A0%ED%81%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0-meme-coin-468565705cb4

 

 

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
공지 오라클 기본 샘플 데이터베이스 졸리운_곰 2014.01.02 86034
공지 [SQL컨셉] 서적 "SQL컨셉"의 샘플 데이타 베이스 SAMPLE DATABASE of ORACLE 가을의 곰을... 2013.02.10 78561
공지 [G_SQL] Sample Database 가을의 곰을... 2012.05.20 95291
14 [SQLite]10만 TPS와 10억 행 처리: SQLite의 놀라운 효율성 졸리운_곰 2025.12.05 1184
13 [sqlite] SQlite source code analysis-architecture file 졸리운_곰 2021.04.12 1806
12 [SQLite] SQLite 사용자 함수 추가 졸리운_곰 2021.04.12 1662
11 {SQLite] SQLite 페이지 핸들링(3) - 레코드 포맷 졸리운_곰 2021.04.12 1665
10 [SQLite] SQLite 페이지 핸들링(2) - SQLite의 페이지 포맷 file 졸리운_곰 2021.04.12 1495
9 [SQLite] SQLite 페이지 핸들링(1) - SQLite의 구조 file 졸리운_곰 2021.04.12 1486
8 [C/C++ 자료구조] SQLite 의 모든 것 (4부) - Java 에서 사용하기 Database/SQLite file 졸리운_곰 2021.04.12 1662
7 [C/C++] SQLite 의 모든 것 (3부) - C++ 에서 사용하기 Database/SQLite 졸리운_곰 2021.04.12 1719
6 [C/C++ 자료구조] SQLite 의 모든 것 (2부) - Download & Build Database/SQLite file 졸리운_곰 2021.04.12 1665
5 [C/C++ 자료구조] SQLite 의 모든 것 (1부) - 소개 및 FAQ Database/SQLite file 졸리운_곰 2021.04.12 1330
4 SQLite-sync.com version 3 file 졸리운_곰 2017.07.03 2017
3 DB Browser for SQLite file 졸리운_곰 2017.04.26 1651
2 Getting started with SQLite in C# file 졸리운_곰 2017.04.24 1828
1 SQLite C/C++ Tutorial 졸리운_곰 2017.04.24 1496
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED