코딩하는 문과생
[금융 프로그래밍] NFT 발행하기 본문
최근 NFT가 급격하게 성장하고 있다.
루나코인 폭락사태와 미국 발 금리인상으로 코인에 대한 가치가 급락하면서 코인에 대한 사람들의 불신은 늘어나고 있지만, 게임과 엔터산업 쪽은 NFT 사업에 대한 공격적인 투자를 하는 등 NFT는 이제 대세가 된 느낌이다. 게임, 엔터산업 외에도 은행과 대기업들이 하나 둘 뛰어들고 있고, 국내에서도 여러 기업들이 함께 손 모아 NFT 생태계를 구성하고자 하는 움직임을 보이고 있다.
이처럼 NFT 시장은 국내외를 막론하고 점점 커지고 있는 듯하다. 유형의 자산이 아닌 무형의 디지털 자산이 하나에 몇억에 거래되고 있고, 특히 이더리움 기반에서 처음 탄생한 크립토펑크 창시자는 NFT마다 희소가치를 다르게 하여 떼 돈을 번 일화는 유명하다.

NFT 구조도 궁금하고, NFT를 활용한 여러 비즈니스 아이디어도 궁금해서 이것 저것 알아본 걸 정리해보고자 한다.
추가로 NFT 민팅이 별로 어렵지 않아 Opensea 테스트서버(testnets.opensea.io)에 NFT 토큰을 발행하는 법도 간략히 정리해보고자 한다.
* OpenSea: NFT를 사고 팔수 있는 최대 거래플랫폼이다.
* IPFS(아이피에프에스): "InterPlanetary File System"의 약자로서, 분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하기 위한 프로토콜이다.
* 민팅: NFT를 처음으로 발행하는 것, 가상화폐로 디지털 자산을 구매하는 것
[정의]
- FT : Fungible Token
비트코인과 이더리움처럼 1 bitcoint은 다른 1 bitcoin과 대체될 수 있다. - NFT : Non-Fungible Token(대체 불가능한 토큰)
디지털 자산 하나에 가치가 매겨지는 것으로 다른 어떤 것과 대체될 수 없다.
[특징]
NFT는 블록체인기반으로 이루어지는 거래다.
모든 계약서 정보와 거래정보가 기록되기에 NFT간 거래는 투명하다할 수 있다.
1. 고유한 이미지를 ipfs라는 분산이미지 서버에 저장한다.
2. 저장된 이미지 주소와 이미지정보를 하나의 json파일로 만들어 또다시 ipfs 분산 저장소에 저장한다.
3. 여기서 저장된 ipfs주소가 스마트 컨트랙 위로 올라간다.
이러한 저장형태를 가지는 이유는 실제 블록체인에 저장되는 데이터를 최소화시켜 블록에 대한 transact를 실행할 때 비용을 최소화하는 데 의의가 있다.


오픈씨와 같은 NFT 거래소에서 블록체인에 있는 블록을 가져올 때 token URI 함수를 이용해 블록의 정보를 가져오는데, 이 때 IPFS에 저장된 json 정보를 토대로 오픈씨(OpenSea) 또는 Klaytn Scope 등에서 NFT 정보를 가져와 보여준다.


[NFT를 이용한 비즈니스]
NFT 를 이용한 여러가지 비즈니스가 있다.
- 커뮤니티 소속(Vip / 일반회원)
- 게임 아이템을 NFT화
- 가치저장소
- 저작권보호로 사용
- 경매
- 복권
[NFT 제작 흐름]
직접 스마트 컨트랙을 블록체인에 등록하여 웹사이트를 통해 민팅하기
가정 : NFT를 민팅할 때 Hidden된 이미지를 먼저 민팅하고, 특정일자에 Reveal 행사를 하는 경우가 있다. 이를 가정해서 test서버에 NFT를 발행해보고자 한다.
- 이미지 생성 : 파트제작 + 조합 생성
-> 피그마 또는 포토샵 이용 - ipfs에 이미지 및 JSON 파일 등록
- 스마트 컨트랙 작성
-> KIP17 기반 + 커스텀 코드로 작성 - Klaytn 블록체인에 Compile 및 Deploy 진행
- 웹사이트를 통해 일반 사람들에게 발행, 테스트 사용자 민팅
- OpenSea & Klaytn Scope에서 민팅내역 확인(Opensea에서는 가격을 부여해 selling도 가능하다)
1. 파트제작
피그마 사용
피그마 툴을 이용해 NFT로 발행하고 하는 디지털 자산을 만든다. 단, 하나의 이미지를 만든다기보다는 여러 조합가능한 그리고 동일 사이즈의 Component로 만들고 png파일로 export하도록 한다.
미술에 대한 식견과 실력이 없어... 그냥 대충 만들었다.
물고기 제작 : Junny GoldFish(생각나는 게 없어서...)
- Background : 4개
- Body : 4개
- Eyes : 5개
- Gill : 3개
- Mouth : 3개
- Tail : 2개
총 경우의 수 1440개

