不可变对象

到目前为止,我们已经创建了两个对象:SuiFren 和 GiftBox。这两个都是归属对象。 它们由用户拥有,只有所有者才能将其包含在交易中。我们还简要讨论了共享对象——那些可以包含在任何交易中的对象。 在本课中,我们将讨论第三种对象类型——不可变对象。

不可变对象与共享对象几乎相同。任何用户都可以将它们作为其交易的一部分。 然而,共享对象可以作为可变引用包含,因此可以被任何人修改。而不可变对象在“冻结”后永远不能改变。

public struct ColorObject has key {
    id: UID,
    red: u8,
    green: u8,
    blue: u8,
}

public entry fun freeze_owned_object(object: ColorObject) {
    transfer::freeze_object(object)
}

public entry fun create_immutable(red: u8, green: u8, blue: u8, ctx: &mut TxContext) {
    let color_object = ColorObject {
        id: object::new(ctx),
        red,
        green,
        blue,
     };
    transfer::freeze_object(color_object);
}

在上面的示例中,create_immutable 创建一个对象并立即将其冻结,使其成为不可变对象。而 freeze_owned_object 则是接收一个现有的归属对象并将其变为不可变对象。请注意,如果在共享对象上调用 transfer::freeze_object 会导致错误。freeze_owned_object 展示了不可变对象与共享对象之间的另一个关键区别——归属对象不能变为共享对象(需要在创建对象后的同一交易中立即调用 transfer::share_object),但归属对象可以在任何时候根据所有者的意愿变为不可变对象。

不可变对象可以通过不可变引用(&)在任何时候包含:

public fun read_immutable(color: &ColorObject): (u8, u8, u8) {
    (color.red, color.green, color.blue)
}

read_immutable 可以在任何不可变(冻结的)颜色对象上调用,并且不需要所有权。