动态字段 - 存储城堡数据

Move 提供了一项独特的功能,允许在 Sui 对象初始构建后添加字段,这超出了类型定义中声明的字段的预定义结构的限制。动态字段具有在运行时添加或删除字段的能力。

有两种类型的动态字段:

  1. 动态字段
  2. 动态对象字段

动态字段

sui::dynamic_field 可以向具有 field id: UID 的 Sui 对象添加任何具有 store 能力的值。

为了说明其用法,让我们深入探讨 Move Castle 游戏的 Game Store 组件。 由于在 Sui 中对象可见性的考虑(将在后续课程中介绍),将每个城堡的某些游戏数据存储在城堡对象中是不切实际的。 这尤其与战斗机制有关,因为战斗机制会影响双方城堡的状态。因此,需要一个集中存储库来存储共享的游戏数据。

core.move 中,我们添加一个 GameStore 结构体:

/// 持有游戏信息
public struct GameStore has key, store {
    id: UID,
    small_castle_count: u64, // 小型城堡数量限制
    middle_castle_count: u64, // 中型城堡数量限制
    big_castle_count: u64, // 大型城堡数量限制
    castle_ids: vector<ID>, // 存储所有城堡对象 ID
}

我们将在未来的课程中将 GameStore 对象发布为共享对象。

在创建城堡对象时,我们需要将城堡游戏数据作为动态字段添加到游戏存储中:

let castle_data = CastleData {...}; // 省略城堡数据构建
dynamic_field::add(&mut game_store.id, castle_object_id, castle_data);

在这种情况下,动态字段的键是城堡对象的 ID,字段值是城堡数据。

要检索城堡数据,可以使用以下代码:

let castle_data = dynamic_field::borrow_mut<ID, CastleData>(&mut game_store.id, castle_object_id);
(使用动态字段存储城堡数据仅用于教学目的,并不是存储城堡数据的基本方法。)

动态对象字段

类似于动态字段,sui::dynamic_object_field 要求字段值必须是 Sui 对象。这意味着动态对象字段值必须具有 keystore 能力。

对动态对象字段的操作与动态字段类似。主要区别在于,动态对象字段值是具有 id: UID 字段的 Sui 对象。

要获得更全面的理解和详细示例,请参阅以下介绍:Move 中的动态对象字段