상세 컨텐츠

본문 제목

ERC-721(NFT) 토큰 발급 및 전송 실습

Programming Language/Solidity

by Yongari 2023. 2. 16. 15:47

본문

 

 

 

 

1. 리믹스 사이트에  접속합니다.

https://remix.ethereum.org/

 

Remix - Ethereum IDE

 

remix.ethereum.org

 

 

2. 파일을 만든 뒤 다음 솔리디티 코드를 넣어줍니다.

 

2-1 "test.sol" 과 같이 파일을 만듭니다.

(저는 YongNft.sol이라고 만들었습니다.)

 

 

2-2 ERC-721(NFT) solidity 코드 

 

 

다음 ERC721(NFT)코드는 오픈제플린 라이브러리를  참고해서 짧게 보이는 것이다. 사실은 굉장히 많은 코드를 함축적으로 가지고 있다. 실제 라이브러리 코드들이다.

2-2-1. ERC721.sol (NFT에 대한 주요 함수가 있는 솔리디티 코드, 승인, 토큰 전송등의 함수가 있다. )

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";


 

GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

OpenZeppelin Contracts is a library for secure smart contract development. - GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

github.com

 


2-2-2. Counters.sol  (구조체 Counter의 밸류값 지정, 증가, 감소, 리셋함수를 가지고 있는 솔리디티 코드)
import "@openzeppelin/contracts/utils/Counters.sol";
 
 

GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

OpenZeppelin Contracts is a library for secure smart contract development. - GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

github.com

 
 
2-2-3. Ownable.sol 
컨트랙트의 소유권을 관리하는 컨트랙트다.
 
  • 컨트랙트의 소유자만 실행할 수 있게 한다.
  • onlyOwner라는 modifier를 사용해서  함수를 실행하기 전 함수를 호출한 계정이 컨트랙트 소유자의 
    계정인지 확인함
  • mintNFT() 함수 실행 전에도 onlyOwner modifier를 통해 함수를 호출한 계정이 컨트랙트 소유자 계정인지 확인함 
import "@openzeppelin/contracts/access/Ownable.sol";

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol 

 

GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

OpenZeppelin Contracts is a library for secure smart contract development. - GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

github.com

 

 

 
 
2-2-4. ERC721URIStorage.sol 
 
ERC721URIStorage는 토큰의 정보를 저장하는 tokenURI를 관리하는 컨트랙트다. 
 
  • tokenURI는 이미지 주소 등 NFT의 특성을 저장하는 JSON 객체다.
  • mintNFT() 함수에서는 ERC721URIStorage 컨트랙트를 통해 tokenURI를 관리한다. 
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol

 

GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

OpenZeppelin Contracts is a library for secure smart contract development. - GitHub - OpenZeppelin/openzeppelin-contracts: OpenZeppelin Contracts is a library for secure smart contract development.

github.com

 

 

2-2-5. ERC721.sol 전체 코드 

//Contract based on [<https://docs.openzeppelin.com/contracts/3.x/erc721>](<https://docs.openzeppelin.com/contracts/3.x/erc721>)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

