Skip to main content

Command Palette

Search for a command to run...

EP 2: ตีบวกไอเทม ด้วย Extension Object

Updated
2 min read
EP 2: ตีบวกไอเทม ด้วย Extension Object

จากบทความที่เเล้วเราได้วิธีการสร้าง ไอเทม เเละกระเป๋าไปเรียบร้อยแล้ว หากใครยังไม่มีดาบ ไปสร้างมันมาสะบัดเดียวนี้ https://onthemoveth.hashnode.dev/ep-1-game-item-with-sui-object


มีดาบเเล้ว เทพทรูก็ต้องเข้าละ นั้นคือการตีบวกเพิ่มความสามารถให้กับไอเทมของเรานั้นเอง

ปัญหาที่ต้องแก้ก่อน

Sui จะไม่ให้เรา เพิ่ม field ใหม่ ในโครงสร้างของไอเทมเดิมได้ตรงๆ เพราะจะทำให้ object เก่าพัง (layout ไม่ตรง) แต่ไม่ต้องกลัว! เรามีเวทมนตร์ที่ชื่อว่า Dynamic Field 🔮 ที่จะช่วยให้เพิ่มข้อมูลใหม่โดยไม่แตะ object เดิมเลย

พร้อมแล้วไปลุยกันเลย…

เพิ่มพลังให้ Item ด้วย Extension

เราจะสร้าง object ลูกชื่อ ItemExtra เพิ่มไปในไฟล์เดิมของเรา items.move โดยใช้ dynamic_field ของ Sui Framework

use 0x2::dynamic_field as df;
    public struct ExtraKey has copy, drop, store {}

    public struct ItemExtra has key, store {
        id: UID,
        rarity: u8,
        durability: u64,
        parent: address,
    }

    public fun attach_extra_to_item(
        item: &mut Item,
        rarity: u8,
        durability: u64,
        ctx: &mut TxContext
    ) {
        let extra = ItemExtra {
            id: object::new(ctx),
            rarity,
            durability,
            parent: object::id_address(item),
        };
        df::add(&mut item.id, ExtraKey{}, extra);
    }

    public entry fun set_extra(item: &mut Item, new_rarity: u8, new_durability: u64) {
        let extra_ref = df::borrow_mut<ExtraKey, ItemExtra>(&mut item.id, ExtraKey{});
        extra_ref.rarity = new_rarity;
        extra_ref.durability = new_durability;
    }

ทำการอัพเกรด กันก่อนเลยเพื่อทำให้ตัว Object ของเรามีความสามารถเพิ่มเติมด้วยคำสั่งด้านล่างนี้

sui client upgrade --upgrade-capability $UPGRADE_CAP_ID --gas-budget 100000000

โดย UPGRADE_CAP_ID คือข้อมูล CAP_ID จากบทความที่แล้ว ที่เราได้ deploy ขึ้นไปกันนั้นเอง

เริ่มใช้งาน Extension Object

ทำการเพิ่มคุณสมบัติเพิ่มเติมให้กับ item ของเราก่อนโดยใช้คำสั่ง

sui client call --package $PACKAGE_ID --module items --function attach_extra_to_item --args $ITEM_ID 5 1000 --gas-budget 50000000

หลังจากนั้นในฐานะ gm ของระบบ เราก็สามารถทำการเเก้ไขคุณสมบัติของ item ได้เต็มที่เลยโดยใช้คำสั่ง

sui client call --package $PACKAGE_ID --module items --function set_extra --args $ITEM_ID 6 1200 --gas-budget 50000000

ซึ่งในที้นี้เราได้ทำการเเก้ไข rarity และ durability เป็น 6, 1200 ตามลำดับนั้นเอง

Diagram แสดงความสัมพันธ์

classDiagram
    class Inventory {
        +UID id
        +address owner
    }

    class Item {
        +UID id
        +String name
        +String class
        +u64 power
        +String image_url
    }

    class ItemExtra {
        +UID id
        +u8 rarity
        +u64 durability
        +address parent
    }

    Inventory "1" o-- "many" Item : holds
    Item "1" o-- "1" ItemExtra : dynamic_field

จากตรงนี้ เราก็ได้เรียนรู้วิธีการอัพเดดไอเทมเป็นที่เรียบร้อยแล้ว

✅ อัปเกรดแพ็กเกจโดยไม่ทำของเก่าพัง
✅ เพิ่ม field ใหม่ได้เรื่อย ๆ ผ่าน Extension
✅ ใช้ Dynamic Field ทำให้ Item ขยายได้ไม่จำกัด

ตอนนี้เราก็มีระบบไอเทมที่ อัปเกรดได้ จริง ๆ แล้ว จะเพิ่มระบบตีบวก คราฟต์ของ หรือแม้แต่ marketplace ก็เริ่มต่อยอดได้เลย!

By GANG | ContributionDAO