在Sui中,我们首先需要探索的一个基本概念是对象(objects)。 Sui里的所有数据都表示为不同对象内部的字段。这模拟了现实生活中的一切事物都是对象 —— 椅子、桌子、灯等。人们在生活中通过与对象互动,观察它们以了解其特征,与它们互动并修改它们的状态。

在Sui区块链上,创建、读取、与对象交互并修改对象都是模块的操作范围。 当用户发送交易以调用区块链上的不同函数时,他们调用的函数可能需要从用户所拥有的多个对象中读取数据,并修改它们以反映用户交互的结果。 对象是Move中的核心基本构建块,也是任何应用程序的核心。在构建应用程序时, 开发者首先应该考虑的是应用程序数据的样子以及需要创建哪些对象来存储这些数据。

例如,作为票务应用程序的一部分,用户可能会调用一个的模块会首先给你一张票,并允许你检查它是否已过期:

module modules::ticket_module_04 {
    use sui::clock::{Self, Clock};
    use sui::object::{Self, UID};
    use sui::transfer;
    use sui::tx_context::TxContext;

    public struct Ticket has key {
        id: UID,
        expiration_time: u64,
    }

    public fun create_ticket(ctx: &mut TxContext, clock: &Clock) {
        let ticket = Ticket {
            id: object::new(ctx),
            expiration_time: clock::timestamp_ms(clock),
        };
        transfer::share_object(ticket);
    }
}

步骤如下:

  1. 定义对象(我们使用结构体(struct)来表示对象)。在这情况下,我们定义Ticket对象。 该对象必须具有key能力,并且具有类型为 object::UID 的id字段(参见模块顶部的导入语句)。
  2. 调用 object::new,并传入通过发起交易来调用所有函数时默认的 &mut TxContext 参数。 创建新对象时需要&mut TxContext来调用 object::new,它会返回对象独有的id,可以分配给对象的id字段(在本例中为Ticket)。
  3. 调用 transfer::share_object 将对象设为共享对象。当对象中的数据被多个用户使用(全局数据)且不属于任何特定用户时, 这很有用。在本例中,从技术上讲,票不应共享,但我们将其设为共享以进行演示。 归属对象指的是是由特定用户所拥有的对象,仅可在该用户的许可下(通过签署交易)读取或修改。我们将在后续课程中详细介绍共享和归属对象。