본문으로 건너뛰기

ERC-721(NFT) 생성 및 출시 방법

업데이트 날짜:
2025년 11월 26일

읽는 데 8분

서론

ERC-721을 지원하는 디지털 수집품은 ‘크립토키티(Cryptokitties )’가 출시된 이후 큰 인기를 끌었으며, 최근 몇 달간 대중적으로 널리 보급되었습니다. 이 가이드에서는 0xcert/ethereum-erc721 스마트 계약 라이브러리를 사용하여 우리만의 ERC-721(NFT)을 제작하고 출시하는 과정을 다룰 것입니다.

대체 불가능 토큰(NFT)이란 무엇인가요?

‘대체 가능(fungible)’이란 서로 동일하거나 서로 바꿔 쓸 수 있음을 의미합니다. 예를 들어, 이더리움 토큰의 경우, 같은 종류의 토큰은 모두 동일한 가치를 지닙니다. 카르다노 토큰도 마찬가지입니다. 대체 가능한 토큰은 1:1로 서로 바꿔 쓸 수 있습니다.

이를 고려할 때, NFT는 각각 고유하며 서로 다르고 독특한 특성을 지니고 있습니다. NFT가 될 수 있는 것들로는 수집용 카드, 예술 작품, 항공권 등이 있습니다. 이들은 모두 서로 명확히 구별되며, 서로 대체할 수 없습니다. 대체 불가능 토큰(NFT)을 매우 희귀한 수집품으로 생각해보세요. 각각은 고유한 특징과 특이한 속성을 지니고 있으며, 대부분의 경우 자체 메타데이터를 가지고 있습니다.

ERC-721이란 무엇인가요?

ERC는 ‘이더리움 의견 요청(Ethereum Request for Comment)’의 약자이며, 721은 해당 제안의 식별 번호입니다. ERC는 이더리움 생태계를 위한 애플리케이션 수준의 표준으로, ERC-20과 같은 스마트 계약 표준이 될 수 있습니다.

ERC 제안의 작성자는 이더리움 커뮤니티와 합의를 도출할 책임이 있으며, 커뮤니티의 검토와 승인을 거치면 해당 제안은 표준으로 채택됩니다. 최근의 모든 ERC 제안은 여기에서 확인할 수 있습니다.

ERC-721은 스마트 계약 내에서 NFT를 추적하고 양도할 수 있는 기능을 제공하기 위해 만들어졌습니다.

ERC-721은 EVM(이더리움 가상 머신)을 지원하는 블록체인에서 대체 불가능 토큰(NFT)을 생성하는 방법을 규정하는 개방형 표준입니다. 이 표준은 NFT를 손쉽게 다룰 수 있도록 하는 일련의 규칙을 포함하고 있습니다. NFT는 ERC-721뿐만 아니라 ERC-1155 토큰일 수도 있습니다.

다음은 ERC-721 표준에 정의된 기능 및 이벤트입니다:

ERC-721은 ERC-20에 따라 몇 가지 기능을 정의합니다. 덕분에 기존에 출시된 일부 지갑에서 토큰 정보를 훨씬 더 쉽게 확인할 수 있게 되었습니다.

ERC-20 기능

  • name: 다른 계약서나 애플리케이션이 이를 식별할 수 있는 이름을 지정하는 데 사용됩니다.
  • 기호: 기호 또는 약칭을 지정하는 데 사용됩니다.
  • totalSupply: 이 함수는 블록체인에 존재하는 토큰의 총량을 정의하는 데 사용되며, 반드시 일정할 필요는 없습니다.
  • balanceOf: 특정 주소가 보유한 NFT의 개수를 반환합니다.

토큰 소유권과 관련된 기능

  • ownerOf: 이 함수는 토큰 소유자의 주소를 반환합니다. 각 ERC-721 토큰은 고유하며 대체 불가능하므로, 블록체인 상에서는 ID로 표현됩니다. 다른 사용자, 스마트 계약 또는 앱은 이 ID를 사용하여 토큰의 소유자를 확인할 수 있습니다.
  • 승인: 이 기능은 토큰 전송을 승인하는 데 사용됩니다.
  • takeOwnership: 이 기능은 해당 주소에서 토큰을 인출할 수 있도록 미리 승인된 경우, 사용자로부터 토큰을 인출할 수 있게 해주는 선택적 기능입니다.
  • 이체: 토큰 소유자가 마치 다른 토큰이나 화폐를 다루는 것처럼 자신의 토큰을 다른 주소로 이체할 수 있게 해주는 기능입니다.
  • tokenOfOwnerByIndex: 이 함수는 선택 사항이지만 구현하는 것이 매우 권장됩니다. 각 토큰 소유자는 동일한 NFT를 동시에 여러 개 소유할 수 있습니다. 각 NFT의 고유 ID를 통해 이를 식별할 수 있지만, 시간이 지남에 따라 이러한 ID를 추적하기가 매우 어려워집니다. 따라서 계약은 소유자와 관련된 ID를 기록해 두며, 이 함수를 통해 해당 추적을 위한 적절한 정보를 얻을 수 있습니다.

