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