2. 조합생성
hashlips_art_engine 라이브러리를 사용하면 쉽게 이미지 조합을 만들 수 있다. 해당 라이브러리는 물고기 조합정보와 이름, 설명 등을 구성하는 json파일도 생성한다.
1. hashlips_art_engine을 로컬에 다운받아 에디터로 open한다.

2. 의존 라이브러리 설치
$ npm install
# 필요한 의존 라이브러리 설치
3. 컴포넌트들을 layers 밑으로 이동시킨다.

4. 명령어를 이용해 images 파일과 json 파일을 생성한다.
$ npm run build
# build 폴더에 설정한 값 기반으로 이미지 생성


// Json 파일
{
"name": "Junny Goldfish #1",
"description": "This is Junny Goldfish NFT collection made by Jun",
"image": "ipfs://QmaVMkZ8PSjqbNBicwshK78xqapcFotZ6NzjxLYzRQi7XN/1.png",
"dna": "c6df1ec958a69c0081475c541bbadf97fe54ff9f",
"edition": 1,
"date": 1659613369334,
"attributes": [
{
"trait_type": "Background",
"value": "Green"
},
{
"trait_type": "Tail",
"value": "Bread"
},
{
"trait_type": "Body",
"value": "Pink"
},
{
"trait_type": "Mouth",
"value": "White"
},
{
"trait_type": "Eye",
"value": "Normal"
},
{
"trait_type": "Gill",
"value": "Big"
}
],
"compiler": "HashLips Art Engine"
}
* 아래 명령어를 이용하여 쉽게 json파일 일괄 업데이트할 수 있다.
$ npm run update_info
# json 파일 일괄 업데이트
이후 ipfs 분산 저장소에 저장하기 위해서 Pinata를 사용해야 하는데, Reveal 행사 시나리오가 있고 Free 플랜이 100개 파일까지만 지원하므로 30개만 생성했다.
- 30개 reveal 이미지파일
- 30개 reveal json 파일
- 1개 hidden 이미지파일
- 30개 hidden json 파일
3. Pinata를 이용해 ipfs에 저장하기

- 30개 reveal 이미지파일
- 30개 reveal json 파일
- 1개 hidden 이미지파일
- 30개 hidden json 파일
[+Upload] 버튼을 클릭해서 쉽게 파일을 업로드할 수 있다.
이렇게 저장된 이미지와 json 파일은 블록체인에서 접근할 때 저장된 CID 앞에 ipfs://를 붙여 접근한다.(ipfs://AAA)
4. 블록체인 지갑 생성
블록체인 지갑을 이용해 블록체인을 배포하고 거래한다. 대표적인 지갑은 Metamask가 있지만, 클레이튼 블록체인 환경이므로 Kaikas를 이용하여 블록체인을 발행하고자 한다.
기능
- OpenSea 로그인
- Klaytn IDE 에서 컴파일 및 디플로이
1. 블록체인 지갑 생성 - Kaikas 지갑을 생성한다.
지갑 생성 시 시드구문은 잘 보관하도록 한다.

5. 스마트 컨트랙트 작성 및 배포
클레이튼 IDE를 이용하면 쉽게 컴파일과 배포를 할 수 있다.
https://ide.klaytn.foundation/
Klaytn IDE
ide.klaytn.foundation
컴파일

NFT 거래와 민팅에 필요한 코드를 작성후 컴파일을 진행한다.
필요한 코드는 아래 실타래 프로젝트와 조코딩님의 nft 프로젝트 코드를 참고하였다.
https://github.com/syl-codes/syltare-contract-v1
GitHub - syl-codes/syltare-contract-v1
Contribute to syl-codes/syltare-contract-v1 development by creating an account on GitHub.
github.com
https://github.com/JoCoding-Blockchain/kbirdz-contract
GitHub - JoCoding-Blockchain/kbirdz-contract
Contribute to JoCoding-Blockchain/kbirdz-contract development by creating an account on GitHub.
github.com
컴파일러 버전과 EVM Version을 잘 맞추어 컴파일을 진행하도록 한다.
- 컴파일러 버전: 0.5.17
- EVM Version: istanbul(테스트서버)
배포

- Environment: Baobab을 연결한다. Baobab은 테스트환경을 의미한다.
- Account: Kaikas 지갑을 연결하고
- Contract: KIP17~Token을 지정한다.
- DEPLOY: 토큰 이름(NAME)과 심볼(SYMBOL)을 입력 후 transact을 클릭하여 클레이튼 블록체인에 배포한다.

