Minting Nft
나만의 NFT 만들기
remix, pinata 를이용해서 Sepolia test net 에 NFT 를 배포하는 법을 알아보자
NFT란 무었인가?
NFT: Non-Fungible Tokens
한글로 번역하면 뭔가를 다른 무엇인가로 바꿀수 없는 토큰이다.
NFTs are tokens that we can use to represent ownership of unique items*. They let us tokenise things like* art, collectibles, even real estate. They can only have one official owner at a time and they’re secured by the Ethereum blockchain – no one can modify the record of ownership or copy/paste a new NFT into existence.
NFT 는 토큰이지만 보통 토큰과는 다르다. 그림, 소장품, 부동산 등 사물을 토큰화하여 그것에대한 소유를 나타내 주는 토큰이다. 예를 들어서 그림을 NFT 로 만들 수 있다. 블록체인 상에서 어떤 그림을 토큰화 하여서 그것을 토큰처럼 거래할 수 있고 소유할 수 있다.
해당 그림을 블록체인 위해서 토큰화하여 소유하거나 다른사람에게 보낼 수 있게 되는 것이다.
지금부터 NFT 를 생성하는 방법을 알아 보겠다.
사전에 필요한것
개인 그림: 아무 그림이나 상관 없다. 자신이 그린 그림, 사진 등등. 딱히 할만한게 없다면 그림 AI 생성기를 이용해서 만들어보자 DALLE
Sepolia faucet 으로 ETH 를 받는다.
Pinata 계정
NFT 를 배포하는 과정을 간략하게 설명하면 다음과 같다. 스마트 컨트렉트에 ERC-721 token contract 코드를 작성한뒤 배포하면 된다.
해당 스마트 컨트렉트에서 가장 중요한건 token 의 metadata 가 저장되어 있는 URL 이다. 해당 URL 은 어떻게 만들어 지며 어떠한 정보가 저장되어 있을까?
NFT metadata
metadata 에는 NFT 에대한 정보가 저장되어 있다. 예를들어 NFT 의 이름, 사진, 설명, 특성 등이 있을 수 있다.
가장 보편적으로는 JSON 파일 형태로 저장된다. 예를 들면 다음과 같이 작성할 수 있다.
{
"description": "Winnie the Pooh created by DALL E",
"image": "ipfs:///QmU2Wf4z4w6VSwPUMgWCq3UwCgRAG5EQtkFHqXkz8sRtz9",
"name": "WINNIE_SECOND"
}
해당 metadata 가 저장되어 있는 URL 을 만들려면 어떻게 해야할까??
- blockchain 위에 metadata 를 저장한다.
- IPFS 를 사용한다.
- JSON file 을 반환하는 API 를 만든다.
첫번째랑 두번째 방법이 가장 많이 쓰인다. 첫번째 방법은 해당 metadata 를 저장하고 호출하는데에 ETH 가 쓰일 수 있어서 비싸다. 따라서 pinata 를 이용한 두번째 방법으로 해보도록 하겠다.
세번째 방법은 peer-to-peer network가 아니다. 이는 블록체인이 쓰이는 의미 퇴색시키므로 잘 쓰이지 않는다.
IPFS 란 무었인가?
IPFS - InterPlanetary File System
IPFS is a modular suite of protocols for organizing and transferring data, designed from the ground up with the principles of content addressing and peer-to-peer networking.
IPFS 는 분산형 파일 시스템에 데이터를 저장하고 인터넷으로 공유하기 위한 protocol 이다. 이는 탈중앙화 웹으로 하나의 서버가 다운되거나 파괴되더라도 파일을 안전하게 보관 할 수 있다.
그럼 본격적으로 pinata 에서 해당 metadata 를 저장해보자.
먼저 pinata 에 그림파일을 업로드 한후에 해당 CID number 를 복사한다.
metadata.json 파일에 해당 NFT 의 이름, image url, description 등을 작성 한뒤에 pinata 에 업로드 한다. 여기에서 image 에는 ipfs:// 뒤에 복사한 CID number 를 넣어준다.
{
"description": "Winnie the Pooh created by DALL E",
"image": "ipfs:///QmU2Wf4z4w6VSwPUMgWCq3UwCgRAG5EQtkFHqXkz8sRtz9",
"name": "WINNIE_SECOND"
}
ERC-721 token contract
remix 에서 ERC-721 contract 를 작성 해 보자. ERC-721 이 궁금하다면 하이퍼 링크를 참고하라.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >= 0.7.0 < 0.9.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract MyToken is ERC721 {
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
constructor() ERC721("TOKEN_NAME", "TOKEN_SYMBOL") {}
function _baseURI() internal pure override returns (string memory) {
return "YOUR_URL";
}
function mintNFT(address to)
public returns (uint256)
{
require(_tokenIdCounter.current() < 2);
_tokenIdCounter.increment();
_safeMint(to, _tokenIdCounter.current());
return _tokenIdCounter.current();
}
}
NFT 확인하기
- metamask wallet: 자신의 metamask 에서 NFT 섹션에 NFT 가져오기 버튼을 눌러서 deploy 된 contract 의 주소와 아이디를 넣어주고 가져와 주면 metamask 지갑에서 볼 수 있다. 아이디는 1 을 입력 하면되는데 이는 위에 코드에서 _tokenIdCounter 이다.
해당 NFT 를 가져오게 되면 metamask 지갑에서 확인 할 수 있다.
- opensea: opensea testnet 에서 배포된 contract 주소를 치면 NFT를 볼 수 있다. Opensea 에서 NFT 를 거래하는 것 도 가능하다.