Blockchain

#28 ERC-721 토큰 만들기

Sila 2022. 7. 26. 19:33

ERC721 토큰은 우리가 nft, non-fungible token이라고 부르는 것들이다. 

 

ERC-20이 우리가 실생활에 사용하는 현금처럼 천원 짜리는 다 똑같은 천원짜리로 생각한다면

 

nft는 토큰인데, 각 토큰이 전부 구별 가능한 특성을 지닌 토큰이다.

 

그렇기 때문에 ERC-20 토큰을 2개 줄땐 그냥 줄 토큰의 갯수를 입력하면 되지만, ERC-721 토큰을 줄 때는 내가 가진

 

어떤 토큰을 줄 것인지를 명확하게 특정지어 주어야 한다.

 

이번에는 직접 nft를 민팅해보고 내 nft의 소유권을 다른 사람에게 이전해보는 과정을 공부해보도록 하자.

 

erc-721 토큰도 ERC-20처럼 이미 그에 맞는 기능들이 전부 openzeppelin에 구현되어 있지만 이를 그냥 사용하기 보다

 

이 함수들이 어떤 식으로 작동하는지를 직접 써가면서 익혀본다.

 

네트워크는 ganache를 이용하고, 우선 truffle에서 솔리디티 코드를 작성하지만,

 

remix.ethereum 웹 페이지에서 배포를 진행할 예정이다.

 

1. setup

우선 트러플을 실행하고, openzeppelin을 설치한다.

 

truffle init

npm init -y

npm i openzeppelin-solidity

 

이를 remix.ethereum 웹 페이지와 연동해 사용하기 위해 remix-project를 설치한다.

 

npm i -g @remix-project/remixd

 

이제 토큰을 만들기 위해 기본적인 골격을가진 솔리디티 파일을 가져오는데, 이는 openzeppelin에 동봉되어 있다.

 

/*  truffle/contracts/Minting.sol  */

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

import "../node_modules/openzeppelin-solidity/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
// ERC721Enumerable 컨트랙트를 가져온다.
// ERC721Enumerable 컨트랙트가 이미 ERC721 컨트랙트를 상속하고 있으므로 이것만 가져오면 된다.

contract Minting is ERC721 {
    // 컨트랙트에 ERC721을 상속시킨다.
    constructor (string memory _name, string memory _symbol) ERC721 (_name, _symbol) {}
    // 생성자 함수에 ERC721의 _name, _symbol의 value를 상속받으려면 
    // 다음과 같이 컨트랙트 이름과 상속받을 값들을 써주면 된다.
}

 

이번에 만들 컨트랙트에는 민팅 함수 (토큰 생성 기능)와

 

그 token에 대한 정보(json)를 응답으로 주는 URI 를 리턴해주는 함수만을 넣을 것이다.

 

우리가 nft라고 부르는 그림 등도 결국 이런 형식으로 저장된다.

 

다음과 같이 함수들을 추가한다.

 

/* truffle/contracts/Minting.sol  */

// ...중략

contract Minting is ERC721 {
    constructor (string memory _name, string memory _symbol) ERC721 (_name, _symbol) {}
    
    function _minting(uint256 _tokenId) public {
        _mint(msg.sender, _tokenId);
    }
    
    function tokenURI(uint256 _tokenId) public pure override returns (string memory) {
        return "https://gateway.pinata.cloud/ipfs/QmPwjnvWYN4etA5eW4yAbWCTy2ukEC1Jj5417VLGyH5XpU/1/1.json";
    }
}

 

원래라면 URI도 토큰 아이디에 따라 달라지는 변수를 넣어줘야 하겠지만 이번에는 예시로 만들어보는 것이므로 미리 정해둔

 

URI를 리턴값으로 준다.

 

이제 작성한 솔리디티 파일을 remix에서 컴파일, 배포해볼 것이다.

 

ganache-cli 네트워크를 구동하고 터미널에 다음과 같이 입력해 remix 사이트와 연동한다.

 

remixd -s . --remix-ide https://remix.ethereum.org

 

사이트에 접속하면 다음과 같다.

 

 

여기서 빨강색으로 된 부분 화살표를 클릭해 'click to localhost'를 선택해 로컬 호스트의 네트워크 즉, ganache와 연결해준다.

 

 

연결이 잘 되었다면 우리가 작성한 Minting.sol 파일을 선택하고 3번째 탭으로 넘어가 솔리디티 버전을 맞추고 컴파일 해준다.

 

 

Compile 버튼을 누르면 알아서 컴파일 해준다.

 

다음으로 4번째 탭으로 넘어와 배포 설정을 다음과 같이 세팅해준다.

 

환경을 ganache로 맞추고 배포할 컨트랙트를 설정한 뒤, _name, _symbol 값을 원하는대로 적고 transact 버튼을 클릭한다.

 

 

tx가 잘 진행되었다면 하단의 deployed contract에 우리의 컨트랙트, 그 안에 있는 함수가 나타날 것이다.

 

주황색은 컨트랙트내의 상태 변수등을 수정하거나 하는 (가스비가 나올 가능성이 높은) 함수들이고,

 

청색은 컨트랙트 내의 데이터를 불러와서 값을 확인할 수 있는 종류의 함수들이다.

 

우리가 작성한 _minting함수를 실행시켜보자.

 

 

_minting함수를 클릭하면 필요한 매개 변수를 직접 입력할 수 있다.

 

첫 토큰 생성이므로 1을 넣고 transact버튼을 누르면 민팅함수가 실행될 것이다.

 

잘 되었는지 확인하려면 민팅된 토큰의 tokenURI를 확인해보면 된다.

 

이를 위해 최하단의 tokenURI의 함수를 활용해볼 것인데, 1번 토큰의 uri를 보려면 1을 입력 후 call을 클릭하면

 

바로 아래에 결과값으로 우리가 입력한 uri가 나올 것이다.

 

해당 uri에 접속해보면 응답으로 미리 만들어둔 json 파일을 보여줄 것이다. (우리 nft와는 별 상관 없음)

 

우리가 nft라고 부르는 음악이나 그림도 이런 식으로 json 형태로 정보를 저장하는 것이다.

 

다음 글에서는 오늘 배운 nft의 동작 방식을 이용해 본격적으로 거래 기능등을 가진 토큰에 관련된 컨트랙트를 만들어보자.