Mint NFT

심재원·2023년 12월 6일
1

Solidity Code Type

function x() private {}

-> 바깥에서 실행불가
컨트랙트 내부에서만 실행됨

 function y() public {
 	x();
 }

-> x는 바깥에서 실행할 수 없지만 x는 y내에서 실행 가능 -> 가시성
private 함수는 상황에 맞게 꺼내서 쓰는 것
언제 어디서나 다 실행가능.

ex)

function mint() public {}

->internal 함수 : public함수에서 쓰는 것 : 감춰놓은 것

contract Z is MinToken {
function zz() public {
x();
}
}
-> x가 private면 상속받은 z컨트랙트에서 실행할 수 없는데
internal이면 실행 가능( function x() internal {})


함수의 호출범위

public : 언제 어디서든 누구나
private : 자기 자신
internal : 내부에서뿐만 아니라 상속 받은 애까지는 허용해주자
external : 내부에서는 안 되고 외부에서는 가능. 인터페이스 만들 때 사용.

NFT(Non-Fungible-Token)

decimals

ERC-20은 10^18이기 때문에 18. 0.000001 이런 식으로 쪼갤 수 있음.
nft는 1이기 때문에 대체불가능.
화폐처럼 가치가 같음.

ERC-721은 10^0이기 때문에 1.
쪼갤 수 없음.
각자 ID값이 있고 각각 가치가 다름

10의18승 = 18 decimal(ERC20 단위)
10의0승 = 1 decimal(ERC721 단위) 쪼갤수 없음 + id값을 갖고있기 때문에 가치부여가능

ERC-721 -> 1개 발행 한정판
ex) 미술품 nft

ERC-1155 -> 기성품
ex) 게임 아이템 nft

VS Code & Terminal

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

Remix Code

https://docs.openzeppelin.com/contracts/5.x/erc721
https://docs.openzeppelin.com/contracts/5.x/api/token/erc721#ERC721

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

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

contract MintNFT is ERC721Enumerable {
    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}

    function mintNFT() public {
        _mint(msg.sender, 1); 
        -> msg.sender : 함수를 실행시키는 주체(사람 or 스마트컨트랙트)
    }
}

NFT의 기본 코드 포맷

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

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

contract MintNFT is ERC721Enumerable {
    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}

    function mintNFT() public {
        uint tokenId = totalSupply();

        _mint(msg.sender, tokenId);
    }
}

Deploy-Contract transaction Pending
MintNft Pending

https://testnets.opensea.io/ 에서 확인

테스트넷 : 돈 버릴 수도 있으니 테스트 용도로 써라

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
->편의기능이 붙어있는 enumerable을 가져옴

contract MintNFT is ERC721Enumerable {
    mapping(uint => string) metadataURIs;
->숫자를 받으면 숫자에 해당하는 문자열(메타데이터주소) 생성
    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}
-> 하드 코딩한 게 아니라 바깥에서 입력받을 수 있게 구현

    function mintNFT(string memory _metadataURI) public {
    ->바깥으로부터 메타데이터 주소를 입력 받으면
        uint tokenId = totalSupply() + 1;
	->total supply(총 nft 발행량)
        _mint(msg.sender, tokenId);
	->몇 번째 토큰인지 
        metadataURIs[tokenId] = _metadataURI;
    } -> 메타데이터와 토큰아이디 연결

    function tokenURI(uint _tokenId) public view override returns(string memory) {
        return metadataURIs[_tokenId];
    }-> ERC721 안에 tokenURI가 있었음. view 읽기전용. 각 토큰 아이디에 관한 메타데이터 주소
}
// SPDX-License-Identifier: MIT
// SPDX-License-Identifier는 솔리디티 파일의 라이선스를 지정하는 주석입니다.

pragma solidity ^0.8.20;
// pragma solidity는 솔리디티 컴파일러 버전을 지정하는 pragma입니다.
// ^0.8.20은 0.8.20 버전 이상을 사용하도록 선언합니다.

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
// @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol은 OpenZeppelin 라이브러리에서 제공하는 ERC721Enumerable 스마트 계약을 가져오는 import 문입니다.
// ERC721Enumerable은 ERC721 표준에 열거 가능한 기능을 추가한 스마트 계약입니다.

contract MintNFT is ERC721Enumerable {
    // MintNFT는 ERC721Enumerable 스마트 계약을 상속받는 스마트 계약입니다.

    mapping(uint => string) metadataURIs;
    // metadataURIs는 각 토큰 ID에 해당하는 메타데이터 URI를 저장하기 위한 매핑(mapping)입니다.

    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {}
    // constructor는 스마트 계약의 생성자 함수입니다.
    // _name과 _symbol은 ERC721 스마트 계약의 생성자에 전달되는 이름과 심볼을 나타냅니다.
    // ERC721(_name, _symbol)은 상위(부모) 스마트 계약의 생성자를 호출하여 이름과 심볼을 설정합니다.

    function mintNFT(string memory _metadataURI) public {
        // mintNFT는 새로운 NFT(Non-Fungible Token)을 발행하는 함수입니다.
        // _metadataURI는 새로운 토큰의 메타데이터 URI를 나타냅니다.

        uint tokenId = totalSupply() + 1;
        // totalSupply()는 현재 발행된 토큰의 총량을 반환하는 함수입니다.
        // 새로운 토큰 ID는 현재 총 발행량에 1을 더한 값으로 설정됩니다.

        _mint(msg.sender, tokenId);
        // _mint는 ERC721 라이브러리에서 상속한 함수로, 새로운 토큰을 발행하는 역할을 합니다.
        // msg.sender는 현재 함수를 호출한 주체(사람 또는 스마트 계약)의 주소를 나타냅니다.
        // 따라서 새로운 토큰은 함수를 호출한 주체에게 발행됩니다.

        metadataURIs[tokenId] = _metadataURI;
        // metadataURIs 매핑에 새로운 토큰 ID와 메타데이터 URI를 연결하여 저장합니다.
    }

    function tokenURI(uint _tokenId) public view override returns (string memory) {
        // tokenURI는 특정 토큰 ID에 대한 메타데이터 URI를 반환하는 함수입니다.
        // override 키워드는 부모 스마트 계약(ERC721Enumerable)의 동일한 이름의 함수를 재정의한다는 것을 나타냅니다.

        return metadataURIs[_tokenId];
        // 주어진 토큰 ID에 해당하는 메타데이터 URI를 반환합니다.
    }
}

피나타에 사진 업로드 -> 주소복사해서 메타데이터 생성 -> 컨트랙트 배포 -> MintNFT 발행 -> Opensea 확인

0개의 댓글