Mint NFT
Trong hướng dẫn này bạn sẽ tìm hiểu làm thế nào để tạo NFT của riêng bạn một cách dễ dàng mà không cần phát triển bất cứ phần mềm nào, bằng cách sử dụng smart contract có sẵn và giải pháp lưu trữ phi tập trung là IPFS.
Tổng quan
Bài viết này sẽ hướng dẫn bạn cài đặt một NFT smart contract, và chỉ cho bạn cách build, test và deploy NFT contract này lên NEAR. Khi contract được deploy, bạn sẽ tìm hiểu cách mint non-fungible token từ các file media lưu trữ trên IPFS và xem chúng trong Wallet của bạn.
Điều kiện tiên quyết
Để hoàn thành tốt hướng dẫn này, bạn sẽ cần:
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.
Tip: trong hướng dẫn này chúng ta sẽ sử dụng một wallet account trên
testnet
. Networktestnet
này miễn phí và không cần phải gửi tiền.
Once you have your Wallet account, you can click on the Collectibles tab where all your NFTs will be listed:
IPFS
InterPlanetary File System (IPFS) được biết đến như là một giao thức, một mạng ngang hàng (peer-to-peer) cho phép người dùng lưu trữ, chia sẻ dữ liệu trên một hệ thống tệp dữ liệu phân tán (distributed file system). IPFS sử dụng công nghệ content-addressing nhằm xác định tính duy nhất của từng file, trong một không gian toàn cục được hình thành bằng cách kết nối các thiết bị điện toán lại với nhau.
Upload image
Để upload một NFT image, chúng ta sẽ sử dụng dịch vụ miễn phí NFT Storage được xây dựng đặc biệt để lưu trữ dữ liệu off-chain của NFT. NFT Storage cung cấp dung lượng và băng thông miễn phí dành cho NFT trên IPFS và Filecoin.
Các bước thực hiện
-
Đăng ký một account và đăng nhập vào nft.storage.
-
Một khi bạn đã upload file, bạn sẽ nhận được một
CID
duy nhất cho nội dung của b ạn, và một URL giống như:https://bafyreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/
Tip: kiểm tra NFT.Storage Docs về thông tin của việc upload nhiều file và các API endpoint khả dụng.
Non-fungible Token contract
This repository includes an example implementation of a non-fungible token contract which uses near-contract-standards and simulation tests.
Clone NFT repository
Trong terminal của bạn chạy lệnh sau để clone NFT repo:
git clone https://github.com/near-examples/NFT
Khám phá smart contract
Source code của contract này có thể được tìm thấy tại nft/src/lib.rs
. Contract này chứa logic theo chuẩn NEP-171 (NEAR Enhancement Proposal) và phần thực hiện của tiêu chuẩn này có thể được tìm thấy tại đây.
Lúc đầu, code có thể hơi choáng ngợp, nhưng nếu chúng ta chỉ quan tâm tới các khía cạnh của quá trình mint, chúng ta có thể chia nó thành 2 loại chính - contract struct và quá trình mint.
Contract Struct
Contract sẽ theo dõi hai phần thông tin - tokens
và metadata
. Đối với mục đích của hướng dẫn này, chúng ta chỉ xử lý field tokens
.
#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)]
pub struct Contract {
tokens: NonFungibleToken,
metadata: LazyOption<NFTContractMetadata>,
}
Các token thuộc loại NonFungibleToken
đến từ các tiêu chuẩn cốt lõi. Có một vài field nằm trong struct nhưng đối với mục đích của hướng dẫn này, chúng ta chỉ quan tâm đến field owner_by_id
. Điều này giúp theo dõi thông tin chủ sở hữu của bất kỳ token cụ thể nào.
pub struct NonFungibleToken {
// chủ sở hữu của contract
pub owner_id: AccountId,
// theo dõi chủ sở hữu của bất kì token ID cụ thể nào.
pub owner_by_id: TreeMap<TokenId, AccountId>,
...
}
Chúng ta vừa khám phá hậu trường và nơi dữ liệu được lưu giữ, bây giờ hãy đi tiếp tới chức năng mint.
Mint
Để một token được mint, bạn sẽ cần call function nft_mint
. Có ba argument được truyền vào function này:
token_id
receiver_id
token_metadata
Function này thực thi self.tokens.mint
sẽ call tới function mint trong các tiêu chuẩn cốt lõi để tạo một record của token với người sở hữu là 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))
}
Việc này tạo record đó bằng cách thêm token này vào cấu trúc dữ liệu owner_by_id
mà chúng ta vừa đề cập trong phần trước.
self.owner_by_id.insert(&token_id, &owner_id);
Build contract
Chạy lệnh sau trong terminal của bạn để build contract, sử dụng Rust cargo
.
./scripts/build.sh
Lệnh này sẽ tạo ra WASM binary ở trong thư mục res/
. File WASM này là một smart contract mà chúng ta sẽ deploy lên trên NEAR blockchain.
Tip: If you run into errors make sure you have Rust installed and are in the root directory of the NFT example.
Test contract
Có các test được viết sẵn nằm trong smart contract mà bạn có thể chạy. Chạy câu lệnh sau trong terminal của bạn để thực thi những test đơn giản này nhằm đảm bảo contract code hoạt động tốt.
cargo test -- --nocapture
Lưu ý: những test giả lập phức tạp hơn không được thực thi trong command này, nhưng bạn có thể tìm thấy chúng tại thư mục
tests/sim
.