定制类型与能力
在这一节,我们会逐步创建示例智能合约 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 中拥有 key
和 store
能力特性的定制类型被视为资产,资产可以在全局存储中存储,也可以在不同账号之间转移。
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 属性。