NFT 발행
이 튜토리얼에서는 쉽게 사용할 수 있는 스마트 컨트랙트와, IPFS와 같은 분산 스토리지 솔루션을 사용하여 소프트웨어 개발을 하지 않고도 자신만의 NFT를 쉽게 생성하는 방법을 배웁니다.
개요
이 글은 NFT 스마트 컨트랙트를 설정하는 방법에 대해 안내하고, NEAR에서 NFT 컨트랙트를 구축, 테스트 및 배포하는 방법에 대해 보여줍니다. 컨트랙트가 배포되면 IPFS에 저장된 미디어 파일에서 대체 불가능한 토큰을 생성하고, 이를 지갑에서 보는 방법을 배우게 됩니다.
전제 조건
이 튜토리얼을 성공적으로 완료하려면 다음이 필요합니다.
- Rust 툴체인
- NEAR 계정
- nft.storage 계정
- NEAR 명령줄 인터페이스 (
near-cli
)
Wallet
To store your non-fungible tokens you'll need a NEAR Wallet. If you don't have one yet, you can create one easily by following these instructions.
팁: 이 튜토리얼에서는
testnet
지갑 계정을 사용합니다.testnet
네트워크는 무료이며, 자금을 예치할 필요가 없습니다.
Once you have your Wallet account, you can click on the Collectibles tab where all your NFTs will be listed:
IPFS
IPFS (InterPlanetary File System)는 분산 파일 시스템에서 데이터를 저장하고 공유하기 위한 프로토콜 및 피어 투 피어 네트워크입니다. IPFS는 콘텐츠 주소를 지정하여 모든 컴퓨팅 장치를 연결하는 글로벌 네임스페이스에서 각 파일을 고유하게 식별합니다.
이미지 업로드
NFT 이미지를 업로드하기 위해, 오프체인 NFT 데이터 저장 용도로 특별히 구축된 무료 NFT 스토리지 서비스를 사용할 것입니다. NFT 스토리지는 IPFS 및 Filecoin에서 NFT를 위한 무료 분산형 스토리지 및 대역폭을 제공합니다.
단계
-
계정을 등록하고 nft.storage에 로그인하세요.
-
파일을 업로드하면 컨텐츠에 대한 고유한
CID
를 얻게 되고, 다음과 같은 URL을 얻게 됩니다.https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/
팁: 여러 파일 업로드 및 사용 가능한 API 엔드포인트에 대한 정보는 NFT.Storage 문서를 확인하세요.
대체 불가능 토큰 컨트랙트
이 레퍼지토리에는 컨트랙트 표준 및 시뮬레이션 테스트를 사용하는 대체 불가능 토큰 컨트랙트의 구현 예시가 포함되어 있습니다.
NFT 레퍼지토리 복제
터미널에서 다음 명령을 실행하여 NFT 레퍼지토리를 복제합니다.
git clone https://github.com/near-examples/NFT
스마트 컨트랙트 알아보기
이 컨트랙트의 소스 코드는 nft/src/lib.rs
에서 찾을 수 있습니다. 이 컨트랙트에는 NEP-171 표준(NEAR Enhancement Proposal)을 따르는 로직과 여기에서 찾을 수 있는 표준의 구현이 포함되어 있습니다.
처음에는 코드가 다소 복잡할 수 있지만, 발행과 관련된 측면만 고려하면 컨트랙트 구조와 발행 프로세스라는 두 가지 주요 범주로 나눌 수 있습니다.
컨트랙트 구조
컨트랙트는 tokens
과 metadata
두 가지 정보를 추적합니다. 이 튜토리얼의 목적을 위해, 우리는 tokens
필드만 다룰 것입니다.
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)]
pub struct Contract {
tokens: NonFungibleToken,
metadata: LazyOption<NFTContractMetadata>,
}
이 토큰은 핵심 표준 내 NonFungibleToken
자료형입니다. 구조체를 구성하는 여러 필드가 있지만, 이 튜토리얼의 목적상 owner_by_id
필드에만 관심을 둘 것입니다. 이 필드는 주어진 토큰의 소유자를 추적합니다.
pub struct NonFungibleToken {
// owner of contract
pub owner_id: AccountId,
// keeps track of the owner for any given token ID.
pub owner_by_id: TreeMap<TokenId, AccountId>,
...
}
이제 뒤에서 데이터가 어디에 보관되는지 살펴보았으므로, 발행 기능으로 이동하겠습니다.
발행
토큰을 발행하려면 nft_mint
함수를 호출해야 합니다. 이 함수에 전달되는 세 가지 인자는 다음과 같습니다.
token_id
receiver_id
token_metadata
이 함수는 핵심 표준에서 발행 함수를 호출하는 self.tokens.mint
를 실행하여, receiver_id
인 소유자의 토큰 기록을 생성합니다.
#[payable]
pub fn nft_mint(
&mut self,
token_id: TokenId,
receiver_id: ValidAccountId,
token_metadata: TokenMetadata,
) -> Token {
self.tokens.mint(token_id, receiver_id, Some(token_metadata))
}
이는 이전 섹션에서 언급한 owner_by_id
자료구조에 토큰을 삽입하여 해당 기록을 생성합니다.
self.owner_by_id.insert(&token_id, &owner_id);
컨트랙트 구축
컨트랙트를 구축하려면, 터미널에서 다음 명령을 실행해 Rust의 cargo
를 사용하는 컨트랙트를 구축하세요.
./scripts/build.sh
이렇게 하면 res/
디렉토리에 WASM 바이너리가 생성됩니다. 이 WASM 파일은 NEAR 블록체인에 배포할 스마트 컨트랙트입니다.
Tip: If you run into errors make sure you have Rust installed and are in the root directory of the NFT example.