메타데이터 기능

  • tokenMetadata: 이 선택적 속성은 토큰 정보를 파악할 수 있게 해주는 인터페이스입니다.

행사

  • 이전: 이 이벤트는 토큰의 소유자가 변경될 때 발생합니다. 어떤 주소에서 토큰을 전송했는지, 어떤 주소가 수신했는지, 그리고 어떤 토큰 ID가 전송되었는지에 대한 정보를 제공합니다.
  • 승인: 이 이벤트는 한 사용자가 다른 사용자에게 토큰 사용 권한을 승인할 때, 예를 들어 approve 함수가 실행될 때 발생합니다. 이 이벤트는 현재 토큰을 보유한 주소, 향후 토큰 사용 권한이 승인된 주소, 그리고 소유권이 이전되도록 승인된 토큰 ID에 대한 정보를 반환합니다.

대체 불가능 토큰(NFT)의 활용 사례:

  • 디지털 아트(또는 실물 아트): 이것이 NFT의 가장 대표적인 활용 사례입니다. 디지털 아트 경매는 NFT의 초기 활용 사례 중 하나였으며, 여전히 성장세를 이어가고 있습니다.
  • 게임: 게임 내 구매 및 수집품을 제공하기 위함입니다.
  • 부동산: 부동산을 토큰화하고, 매매를 위한 스마트 계약을 생성할 수 있습니다.
  • 재무: 대출, 선물 등 금융상품 및 기타 채무.
  • 소프트웨어: 불법 복제를 방지하고 개인정보 보호를 보장하기 위한 소프트웨어 라이선스.
  • 콘서트나 스포츠 행사 티켓: 티켓 판매 시 부정행위를 방지하고, 팬들이 과거의 경험을 한곳에서 확인할 수 있도록 하기 위함입니다.

ETH 테스트 획득하기

ERC-721 토큰이 무엇이며 어떻게 작동하는지 알아보았으니, 이제 우리만의 토큰을 만들고 출시하는 방법을 살펴보겠습니다.

이제 Ropsten 테스트 네트워크에 우리 계약을 배포해 보겠습니다. 시작하려면, Metamask 브라우저 확장 프로그램을 설치하여 ETH 지갑을 생성하고 Ropsten 페이크트에서 테스트용 ETH를 조금 받아야 합니다. Metamask 지갑에서 ‘Ropsten Test Network’를 선택한 다음, 지갑 주소를 페이크트의 텍스트 입력란에 복사하고 ‘Send me test Ether’를 클릭하세요.

IPFS에 파일 추가하기

NFT 계약서를 작성하기 전에, NFT와 관련된 아트 파일을 저장하고 메타데이터 파일을 생성해야 합니다. 이를 위해 분산형 파일 공유 시스템인 IPFS를 사용할 것입니다. 다음 IPFS 설치 가이드를 따라 사용 중인 운영 체제에 맞는 IPFS CLI를 다운로드하여 설치하십시오.

다음은 이미지와 메타데이터 파일을 저장하는 단계입니다.

1단계: IPFS 저장소 생성 터미널에 다음 명령어를 입력하여 IPFS 저장소를 시작합니다.

ipfs 초기화

2단계: IPFS 모니터 시작하기

새 터미널을 열고 다음 명령어를 입력하세요.

IPFS 데몬

3단계: IPFS에 이미지 추가하기

첫 번째 터미널에 이미지(여기서는 art.png)를 추가하세요.

ipfs 추가 art.png

Qm으로 시작하는 해시를 복사한 다음, 그 앞에 https://ipfs.io/ipfs/을 추가하세요. 다음과 같이 표시되어야 합니다: https://ipfs.io/ipfs/QmQEVVLJUR1WLN15S49rzDJsSP7za9DxeqpUzWuG4aondg

4단계: IPFS에 JSON 파일 추가하기

nft.json이라는 이름의 JSON 파일을 생성하고, 해당 파일을 이미지 파일이 있는 디렉터리에 저장하세요.

JSON 파일:

{
"name": "NFT Art",
"description": "This image shows the true nature of NFT.",
"image": "https://ipfs.io/ipfs/QmZzBdKF7sQX1Q49CQGmreuZHxt9sVB3hTc3TTXYcVZ7jC",
}

이제 JSON 파일을 IPFS에 추가하세요

ipfs 추가 nft.json

Qm으로 시작하는 해시를 복사한 다음, 그 앞에 https://ipfs.io/ipfs/을 추가하세요. 다음과 같이 표시되어야 합니다: https://ipfs.io/ipfs/QmUFbUjAifv9GwJo7ufTB5sccnrNqELhDMafoEmZdPPng7

