Nhảy đến nội dung chính

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

This article will guide you in setting up an NFT smart contract, and show you how to build, test and deploy your NFT contract on NEAR. Once the contract is deployed, you'll learn how to mint non-fungible tokens from media files stored on IPFS and view them in your Wallet.

Đ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: for this tutorial we'll use a testnet wallet account. The testnet network is free and there's no need to deposit funds.

Khi bạn có Wallet account, bạn có thể nhấp vào tab Collectibles để xem danh sách tất cả các NFT của bạn:

Wallet

IPFS

The InterPlanetary File System (IPFS) is a protocol and peer-to-peer network for storing and sharing data in a distributed file system. IPFS uses content-addressing to uniquely identify each file in a global namespace connecting all computing devices.

Upload image

To upload the NFT image, we are going to use the free NFT Storage service built specifically for storing off-chain NFT data. NFT Storage offers free decentralized storage and bandwidth for NFTs on IPFS and Filecoin.

Các bước thực hiện

  1. Đăng ký một account và đăng nhập vào nft.storage.

  2. Đi tới phần Files, và nhấp lên nút Upload.

    nft.storage

  3. 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

The source code for this contract can be found in nft/src/lib.rs. This contract contains logic which follows the NEP-171 standard (NEAR Enhancement Proposal) and the implementation of this standard which can be found here.

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

The contract keeps track of two pieces of information - tokens and metadata. For the purpose of this tutorial we will only deal with the tokens field.

#[near_bindgen]
#[derive(BorshDeserialize, BorshSerialize, PanicOnDefault)]
pub struct Contract {
tokens: NonFungibleToken,
metadata: LazyOption<NFTContractMetadata>,
}

The tokens are of type NonFungibleToken which come from the core standards. There are several fields that make up the struct but for the purpose of this tutorial, we'll only be concerned with the owner_by_id field. This keeps track of the owner for any given token.

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>,

...
}

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

In order for a token to be minted you will need to call the nft_mint function. There are three arguments that are passed to this function:

  • 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

This will generate WASM binaries into your res/ directory. This WASM file is the smart contract we'll be deploying onto the NEAR blockchain.

Tip: Nếu bạn gặp lỗi, hãy đảm bảo rằng bạn đã cài đặt Rust và đang ở trong thư mục root của ví dụ NFT này.

Test contract

Written in the smart contract there are pre-written tests that you can run. Run the following command in your terminal to perform these simple tests to verify that your contract code is working.

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.

Sử dụng NFT contract

Bây giờ bạn đã build và test NFT smart contract thành công, bạn đã sẵn sàng để deploy nó và bắt đầu sử dụng nó để mint NFT.

Deploy contract

This smart contract will be deployed to your NEAR account. Because NEAR allows the ability to upgrade contracts on the same account, initialization functions must be cleared.

Note: If you'd like to run this example on a NEAR account that has had prior contracts deployed, please use the near-cli command near delete and then recreate it in Wallet. To create (or recreate) an account, please follow the directions in Test Wallet or (NEAR Wallet if we're using mainnet).

Đăng nhập vào account vừa mới tạo với near-cli bằng cách chạy câu lệnh sau trong terminal của bạn.

near login

To make this tutorial easier to copy/paste, we're going to set an environment variable for your account ID. In the command below, replace YOUR_ACCOUNT_NAME with the account name you just logged in with including the .testnet (or .near for mainnet):

export ID=YOUR_ACCOUNT_NAME

Kiểm tra biến môi trường được cài đặt đúng hay chưa bằng cách chạy:

echo $ID

Verify that the correct account ID is printed in the terminal. If everything looks correct you can now deploy your contract. In the root of your NFT project run the following command to deploy your smart contract.

near deploy --wasmFile res/non_fungible_token.wasm --accountId $ID
Ví dụ về response nhận được:

Starting deployment. Account id: ex-1.testnet, node: https://rpc.testnet.near.org, helper: https://helper.testnet.near.org, file: res/non_fungible_token.wasm
Transaction Id E1AoeTjvuNbDDdNS9SqKfoWiZT95keFrRUmsB65fVZ52
To see the transaction in the transaction explorer, please open this url in your browser
https://explorer.testnet.near.org/transactions/E1AoeTjvuNbDDdNS9SqKfoWiZT95keFrRUmsB65fVZ52
Done deploying to ex-1.testnet

Note: For mainnet you will need to prepend your command with NEAR_ENV=mainnet. See here for more information.

Mint NFT

A smart contract can define an initialization method that can be used to set the contract's initial state. In our case, we need to initialize the NFT contract before usage. For now, we'll initialize it with the default metadata.

Note: each account has a data area called storage, which is persistent between function calls and transactions. For example, when you initialize a contract, the initial state is saved in the persistent storage.

