Sui 中的每个 object 都有所有者的属性来声明所有权。在 Sui Move 中总共有四种类型的所有权。
- 被拥有
- 被一个地址拥有
- 被另一个 object 拥有
- 共享
- 不可变的共享
- 可变的共享
前两种所有权类型都属于被拥有的 Objects. 在 Sui 中,和共享的 objects 处理方式不同,被拥有的 objects 不需要按全局排序。
还是看之前成绩记录单 transcript
的例子,这种类型的所有权是很符合直觉的。就像下面这行代码示例那样,这个 object 在创建后被转移到了一个地址,那么该 object 就被该地址所有。
transfer::transfer(transcriptObject, tx_context::sender(ctx)) // where tx_context::sender(ctx) is the recipient
这段代码中 transcriptObject
创建后被转移到了交易发起者的地址。
要使一个 object 被另一个 object 拥有,可以使用 dynamic_object_field
. 这个功能我们会在未来的章节中探讨。简单来说,当一个 object 被另一个 object 拥有时,我们可以将其称为 子object. 一个 子object 同样可以在全局存储中使用 object ID 进行查询。
在 Sui 中确定的 objects 不能再被任何人改变,也因此可以被认为没有唯一的所有者,是共享的。在 Sui 中所有已发布的 packages 和 modules 都属于不可变的 objects.
要手动让一个 object 不可变,可以调用下面这个特殊函数:
transfer::freeze_object(obj);
Sui 里头的共享 objects 可以被任何人读和改。和被拥有的 objects 不一样,共享的 object 交易需要通过共识层协议得到的全局顺序。
要创建一个共享的 object, 可以调用这个方法:
transfer::share_object(obj);
一旦一个 object 成为了共享的,就会保持可变的状态。任何人都可以通过发起交易去改变这个 object.