Sui Objects 所有权的类型

Sui 中的每个 object 都有所有者的属性来声明所有权。在 Sui Move 中总共有四种类型的所有权。

  • 被拥有
    • 被一个地址拥有
    • 被另一个 object 拥有
  • 共享
    • 不可变的共享
    • 可变的共享

被拥有的 Objects

前两种所有权类型都属于被拥有的 Objects. 在 Sui 中,和共享的 objects 处理方式不同,被拥有的 objects 不需要按全局排序。

被一个地址拥有

还是看之前成绩记录单 transcript 的例子,这种类型的所有权是很符合直觉的。就像下面这行代码示例那样,这个 object 在创建后被转移到了一个地址,那么该 object 就被该地址所有。

#![allow(unused)]
fn main() {
    transfer::transfer(transcriptObject, tx_context::sender(ctx)) // where tx_context::sender(ctx) is the recipient
}

这段代码中 transcriptObject 创建后被转移到了交易发起者的地址。

被另一个 object 拥有

要使一个 object 被另一个 object 拥有,可以使用 dynamic_object_field. 这个功能我们会在未来的章节中探讨。简单来说,当一个 object 被另一个 object 拥有时,我们可以将其称为 子object. 一个 子object 同样可以在全局存储中使用 object ID 进行查询。

共享的 Objects

不可变的共享 Objects

在 Sui 中确定的 objects 不能再被任何人改变,也因此可以被认为没有唯一的所有者,是共享的。在 Sui 中所有已发布的 packages 和 modules 都属于不可变的 objects.

要手动让一个 object 不可变,可以调用下面这个特殊函数:

#![allow(unused)]
fn main() {
    transfer::freeze_object(obj);
}

可变的共享 Objects

Sui 里头的共享 objects 可以被任何人读和改。和被拥有的 objects 不一样,共享的 object 交易需要通过共识层协议得到的全局顺序。

要创建一个共享的 object, 可以调用这个方法:

#![allow(unused)]
fn main() {
    transfer::share_object(obj);
}

一旦一个 object 成为了共享的,就会保持可变的状态。任何人都可以通过发起交易去改变这个 object.