이 URL을 확인해 주세요. 우리 NFT를 출시하는 데 이 URL이 필요할 거예요.

토큰 생성하기

편의성과 보안을 위해 0xcert/ethereum-erc721을 사용하여 NFT 계약을 생성하겠습니다. 0xcert/ethereum-erc721을 사용하면 ERC-721 인터페이스 전체를 직접 작성할 필요 없이, 이를 임포트하여 해당 함수들을 활용할 수 있습니다.

이더리움 리믹스(Ethereum Remix) IDE로 이동하여 새로운 솔리디티(Solidity) 파일을 생성하세요. 예를 들어, nft.sol과 같은 이름을 지정할 수 있습니다.

새 솔리디티 파일에 다음 코드를 붙여넣으세요:

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

import "https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol";
import "https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol";

contract newNFT is NFTokenMetadata, Ownable {

constructor() {
nftName = "Synth NFT";
nftSymbol = "SYN";
}

function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner {
super._mint(_to, _tokenId);
super._setTokenUri(_tokenId, _uri);
}

}

위의 코드에 대한 설명:

1행: SPDX 라이선스 유형 지정. Solidity ^0.6.8 이후부터 필수로 추가된 항목입니다. 스마트 계약 코드가 공개될 때마다, 이러한 라이선스는 저작권 관련 문제를 해결하고 예방하는 데 도움이 될 수 있습니다. 라이선스 유형을 지정하지 않으려면 'Unlicensed' 값을 사용하거나 주석을 아예 생략할 수 있습니다(오류는 발생하지 않으며, 단지 경고 메시지가 표시될 뿐입니다).

2행: 스마트 계약의 솔리디티 버전을 명시합니다.

4-5행: 0xcert/ethereum-erc721 계약을 불러옵니다.

7행: newNFT라는 이름의 계약을 정의하며, 이 계약은 NFTokenMetadata 및 Ownable이라는 다른 계약들을 상속받습니다.

9~12행: 생성자를 초기화하고 토큰의 이름과 심볼을 설정합니다.

14행: 세 개의 인자를 받는 mint 함수를 선언합니다. address 형식의 _to 변수는 NFT 토큰을 수신할 주소를 저장하고, uint256 형식의 _tokenId 변수는 토큰 ID를 저장하며, _uri 변수는 JSON 파일의 URI를 저장합니다. 이 mint 함수를 external로 선언한다는 것은 다른 스마트 계약이나 해당 계약의 범위 밖에서도 이 함수에 접근할 수 있음을 의미합니다.

15행: 토큰을 수신할 주소와 토큰 ID를 사용하여 토큰을 삭제합니다.

16행: 토큰 ID와 JSON 파일의 URI를 사용하여 URI를 설정합니다.

스마트 계약을 컴파일하고, 주입된 Web3를 사용하여 배포합니다(계약을 컴파일하기 전에 Metamask에서 Ropsten 테스트넷이 선택되어 있는지 확인하십시오).

메타마스크에서 거래를 승인하세요.

배포 전에 “This contract may be abstract”라는 오류 메시지가 표시되면, ‘Contracts’ 옵션에서 올바른 계약을 선택했는지 확인하십시오.

이제 Remix의 ‘Deployed Contracts’ 섹션으로 이동하여 방금 배포한 계약을 펼치세요. 수많은 함수/메서드가 표시될 것입니다. mint 함수를 펼치고 다음 내용을 추가하세요:

  1. _to 필드에 Ropsten 주소를 추가하세요
  2. _tokenid 필드에 숫자를 입력하세요(첫 번째 값이므로 1을 입력하는 것을 권장합니다).
  3. 이전 섹션에서 확인한 JSON 파일의 URI를 _uri 필드에 추가하세요.

'Transact'를 클릭하고 Metamask에서 거래를 확인하세요. 이제 Ropsten 네트워크에 토큰이 있습니다.

앞서 언급한 토큰 ID를 입력하면 이름, 심볼, 소유자, 토큰URI와 같은 기타 세부 정보를 확인할 수 있습니다.

결론

나만의 NFT를 제작하신 것을 축하합니다. 친구인 예술가의 작품을 이더리움 네트워크에 올리거나, 직접 예술가가 되어 친구를 도와주세요. 더 많은 예시를 보려면 0xcert/ethereum-erc721의 GitHub를 확인해 보세요.

이더리움 관련 더 많은 기사와 가이드를 받아보시려면 뉴스레터를 구독해 주세요. 의견이 있으시면 저희 트위터에 자유롭게 남겨주세요. 디스코드 서버에서도 언제든지 저희와 대화하실 수 있으며, 그곳에서 정말 뛰어난 개발자 분들을 만나보실 수 있습니다 :)

이 가이드를 공유하세요