From de3564071e6ae3a6c453465470752beb6a02f07a Mon Sep 17 00:00:00 2001 From: hienphan Date: Wed, 25 Dec 2024 16:59:01 +0700 Subject: [PATCH] docs: NFT and practice 2 --- pages/Coin_NFT/Intro_to_nft.mdx | 8 ++ pages/Coin_NFT/_meta.json | 1 + pages/Coin_NFT/practice_2_animals_nft.mdx | 140 ++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 pages/Coin_NFT/practice_2_animals_nft.mdx diff --git a/pages/Coin_NFT/Intro_to_nft.mdx b/pages/Coin_NFT/Intro_to_nft.mdx index 697f2e4..4befffb 100644 --- a/pages/Coin_NFT/Intro_to_nft.mdx +++ b/pages/Coin_NFT/Intro_to_nft.mdx @@ -78,3 +78,11 @@ public entry fun mint( ``` +# Summary lại là: + +## **NFT** +- NFT sẽ có unique code +- Có Ownership( Người sẽ sỡ hữu NFT đó) +- Chứa các attributes( Name, ImageURL) + +Bất kỳ Object nào implement Display đều là một NFT. Standard Display của object Sui là một template engine cho phép quản lý on-chain các biểu diễn off-chain (display) của các type( Các bạn sẽ được học ở nội dung tiếp theo) diff --git a/pages/Coin_NFT/_meta.json b/pages/Coin_NFT/_meta.json index eb8c77e..56fd867 100644 --- a/pages/Coin_NFT/_meta.json +++ b/pages/Coin_NFT/_meta.json @@ -5,6 +5,7 @@ "Coin_and_balance": "Coin và Balance", "simple_airdrop": "Practice 1: Build Sui airdrop contract", "Intro_to_nft": "NFT trong Sui move", + "practice_2_animals_nft": "Practice 2: Tạo Rare Animal NFTs at the zoo", "publisher": "Publisher object", "Sui_object_display": "Sui object display" } diff --git a/pages/Coin_NFT/practice_2_animals_nft.mdx b/pages/Coin_NFT/practice_2_animals_nft.mdx new file mode 100644 index 0000000..cdec83c --- /dev/null +++ b/pages/Coin_NFT/practice_2_animals_nft.mdx @@ -0,0 +1,140 @@ +# Ví dụ: Tạo Rare Animal NFTs at the Thao Cam Vien Zoo 🥺 + +Trong ví dụ này mình sẽ viết một module `wild_NFT`. Đây là module được thiết kế quản lý các NFT động vật quý hiếm ở sở thú + +Sau đây là phần giới thiệu về các cấu trúc chính: + +1. Animals struct: + +```rust +public struct AnimalInfo has key , store { + id: UID, + name: String, + species: String, + habitat: String, + status: u64, + image_url: Url + } + +public struct Animals has key, store { + id: UID, + animal_infos: Table, +} + + +//Nhân viên mới sẽ có quyền để cung cấp thêm thông tin động vật + public struct NFTAdminCap has key{ + id: UID + } + +``` + +# **Hàm (Function)**: + +1. **Thêm thông tin động vật (Quyền Admin)** Admin có thể thêm thông tin động vật mới vào struct `Animals:` + +```rust +public fun add_animal( + _: &NFTAdminCap, + animals: &mut Animals, + name: String, + species: String, + habitat: String, + status: u64, + image_url: String, + ctx: &mut TxContext, +) { + let new_animal = AnimalInfo { + id: object::new(ctx), + name, + species, + habitat, + status, + image_url, + }; + let key = table::length(&animals.animal_infos); + table::add(&mut animals.animal_infos, key, new_animal); +} +``` + +Ví dụ sau khi mình add thành công: + +```rust +[warning] Client/Server api version mismatch, client api version : 1.39.2, server api version : 1.39.3 +╭───────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ +│ objectId │ 0xb9235f4a2b07d6c6f071c7a42bdc58ec1ca1ab040dbcdb44d4844d8709bc2b99 │ +│ version │ 289571540 │ +│ digest │ 3bicPMZ8jYBS6oGjPm2dcaiZQia9WLqzzrdJ6KmEi2Zv │ +│ objType │ 0xf5e12e4451771fb23acca10a10b23ecb797d52c11ad42e363616062e9120e6c6::animal::Animals │ +│ owner │ ╭──────────────┬──────────────────────────────────────────────────────────────────────╮ │ +│ │ │ AddressOwner │ 0x915c2d19ee5fde257693f25e6c2cabb04c25e7ae03932817d52e122258c88ddb │ │ +│ │ ╰──────────────┴──────────────────────────────────────────────────────────────────────╯ │ +│ prevTx │ 63Rni1y3Ms6g6B89Aq1utKgZpNmbSLeEEBeV6rLWfw7x │ +│ storageRebate │ 1596000 │ +│ content │ ╭───────────────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ +│ │ │ dataType │ moveObject │ │ +│ │ │ type │ 0xf5e12e4451771fb23acca10a10b23ecb797d52c11ad42e363616062e9120e6c6::animal::Animals │ │ +│ │ │ hasPublicTransfer │ true │ │ +│ │ │ fields │ ╭──────────────┬───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ +│ │ │ │ │ animal_infos │ ╭────────┬──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │ │ │ +│ │ │ │ │ │ │ type │ 0x2::table::Table │ │ │ │ +│ │ │ │ │ │ │ fields │ ╭──────┬───────────────────────────────────────────────────────────────────────────────╮ │ │ │ │ +│ │ │ │ │ │ │ │ │ id │ ╭────┬──────────────────────────────────────────────────────────────────────╮ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ │ id │ 0x60c9569eb12e3c466c9894ad61ec7add6a0f6791334074a83e3db6c446aebc35 │ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ │ ╰────┴──────────────────────────────────────────────────────────────────────╯ │ │ │ │ │ +│ │ │ │ │ │ │ │ │ size │ 0 │ │ │ │ │ +│ │ │ │ │ │ │ │ ╰──────┴───────────────────────────────────────────────────────────────────────────────╯ │ │ │ │ +│ │ │ │ │ │ ╰────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ │ +│ │ │ │ │ id │ ╭────┬──────────────────────────────────────────────────────────────────────╮ │ │ │ +│ │ │ │ │ │ │ id │ 0xb9235f4a2b07d6c6f071c7a42bdc58ec1ca1ab040dbcdb44d4844d8709bc2b99 │ │ │ │ +│ │ │ │ │ │ ╰────┴──────────────────────────────────────────────────────────────────────╯ │ │ │ +│ │ │ │ ╰──────────────┴───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ │ +│ │ ╰───────────────────┴──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │ +``` + +Ngoài ra bạn có thể có thêm quyền update thông tin của động vật đó ( chỉ có admin mới làm được) : + +```rust +public fun update_animal( + _: &NFTAdminCap, + animals: &mut Animals, + key: u64, + new_name: String, + new_status: u64, + ctx: &mut TxContext, +) { + // kiểm tra id của động vật đó là stt của động vật đó + //assert!(table::contains(&animals.animal_infos, key), ERR_KEY_DOES_NOT_EXIST); + + let animal_info = table::borrow_mut(&mut animals.animal_infos, key); + animal_info.name = new_name; + animal_info.status = new_status; +} + +``` + +Tiếp theo mình sẽ làm sâu hơn về các phần làm việc với NFT như là Buy NFT: + +```rust +public fun mint_nft( + animals: &Animals, + key: u64, + inputcoin: Coin, + recipient: address, + ctx: &mut TxContext, +) { + + let animal_info = &animals.animal_infos[key]; + let new_nft = AnimalNFT { + id: object::new(ctx), + name: animal_info.name, + animal_id: key, + species: animal_info.species, + habitat: animal_info.habitat, + adopted_by: recipient, + image_url: animal_info.image_url, + }; + transfer::public_transfer(new_nft, recipient); +} +``` +