Remix를 이용한 ERC-721 개발

Lumi·2021년 11월 25일
post-thumbnail

🔥 Remix에서 ERc-721 개발하기

openzeppelin을 활용하면 간단하게 ERC-721을 구현 할수가 있다.

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

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

contract MyNFT is ERC721{
    constructor() public ERC721("MyNFT", "NFT"){}
}
  • 이러한 코드가 끝이다...

하지만 NFT를 발행하는 기능은 없다.

  • 단순하게 ERC-721에 있는 함수의 기능을 구현하는 역할을 한다.

만약 새로운 NFT를 만들고 싶다면 기능을 추가해야 한다.

https://ethereum.org/en/developers/tutorials/how-to-write-and-deploy-an-nft/#write-contract

  • 이쪽 링크를 참고한다.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

contract MyNFT is ERC721URIStorage, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() public ERC721("MyNFT", "NFT") {}

    function mintNFT(address recipient, string memory tokenURI) public onlyOwner returns (uint256){
    
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
}

이후 배포를 하면 mintNFT 트랜잭션 생성 함수가 포함되게 된다.

  • 이 함수가 직접적으로 NFT를 생성하는 함수이다.

일단 기본 onlyOwner를 통해, 함수를 실행한 지갑의 주소와 오너의 주소가 같은지 검사를 한다.

  • 만약 함수를 실행한 지갑의 주소와 오너의 주소가 같으면 함수가 정상적으로 실행된다.

mintNFT는 라이브러리 Counters를 이용해 변수 토큰의 ID를 관리하게 된다.

  • NFT의 특성에 따라서 유일무이한 형태로 제공되어야 하기 떄문에 ID는 유니크해야 한다.

tokenURI는 NFT에 적용할 정보를 담고 있는 json객체의 엔드포인트 이다.

  • 다시 말해 NFT의 규칙에 맞는 json객체를 불러올 수 있어야 한다.

🌪 tokenURI

{
	"name": "name #1",
	"description": "description",
	"image": "imageUri",
	"attributes": [
		{
			"trait_type": "Background",
			"value": "White"
		}
	]
}

NFT의 정보를 담고 있는 객체 형식의 데이터이다.

  • 이 정보는 OpenSea에 적용된 NFT의 예시이다.
  • NFT마다 조금식 다를수 있다.

name

  • NFT의 이름

description

  • NFT에 대한 설명

image

  • image URI

attributes

  • 개발자가 사용하려고 넣어둔 메타데이터이다.

image의 링크를 DB의 링크로 저장을 한뒤에 해당 uri를 tokenURI로 입력해줌으로써 NFT를 만들어 낼 수가 있다.

Ropsten 네트워크에서는 발행항 토큰은 OpenSea에서 확인할 수는 없다.

  • Rinkeby 테스트 네트워크를 활용 해야 한다.

🔥 IPFS와 NFT

IPFS는 모든 컴퓨터를 연결하고자 하는 분산된 P2P파일 시스템이다.

  • 기존의 HTTP Web의 문제점을 해결하고 보완한 새로운 Web이다.

🌪 IPFS의 특징

일단 P2P시스템이기 떄문에 중앙화된 서버가 없고 더 빠르고 안전하게 열린 네트워크를 제공한다.

대형 서버의 연걸이 끊기게 되면 치명적인 HTTP Web와 달리 분산되어 있다는것이 큰 특징이다.

고용량의 파일을 빠르고 효율적이게 전달할 수 있으며, 중복을 알 수 있기 때문에 저장소도 효율적으로 사용 가능하다.

업로드된 파일은 영원히 기록되며 파일의 버전관리 또한 가능하다.

  • 인터넷에 원할하게 접속 불가능해도 생태계는 유지된다.

🌪 IPFS의 동작 원리

일단 기본적으로 모든 파일의 이름을 DB속에 저장하며 동일 파일의 중복을 배제하고 각 파일의 버전 정보를 트래킹 한다.

노드들은 본인이 관심있느 파일만 저장소에 보관하며, 인덱싱 정보를 통해 누가 어떤 파일을 저장하고 있는지 알 수 있다.

  • 이로 인해 파일을 찾을때에는 조회하고, 노드를 찾으면 된다.

IPNS를 통해 모든 파일명은 사람이 읽기 쉬운 형태로 변환 가능하다.

  • DNS를 통해 IP주소를 변환하는 것과 비슷하다.

또한 파일은 여러개의 블록으로 이루어져 있고 각각의 블록은 해시로 표현된 고유의 이름이다.

파일을 업로드하게 되면 업로드된 파일의 해시값이 산출된다.

  • 이 해시값은 업로드된 파일의 이름으로 사용이 된다.

해시값을 이용해, IPFS를 제공하는 노드의 엔드포인트를 tokenURI로써 블록체인에 저장하여 온체인 NFT를 구현할 수 있다.

  • 어떤 방법이든 IPFS에 업로드하면 더 이상 수정 불가능하다.

어떤경우에 클라우드, IPFS를 사용해야 하는지는 정답이 없다.

🔨 IPFS에 배포하기

별거 없다.

Remix기분 배포하기 밑에 Publish to IPFS를 체크해 주면 된다.

🔨 정리

블록체인과 어떤점이 다른지 이해가 안가서 따로 좀더 알아 보았다.

두 경우 모두 P2P방식이다.

하지만 차이점은 데이터를 어떻게 가져오냐 이다.

블록체인, 토렌트 같은 P2P방식은 모든 데이터를 가져오지만

IPFS같은 경우에는 데이터를 조각조각 잘게 나눠서 빠른 속도로 가져온뒤에 나중에 하나로 합치는 방식으로 작동한다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글