near call $ID new_default_meta '{"owner_id": "'$ID'"}' --accountId $ID

Tip: bạn có thể tìm thêm thông tin về NFT metadata tại nomicon.io.

Sau đó, bạn có thể xem metadata bằng cách chạy lệnh view call sau:

near view $ID nft_metadata
Ví dụ về response nhận được:

{
"spec": "nft-1.0.0",
"name": "Example NEAR non-fungible token",
"symbol": "EXAMPLE",
"icon": "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 288 288'%3E%3Cg id='l' data-name='l'%3E%3Cpath d='M187.58,79.81l-30.1,44.69a3.2,3.2,0,0,0,4.75,4.2L191.86,103a1.2,1.2,0,0,1,2,.91v80.46a1.2,1.2,0,0,1-2.12.77L102.18,77.93A15.35,15.35,0,0,0,90.47,72.5H87.34A15.34,15.34,0,0,0,72,87.84V201.16A15.34,15.34,0,0,0,87.34,216.5h0a15.35,15.35,0,0,0,13.08-7.31l30.1-44.69a3.2,3.2,0,0,0-4.75-4.2L96.14,186a1.2,1.2,0,0,1-2-.91V104.61a1.2,1.2,0,0,1,2.12-.77l89.55,107.23a15.35,15.35,0,0,0,11.71,5.43h3.13A15.34,15.34,0,0,0,216,201.16V87.84A15.34,15.34,0,0,0,200.66,72.5h0A15.35,15.35,0,0,0,187.58,79.81Z'/%3E%3C/g%3E%3C/svg%3E",
"base_uri": null,
"reference": null,
"reference_hash": null
}

Now let's mint our first token! The following command will mint one copy of your NFT. Replace the media url with the one you uploaded to IPFS earlier:

near call $ID nft_mint '{"token_id": "0", "receiver_id": "'$ID'", "token_metadata": { "title": "Some Art", "description": "My NFT media", "media": "https://bafkreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/", "copies": 1}}' --accountId $ID --deposit 0.1
Ví dụ response nhận được:

{
"token_id": "0",
"owner_id": "dev-xxxxxx-xxxxxxx",
"metadata": {
"title": "Some Art",
"description": "My NFT media",
"media": "https://bafkreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/",
"media_hash": null,
"copies": 1,
"issued_at": null,
"expires_at": null,
"starts_at": null,
"updated_at": null,
"extra": null,
"reference": null,
"reference_hash": null
},
"approved_account_ids": {}
}

Để xem các token được sở hữu bởi một account, bạn có thể call NFT contract với câu lệnh near-cli sau:

near view $ID nft_tokens_for_owner '{"account_id": "'$ID'"}'
Ví dụ về response nhận được:

[
{
"token_id": "0",
"owner_id": "dev-xxxxxx-xxxxxxx",
"metadata": {
"title": "Some Art",
"description": "My NFT media",
"media": "https://bafkreiabag3ztnhe5pg7js4bj6sxuvkz3sdf76cjvcuqjoidvnfjz7vwrq.ipfs.dweb.link/",
"media_hash": null,
"copies": 1,
"issued_at": null,
"expires_at": null,
"starts_at": null,
"updated_at": null,
"extra": null,
"reference": null,
"reference_hash": null
},
"approved_account_ids": {}
}
]


Tip: sau khi bạn mint xong non-fungible token đầu tiên, bạn có thể xem nó trong Wallet của bạn:

Wallet với token


Congratulations! You just minted your first NFT token on the NEAR blockchain! 🎉

Các chú thích cuối cùng

Ví dụ cơ bản này minh họa tất cả các bước cần thiết để deploy một NFT smart contract, lưu các file media trên IPFS, và bắt đầu mint các non-fungible token của riêng bạn.

Now that you're familiar with the process, you can check out our NFT Example and learn more about the smart contract code and how you can transfer minted tokens to other accounts. Finally, if you are new to Rust and want to dive into smart contract development, our Quick-start guide is a great place to start.

Chúc bạn mint thành công! 🪙

Blockcraft - Phần mở rộng thực tế

Nếu bạn muốn tìm hiểu làm thế nào để dùng Minecraft để mint NFT và copy/dán các công trình trong các thế giới khác nhau, trong khi tất cả dữ liệu đều được lưu trữ on-chain, hãy xem ngay hướng dẫn Minecraft của chúng tôi

Version cho bài viết này

Tại thời điểm viết bài, ví dụ này tương thích với các version dưới đây:

  • cargo: cargo 1.54.0 (5ae8d74b3 2021-06-22)
  • rustc: rustc 1.54.0 (a178d0322 2021-07-26)
  • near-cli: 2.1.1