Skip to main content

编写 Move 包

在构建 Move 包并运行其代码之前,你必须首先为你的操作系统安装 Sui 二进制文件

创建包

首先,在你计划存储包的位置打开一个终端或控制台。使用 sui move new 命令创建一个名为 my_first_package 的空 Move 包:

sui move new my_first_package

运行上述命令将创建一个以你提供的名称(my_first_package)命名的目录。该命令使用一个骨架 Move 项目填充新目录,其中包括一个 sources 目录和一个 Move.toml 清单文件。使用文本编辑器打开清单文件以查看其内容:

cat my_first_package/Move.toml
[package]
name = "my_first_package"
version = "0.0.1"

[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework/packages/sui-framework", rev = "framework/devnet" }

[addresses]
my_first_package = "0x0"
sui = "0000000000000000000000000000000000000000000000000000000000000002"

定义包

现在你有一个包,但它什么都不做。为了使你的包有用,你必须添加包含在 .move 源文件中的逻辑,这些文件定义了模块。使用文本编辑器或命令行,在包的 sources 目录中创建名为 my_module.move 的第一个包源文件:

touch my_first_package/sources/my_module.move

使用以下代码填充 my_module.move 文件:

module my_first_package::my_module {

// Part 1: Imports
use sui::object::{Self, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};

// Part 2: Struct definitions
struct Sword has key, store {
id: UID,
magic: u64,
strength: u64,
}

struct Forge has key, store {
id: UID,
swords_created: u64,
}

// Part 3: Module initializer to be executed when this module is published
fun init(ctx: &mut TxContext) {
let admin = Forge {
id: object::new(ctx),
swords_created: 0,
};
// Transfer the forge object to the module/package publisher
transfer::transfer(admin, tx_context::sender(ctx));
}

// Part 4: Accessors required to read the struct attributes
public fun magic(self: &Sword): u64 {
self.magic
}

public fun strength(self: &Sword): u64 {
self.strength
}

public fun swords_created(self: &Forge): u64 {
self.swords_created
}

// Part 5: Public/entry functions (introduced later in the tutorial)

// Part 6: Private functions (if any)

}

前面代码中的注释突出显示了典型 Move 源文件的不同部分。

  • 第一部分:导入 - 在现代编程中,代码重用是必需的。Move 通过允许模块使用在其他模块中声明的类型和函数的导入来支持这一概念。在这个例子中,模块从 objecttransfertx_content 模块导入。这些模块在包中可用,因为 Move.toml 文件定义了 Sui 依赖项(以及它们被定义的 sui 命名地址)。

  • 第二部分:结构声明 - 结构定义了模块可以创建或销毁的类型。结构定义可以包括使用 has 关键字提供的能力。例如,此示例中的结构具有 key 能力,表示这些结构是可以在地址之间转移的 Sui 对象。结构上的 store 能力提供了在其他结构字段中出现并自由传输的能力。

  • 第三部分:模块初始化器 - 一个特殊的函数,在模块发布时确切地调用一次。

  • 第四部分:访问器函数 - 这些函数允许从其他模块读取模块结构的字段。

保存文件后,你就拥有了一个完整的 Move 包。

在下一个主题中,你将学习构建和测试你的包,使其准备好发布。