共享对象

在所有权中,另一种类型的对象是共享对象,共享对象没有专属所有者。

1. 共享不可变对象

已发布的包是一个不可变对象,您可以手动将对象设为不可变:

transfer::freeze_object(obj);

2. 共享可变对象

共享可变对象可以被任何人修改。

正如我们在上一课中提到的,一个由地址拥有的对象除了其所有者之外不能被修改。 在我们的城堡游戏中,我们有涉及不同所有者的城堡的战斗机制。 如果我们将城堡游戏数据放在城堡对象中,我们无法在“战斗”互动的战斗结算中修改对手的城堡。因此,我们需要利用可变对象。

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
}

init 函数中初始化并将其设为共享:

fun init(ctx: &mut TxContext) {
    use std::vector;
    ...

    transfer::share_object(
        GameStore{
            id: object::new(ctx),
            small_castle_count: 0,
            middle_castle_count: 0,
            big_castle_count: 0,
            castle_ids: vector::empty<ID>()
        }
    );
}

发布包后,我们可以在控制台中找到创建的共享 GameStore 对象。 object