본문으로 건너뛰기

Non Fungible Tokens (NFT)

대체 가능한 토큰과 달리, 대체 불가능 토큰(NFT)은 단일하고 고유한 특성을 가집니다. 따라서 NFT는 디지털 콘텐츠 또는 이벤트 티켓과 같은 자산의 소유권을 나타내는 데 이상적입니다.

대체 가능한 토큰과 마찬가지로, NFT는 사용자의 지갑에 저장되지 않고 NFT 컨트랙트에 존재합니다. NFT 컨트랙트는 회계 역할을 하며 NFT의 생성, 저장 및 전송을 처리합니다.

컨트랙트가 NFT 컨트랙트로 간주되려면 NEP-171 및 NEP-177 표준을 따라야 합니다. NEP-171NEP-177 표준은 구현에 필요한 최소 인터페이스와 예상 기능을 설명합니다.

참조 구현 배포 및 사용할 준비가 된 참조 구현이 제공되어 있습니다. :::

NFT와 NFT 마켓플레이스를 혼동하지 않도록 주의하세요. NFT는 단순히 정보(메타데이터)를 저장하는 반면, NFT 마켓플레이스는 NFT를 나열하고 교환할 수 있는 컨트랙트입니다. :::


NFT 발행

새로운 NFT를 생성(일명 민팅)하려면, 먼저 NFT 컨트랙트를 배포하고 owner로 초기화해야 합니다. 현재 owner는 단순히 내부 변수(Contract.owner_id)를 설정합니다. 즉, owner는 발행된 모든 NFT의 기본 소유자가 아닙니다.

배포 및 초기화되면, nft_mint 메서드를 호출할 수 있습니다. 매개변수로 고유 ID, 소유자, 토큰의 메타데이터 및 (선택 사항) 로열티를 전달해야 합니다. 메타데이터에는 제목, 설명 및 관련 미디어에 대한 URL과 같은 정보가 포함됩니다.

# 1. Deploy the contract in a testnet account
near dev-deploy --wasmFile non_fungible_token.wasm

# 2. Initialize NFT contract

# 3. Mint an NFT
near call <nft-contract> nft_mint '{"token_id": "<token-unique-id>", "receiver_id": "<nft-owner-account>", "token_metadata": {"title": "<title>", "description": "<description>", "media": "<url>" }, "royalties": {"<account>" : <percentage>, "<account>" : <percentage>}}' --accountId <your-account>

TokenMetadata의 전체 매개변수 목록은 메타데이터 표준을 참조하세요. :::

컬렉션 민팅

많은 경우 사람들은 NFT의 100개 복사본을 생성하려고 합니다(이를 컬렉션이라고 함). 이러한 경우 실제로 해야 할 일은 동일한 메타데이터(그러나 다른 token-id)로 100개의 서로 다른 NFT를 발행하는 것입니다.

로열티

매개변수 중 하나가 로열티인 구조라는 것을 알아차렸을 것입니다. 로열티를 사용하면 토큰이 시장에서 판매될 때, 판매금의 일부를 지불해야 하는 사용자 목록을 만들 수 있습니다. 예를 들어 anna5% 로열티를 설정하였다면, NFT가 판매될 때마다 anna는 판매 가격의 5%를 받아야 합니다.


메타데이터 쿼리

nft_metadata를 호출하여 NFT의 메타데이터를 쿼리할 수 있습니다.

near view <nft-contract> nft_metadata

사용자 승인

다른 사용자가 소유한 NFT를 전송하도록 승인할 수 있습니다. 이는, 예를 들어 NFT를 마켓플레이스에 나열하는 데 유용합니다. 이러한 시나리오에서 당신은 마켓플레이스가 일정 이상의 금액을 받을 때만 NFT를 전송할 것이라고 믿습니다.

near call <nft-contract> nft_approve '{
"token_id": "<token-unique-id>",
"account_id": "<authorized-account>",
"msg": "<json-structure>"
}' --accountId <your-account> --depositYocto 1

msg 매개변수가 포함된 경우, <authorized_account>.nft_on_approve(msg)에 대한 교차 컨트랙트 호출(cross-contract call)이 이루어집니다. 그러면 NFT 컨트랙트에서 nft_resolve_transfer로의 콜백이 이루어집니다. :::

NFT 전송

NFT 전송은 두 가지 시나리오에서 발생할 수 있습니다. (1) NFT 전송을 요청하고 (2) 승인된 계정이 NFT 전송을 요청합니다. 두 경우 모두 토큰 ID, 수신자 및 (선택 사항) approval_id를 나타내는 nft_transfer 메서드를 호출해야 합니다.

near call <nft-contract> nft_transfer '{"receiver_id": "<receiver-account>", "token_id": "<token-unique-id>"}' --accountId <your-account> --depositYocto 1

호출에 NFT 첨부

기본적으로 NEAR 토큰(Ⓝ)만 메서드 호출에 첨부할 수 있습니다. 그러나 NFT 표준은 NFT 컨트랙트를 중개자로 사용하여 호출에 대체 불가능한 토큰을 첨부할 수 있습니다. 즉, 호출에 토큰을 직접 첨부하는 대신 NFT 컨트랙트에 당신의 이름으로 전송 및 메서드 호출을 모두 수행하도록 요청하는 것입니다.

near call <nft-contract> nft_transfer_call '{"receiver_id": "<receiver-contract>", "token_id": "<token_id>", "msg": "<a-string-message>"}' --accountId <your-account> --depositYocto 1
선택적으로 memo 매개변수를 전달하여 컨트랙트에 더 많은 정보를 제공할 수 있습니다. :::

어떻게 작동하나요?

수신자 컨트랙트에 대한 호출에 NFT(🎫)를 첨부한다고 가정합니다. 작업이 진행되는 방식은 다음과 같습니다.

  1. NFT 컨트랙트 내 nft_transfer_call을 호출하여 수신자, 메시지 및 🎫의 토큰 ID를 전달합니다.
  2. NFT 컨트랙트는 NFT 🎫를 수신자에게 전송합니다.
  3. NFT 컨트랙트는 receiver.nft_on_transfer(sender, token-owner, token-id, msg)를 호출합니다.
  4. NFT 컨트랙트는 nft_resolve_transfer 콜백 내 오류를 처리합니다.
  5. NFT 컨트랙트는 성공하면 true를 반환합니다.

nft_on_transfer 메서드

위의 작업 방식에서, 호출하려는 수신자는 nft_on_transfer 메서드를 구현해야 합니다. 실행될 때, 해당 메서드를 통해 다음과 같은 것들을 알 수 있습니다.

  • NFT를 보내는 사람(매개변수이기 때문)
  • 현재 소유자(매개변수이기 때문)
  • 어느 NFT가 전송되었는지(매개변수이기 때문)
  • 메시지로 인코딩된 매개변수가 있는지

NFT가 발신자에게 환불되어야 하는 경우, nft_on_transfertrue를 반환해야 합니다.


이벤트

NFT 이벤트 표준을 구현하여 실시간 이벤트(예: 전송)를 추적할 수 있습니다. Events는 표준화된 방식으로 형식화된 로그인 메시지이기 때문에, 사용이 간편합니다. 이렇게 기록된 메시지는 공개되므로 서비스를 구축하여 실시간으로 추적할 수 있습니다.