2-1 "test.sol" 과 같이 파일을 만듭니다.
(저는 YongNft.sol이라고 만들었습니다.)
다음 ERC721(NFT)코드는 오픈제플린 라이브러리를 참고해서 짧게 보이는 것이다. 사실은 굉장히 많은 코드를 함축적으로 가지고 있다. 실제 라이브러리 코드들이다.
2-2-1. ERC721.sol (NFT에 대한 주요 함수가 있는 솔리디티 코드, 승인, 토큰 전송등의 함수가 있다. )
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
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
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
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
6-5 NFT를 받을 계정에서 Contract ID 값을 "토큰 가져오기"에서 대입 후 가져오기
크레덴셜, issuer를 활용한 졸업증명서 발급 실습 - Solidity (2) | 2023.02.24 |
---|---|
로컬 컴퓨터와 Remix 연결하기 (0) | 2023.02.16 |
ERC-721(NFT) Solidity 코드 및 토큰 분석 (0) | 2023.02.15 |
ERC-20 토큰 - 개선(SafeMath, OwnerHelper, TokenLock 추가) (0) | 2023.02.15 |
ERC-20 토큰(나만의 토큰 만들기 실습) (0) | 2023.02.13 |