定制类型与能力

在这一节,我们会逐步创建示例智能合约 Hello World, 过程中会遇到一些像是定制类型与能力之类的基础概念,一道讲解。

初始化 Package

(如果你跳过了前面的章节) 在安装 Sui binaries之后,你可以使用下面的命令行指令来初始化一个名为 Hello World 的 Sui package:

sui move new hello_world

创建智能合约源文件

选择一个代码编辑器在 sources 子文件夹内创建一个名为 hello.move 的 Move 智能合约源代码。

然后在内创建一个格式如下的空 module:

module hello_world::hello {

    // module contents
    
}

引入声明 Import Statements

在 Move 中可以通过地址来直接引入 modules, 但为了让代码易于阅读,更建议使用关键词 use 来管理引入操作。

    use <Address/Alias>::<ModuleName>;

在我们的示例代码中,需要引入以下 modules:

    use std::string;
    use sui::object::{Self, UID};
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};

定制类型

Sui Move 中的 structure 是一种包含 key-value 键值对的定制类型,key是一项属性的命名,value是对应存储的值。Structure 使用关键词 struct 声明。一个 structure 最多拥有 4 项能力。

能力

在 Sui Move 中,能力属于关键词,定义了类型数据在编译时的行为。

在 Sui Move 的编程语言中,能力特性至关重要,定义了 object 的行为。能力特性之间的每种独特组合都是独有的设计模式。我们会在课程中学习如何在 Sui Move 中使用能力特性。

但现在,只需要知道 Sui Move 中有四类能力特性:

  • copy: 值可以被复制
  • drop: 在作用域范围结束后值可以被丢弃
  • key: 在全局存储操作中值可以被用为key键
  • store: 值可以在全局存储中被存储

资产

在 Sui Move 中拥有 keystore 能力特性的定制类型被视为资产,资产可以在全局存储中存储,也可以在不同账号之间转移。

Move 能力类型说明

Hello World 定制类型

在 Hello World 示例中定义的 object 如下:

    /// 包含了任意字符串的 object
    public struct HelloWorldObject has key, store {
        id: UID,
        /// 被 object 包含的字符串
        text: string::String
    }

这里的 UID 是一种 Sui Framework 类型 (sui::object::UID), 它定义了一个 object 的全局唯一ID. 每个定制类型都需要有一项 ID 属性。