배포를 하게 되면 클레이튼 IDE 배포대시보드에 아래처럼 여러 호출 가능한 함수들이 나열된다. 주황색은 일부 gas fee를 블록체인에 제공하고 호출할 수 있는 함수이, 파란색으로 된 함수는 아무 fee 없이 호출 가능한 함수들이다.
- reveal : 해당 boolean 설정을 통해 NFT 디지털 자산을 드러낼 수도 안드러낼 수도 있다. reveal 행사 때 true로 변경하여 NFT 구매자들이 실제 자신이 구매한 NFT를 확인하도록 하는 이벤트를 할 수 있다.
- setBaseURI : 실제사진이 저장된 이미지의 정보가 담긴 ipfs uri를 지정한다.
- setNotRevealedURI : reveal 행사 전 보여줄 이미지의 정보가 담긴 ipfs uri를 지정한다.

Reveal 전후 NFT는 다음과 같다.


6. 퍼블릭 민팅 진행
- setupSale 함수에 퍼블릭 민팅을 진행할 NFT 수량 및 민팅시작블록번호 등 민팅에 필요한 정보를 작성 후 transact 진행
- setPublicMintEnabled를 true로 설정하고 transact 진행
true로 설정이후 publicMint를 호출하면 NFT 민팅을 할 수 있다. - 외부 홈페이지에서 publicMint함수를 이용해 NFT 민팅이 가능하다.


7. 외부 홈페이지에서 민팅하기
Netflify를 이용하면 간단하게 홈페이지를 호스팅할 수 있다.
Netlify: Develop & deploy the best web experiences in record time
A powerful serverless platform with an intuitive git-based workflow. Automated deployments, shareable previews, and much more. Get started for free!
www.netlify.com

배포 이후 사이트에 접속하여 지갑으로 로그인 후, [카이카스지갑연결] -> [민팅] 버튼을 클릭하면 NFT를 민팅할 수 있다.
민팅 클릭시 publicMint함수가 호출된다.



8 .민팅한 NFT Reveal 시뮬레이션
테스트 서버로 민팅을 하였으므로 opensea도 일반opensea가 아닌 테스트opensea에서 확인이 가능하다. 처음 민팅한 NFT는 Reveal되지 않은 Hidden NFT이다.
OpenSea, the largest NFT marketplace
OpenSea is the world's first and largest web3 marketplace for NFTs and crypto collectibles. Browse, create, buy, sell, and auction NFTs using OpenSea today.
testnets.opensea.io

실제 NFT를 일반사람들에게 나눠준 후, 특정일자에 reveal 행사를 진행한다면, 관리자는 아래 reveal함수를 호출하면 된다. true로 값을 설정하면 그 때 사람들이 소유한 NFT를 확인할 수 있다.

Reveal true로 설정후 opensea에서 보여지는 민팅한 NFT

9. 거래내역 확인


참고 url
http://wiki.hash.kr/index.php/IPFS
IPFS - 해시넷
IPFS(아이피에프에스)는 "InterPlanetary File System"의 약자로서, 분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하기 위한 프로토콜이다. 냅스터, 토렌트(Torrent) 등 P2P 방식으로 대용량 파일
wiki.hash.kr
https://github.com/HashLips/hashlips_art_engine
GitHub - HashLips/hashlips_art_engine: HashLips Art Engine is a tool used to create multiple different instances of artworks bas
HashLips Art Engine is a tool used to create multiple different instances of artworks based on provided layers. - GitHub - HashLips/hashlips_art_engine: HashLips Art Engine is a tool used to create...
github.com
Pinata | Your home for NFT media
Welcome to Pinata - Your home for NFT Media. We power the web3 space distributing content for NFTs across some of the top marketplaces, metaverses, apps and more. Get started today on your web3 journey.
www.pinata.cloud
https://ide.klaytn.foundation/
Klaytn IDE
ide.klaytn.foundation
https://github.com/syl-codes/syltare-contract-v1
GitHub - syl-codes/syltare-contract-v1
Contribute to syl-codes/syltare-contract-v1 development by creating an account on GitHub.
github.com
https://github.com/JoCoding-Blockchain/kbirdz-contract
GitHub - JoCoding-Blockchain/kbirdz-contract
Contribute to JoCoding-Blockchain/kbirdz-contract development by creating an account on GitHub.
github.com
Netlify: Develop & deploy the best web experiences in record time
A powerful serverless platform with an intuitive git-based workflow. Automated deployments, shareable previews, and much more. Get started for free!
www.netlify.com