//오픈제플린 ERC721 솔리디티 코드 참고
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
//오픈제플린 연산에 대한 솔리디티 코드 참고 
import "@openzeppelin/contracts/utils/Counters.sol";
// 컨트랙트 주체가 Owner의 권한을 가지고 있는지 체크하는 솔리디티 코드
import "@openzeppelin/contracts/access/Ownable.sol";
//  TokenURI에 대한 솔리디티 코드 참고
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract MyNFTs is ERC721URIStorage, Ownable {
	//카운터 라이브러리를 쓰겠다. 데이터 타입은 Counters.Counter다. 
    using Counters for Counters.Counter;
    // Counters.Counter 데이터타입을 가진 private한 변수 _tokenIds 
    Counters.Counter private _tokenIds;
	
    //생성자 함수 
    constructor() public ERC721("MyNFT", "NFT") {}
	
    //NFT 생성함수 
    function mintNFT(address recipient, string memory tokenURI)
    	//오직 Owner만 접근 가능 
        public onlyOwner
        returns (uint256)
    {
    	//_tokenIds의 넘버를 증가시키는 함수 
        _tokenIds.increment();
		
        //현재 토큰아이디로 Mint 함수 호출 
        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
}

 

 

 

3. 왼쪽 세번째 버튼 Compile 버튼을 클릭해서 솔리디티 코드에 문제가 없는지 확인한다.

 

4. 배포환경 설정 왼쪽 4번째 탭 "Deploy & run transactions"를 클릭해서 이동한다. 

4-1 "ENVIRONMENT"에서 메타마스크와 연동한다 이 때 네트워크는 Goerli 이더리움 테스트 네트워크로 설정해야한다. 

 

4-2 Deploy를 클릭하면 다음과 같이 배포에 서명하라는 메타마스크 모달창이 나온다.

 

 

4-3 배포가 완료되면 메타마스크에서 활동에서도 볼 수 있고 이더스캔에서도 볼 수 있다.

 

메타마스크/활동 -> 트랜잭션 성공확인

 

EtherScan 이더스캔에서 확인하기

다음 화면처럼 트랜잭션을 확인할 수 있다.

 

https://goerli.etherscan.io/tx/0xa5fab0772628e9edd6dc4be10ff959ab65b47736fc83f5419d78f6e864cc30cc

 

Goerli Transaction Hash (Txhash) Details | Etherscan

Goerli (GTH) detailed transaction info for txhash 0xa5fab0772628e9edd6dc4be10ff959ab65b47736fc83f5419d78f6e864cc30cc. The transaction status, block confirmation, gas fee, Ether (ETH), and token transfer are shown.

goerli.etherscan.io

 

5. meta data를 추가하고 NFT 발급
(4번까지만 해도 발급이 완료되지만 이미지라던지 속성 같은 데이터를 더 추가해서 발급할 경우 다음과 같이 하면 됩니다.)

 

5-1 다음과 같은 json파일을 만듭니다. 그리고 json파일을 외부에서도 접속할 수 있는 다운로드 URL로 만들어줍니다. 

이건 클라우드를 이용하시거나 하시면 됩니다.

 

저의 경우에는 이미지 url을 github를 이용해서 만들었습니다. 

{
  "name": "Cute Doori ",
  "description": "Sleeping Doori", 
  "image": "이미지 URL", 
 "attributes": [
  {
       "animal": "dog",
       "name": "doori",
       "cute": "true"
  }
]
}

 

5-2 mintNFT 함수에 tokenURI에 json 파일 다운로드 링크 주소를 넣고 recipient에는 받을 계정 주소를 입력합니다.

저는 저의 메타마스크 계정 주소를 넣었습니다.

 

tokenURI: json 파일 다운로드 링크(외부에서 접속 가능한)

recipient : NFT 토큰을 받을 계정 주소 

 

 

 

 

발급이 완료되면 다음과 같이 이더스캔이나 메타마스크에서 트랜잭션을 확인할 수 있습니다.

 

메타마스크

 

이더스캔

 

https://goerli.etherscan.io/tx/0xc4234d134560d486f75e4166767828fae988691681e46651cef501cf2d2b638e

 

Goerli Transaction Hash (Txhash) Details | Etherscan

Goerli (GTH) detailed transaction info for txhash 0xc4234d134560d486f75e4166767828fae988691681e46651cef501cf2d2b638e. The transaction status, block confirmation, gas fee, Ether (ETH), and token transfer are shown.

goerli.etherscan.io

 

 

6. NFT 토큰을 전송하기 

 

6-1 먼저 owner가 operator에게 승인 권한을 줘야합니다. "isApprovedForAll" 함수를 사용합니다.
(owner: NFT 발행자, operator : 승인권한을 받을  사람)

 

 


6-2 안전하게 NFT를 전송하기 위해 safeTransferFrom 함수를 사용합니다. (받을 사람이 NFT를 받을 권한이 있는지 체크하는 함수입니다.)(from : NFT 발행자 or NFT 권한 있는사람  / to : 승인권한을 받을  사람) 

 

 

 

6-3 메타마스크로 전송 승인

 

 

 

6-4 메타마스크 및 이더스캔으로 거래 확인 

 

메타마스크



이더스캔 

https://goerli.etherscan.io/tx/0x5a77b6f0f94323bb2a65be28b16ac377e7c85527e2f16bf55a874f74a7a9ae2c

 

Goerli Transaction Hash (Txhash) Details | Etherscan

Goerli (GTH) detailed transaction info for txhash 0x5a77b6f0f94323bb2a65be28b16ac377e7c85527e2f16bf55a874f74a7a9ae2c. The transaction status, block confirmation, gas fee, Ether (ETH), and token transfer are shown.

goerli.etherscan.io

 

6-5 NFT를 받을 계정에서 Contract ID 값을 "토큰 가져오기"에서 대입 후 가져오기

 

 

 

 

 

 

관련글 더보기