2 분 소요

ERC-721


ERC-721은 EIP-721에서 제안된 “증서로도 알려져 있는 대체 불가능한 토큰을 위한 표준 인터페이스”로, 여기서 대체 불가능한 토큰은 NFT(Non-Fungible Token)이다.

NFT를 통해 디지털 혹은 물리적 자산에 대한 소유권을 나타낼 수 있으며, 각각의 토큰 하나하나가 고유하고 식별할 수 있다.

ERC-721 vs ERC-20

ERC-721은 ERC-20을 기반으로 생성되었다. 그러나 ERC-20과 비교했을 때 “대체 가능 여부”에 따라 비교할 수 있다.

ERC-20은 NFT와 비교했을 때 FT(Fungible Token)라고도 불린다. 즉, ERC-20은 ERC-721과 비교했을 때 “대체 가능한” 토큰이다. 따라서 ERC-20은 화폐처럼 완전히 같은 가치를 가지며, 하나의 토큰이 다른 토큰을 대체할 수 있는 반면, ERC-721은 각 토큰이 가지는 성질은 고유하며, 서로 다른 토큰이 갖는 가치가 다르다는 점에서 차이가 있다.

ERC-721 코드 분석(OpenZeppelin - ERC721.sol)

ERC721.sol 코드 분석

ERC721 - OpenZeppelin with Truffle

IPFS와 NFT

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

IPFS 특징


  • 중앙화된 서버 없이 P2P 통신으로 실현한 더 빠르고 안전하고 열린 네트워크이다.
  • 고용량 파일을 빠르고 효율적으로 전달할 수 있으며(BitSwap), 파일들의 중복을 알 수 있기 때문에 저장소 또한 효율적으로 사용가능하다(Merkle DAG, contents-addressed).
  • IPFS 상에 업로드된 파일은 영원히 기록되며, 파일을 원하는 만큼 지켜낼 수 있다. 또한 파일 버전 관리도 가능하다.
  • 인터넷에 원활하게 접속할 수 없는 상황이라도 IPFS 생태계는 유지된다.

IPFS 동작 원리


  • 각각의 파일은 여러 개의 블록으로 이루어져 있으며, 각각의 블록은 해시로 표현된 고유의 이름이 있다.
  • IPFS는 모든 파일의 이름을 데이터베이스 속에 저장하며, 동일 파일의 중복을 배제하며, 각 파일의 버전 정보를 트래킹한다.
  • 각 노드는 본인이 관심 있는 파일만 저장소에 보관하며, 인덱싱 정보를 통해 누가 어떤 파일을 저장하고 있는지 알 수 있다.
  • 네트워크에서 파일을 찾기 위해, 파일명을 조회하고 해당 파일을 가진 노드를 물어노는 형식이다.
  • IPNS를 통해 모든 파일명은 인간이 읽기 쉬운 형태로 변환 가능하다.

NFT with IPFS


  • IPFS에 파일을 업로드시, 획득한 파일의 고유한 해시값을 NFT에서 tokenURI로 사용함으로써 온체인 NFT를 구현할 수 있다.
  • IPFS에 파일을 업로드시, 파일을 수정할 수 없다.
  • 제공하려는 NFT의 특징에 따라 IPFS를 선택할 수도, s3버킷과 같은 클라우드 컴퓨팅을 사용할 수 있다.

Opensea를 활용한 NFT 발행 확인(Goeril Testnet, IPFS)

ERC721 활용 간단한 발행

위와 같이 간단한 발행 코드를 배포한다.

1

배포가 완료되면 mintNFT 함수를 통해 NFT를 발행할 수 있는데,

  • Recipient : goeril 주소
  • tokenURI : “111”

로 Minting을 테스트한다.

2

해당 트랜잭션이 정상적으로 완료되면 컨트랙 주소를 통해 해당 컨트랙의 NFT를 https://testnets.opensea.io/ 에서 확인할 수 있다.

3

4

그러나 위와 같이 토큰은 아무런 정보도 없는데, 이는 발행 시, NFT에 고유성을 부여하는 정보를 담고 있는 tokenURI를 111로 의미없는 정보로 지정했기 때문이다.

TokenURI은 JSON 형식으로

{
    "name" : "Test minting", // 토큰 이름
    "description" : "opensea minting test with IPFS", // 토큰 설명
    "image": "https://ipfs.io/ipfs/QmYtZ5mPAXFjq6ka5H9ygr9LKHnJkaoX5tpubEj8wYo1qb?filename=dog.jpg", // 이미지 URI
    "attributes": [ // NFT에 고유성을 부여하는 특성
        {
            "dog": "dog" 
        }
    ]
}

위와 같이 구성된다. 따라서 minting시 해당 JSON 파일의 링크를 tokenURI로 발행한다면 유효한 정보를 가지고 있는 NFT를 opensea에서 확인할 수 있다.

따라서 링크를 얻는 방법은 클라우드 s3, IPFS등이 있지만 여기서는 IPFS를 활용하여 이미지URI, tokenURI Json 파일의 URI를 획득하여 minting함으로써 opensea에서 확인해본다.

먼저 사용할 이미지를 IPFS에 업로드한다.(IPFS Desktop 설치)

5

이후 해당 이미지 URI를 tokenURI에 적용하기 위해 이미지 링크를 복사한다.

6

이후 위의 tokenURI 형식에 맞춰 tokenURI JSON 파일을 생성 및 작성한다.

7

위와 같이 작성이 완료되면, 작성된 JSON 파일을 tokenURI에 넣기 위해, IPFS에 업로드하고 이미지 링크 획득 과정과 같이 링크를 획득한다.

8

마지막으로 mintNFT 함수에서

  • Recipient : goeril 주소
  • tokenURI : 획득한 tokenURI 주소

를 입력하고 NFT 발행을 진행한다.

9

10

위와 같이 minting이 완료되면 opensea에서 해당 컨트랙을 조회한 후, 유효한 정보를 가진 NFT가 발행됨을 확인할 수 있다.

11

본 포스팅은 코드스테이츠 BEB 과정을 수강하며 작성한 글입니다.