使用 Sui Objects

介绍

Sui Move 是一门完全以 object 为中心的编程语言。在Sui上交易的输入与输出都可以是对 objects 的操作。 我们之前就已经在第一单元的第四课中简单接触过这个概念,Sui objects 是 Sui 存储中的基本单元,所有都会使用 struct 关键词开头。

看一个记录学生成绩报告单的例子:

#![allow(unused)]
fn main() {
public struct Transcript {
    history: u8,
    math: u8,
    literature: u8,
}
}

上面定义的只是一个常规的 Move struct, 但还不是一个 Sui object. 要使一个定制的 Move 类型实例成为全局存储的 Sui object, 我们还需要添加 key 能力以及在 struct 定义时内部添加全局唯一的 id: UID 属性。

#![allow(unused)]
fn main() {
use sui::object::{UID};

public struct TranscriptObject has key {
    id: UID,
    history: u8,
    math: u8,
    literature: u8,
}
}

创建一个 Sui Object

创建一个 Sui object 需要一个唯一ID, 我们可以根据当前 TxContext 中的信息,使用 sui::object::new 函数来创建一个新的 ID.

在 Sui 当中,每个 object 都必须拥有一个所有者,这个所有者可以是地址,别的 object, 或者就被所有人共享。在我们的例子中,我们想让新建的 transcriptObject 属于交易发起者。这可以先使用 tx_context::sender 函数获得当前 entry 函数调用者也就是交易发起者 sender 的地址,然后用 Sui framework 中的 transfer 函数转移所有权。

在下一节,我们会更深入探讨 object 的所有权。

#![allow(unused)]
fn main() {
use sui::object::{Self};
use sui::tx_context::{Self, TxContext};
use sui::transfer;

public entry fun create_transcript_object(history: u8, math: u8, literature: u8, ctx: &mut TxContext) {
  let transcriptObject = TranscriptObject {
    id: object::new(ctx),
    history,
    math,
    literature,
  };
  transfer::transfer(transcriptObject, tx_context::sender(ctx))
}
}

💡注意: Move 支持属性的punning简化,当属性名与绑定的变量名一致的时候,就可以省略属性值的传递。