Basic concepts in Sui Move
Modules

Như vậy bạn đã hiểu về việc làm sao để set up Move trên Sui package và những components quan trọng trong Sui package. Trong nội dung tiếp theo, ta sẽ tìm hiểu về cấu trúc của một smart contract trong Sui Move. Điều gì làm nên sự khác biệt khi code Sui move?

Modules trong Sui là gì ?

Ở Sui Move, khi khai báo một smart contract, ta sẽ sử dụng từ khoá module, giống với ở solidity ta sẽ có từ contract. Đây là syntax khi khai báo smart contract

 
module <package_name>::<module_name> { 
    //module code ở đây 
}
 
  • package_name là tên của package mà bạn đã tạo. Ví dụ trong lệnh sui move new hello_world thì package name sẽ là hello_world.

  • module_name sẽ là cái tên module mà bạn đã tạo trong package.

Module:

  • Bạn có thể xem module là thư viện con trong package.

  • Có thể có nhiều modules trong một package đó là lý do tại sao việc đề cập rõ ràng tên module là rất quan trọng. Tất cả các code của contract đều sẽ nằm ở trong module bao gồm cả các lệnh import.

  • Tính chất đóng gói (encapsulation) của module giúp cho việc phát triển smart contract trở nên module hóa, có khả năng kết hợp linh hoạt, đồng thời nâng cao khả năng tái sử dụng mã nguồn và tính bảo mật.

Từ khoá use - cách để import bất kỳ module

Trong Sui move, use được sử dụng để import bất kì module. Đây là cấu trúc của cách sử dụng use:

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

Giải thích về <Address/Alias><ModuleName> là:

  • <Address/Alias> là những địa chỉ của package có chứa những module mà ta muốn dùng. Chúng ta thể sử dụng alias được đặt trong Move.toml mà đã viết ở mục Package manifest

Ví dụ:

// Move.toml
[package]
name = "suilend"
version = "0.0.1"
published-at = "0x5b54b47971238403d6ade3c8c2cc75814cb55145a5184af916bb5b12aaf184cb"
edition = "2024.beta"
 
[dependencies.Sui]
git = "https://github.com/MystenLabs/sui.git"
subdir = "crates/sui-framework/packages/sui-framework"
rev = "framework/mainnet"
override = true
 
[dependencies.Pyth]
git = "https://github.com/solendprotocol/pyth-crosschain.git"
subdir = "target_chains/sui/contracts"
rev = "98e218c64bb75cf1350eb7b021e1ffcc3aedfd62"
 
[dependencies.liquid_staking]
git = "https://github.com/solendprotocol/liquid-staking.git"
subdir = "contracts"
rev = "main"
 
[dependencies.sprungsui]
local = "../sprungsui"
 
[addresses]
sui = "0x2"
# suilend = "0x0"
suilend = "0xf95b06141ed4a174f239417323bde3f209b972f5930d8521ea38a52aff3a6ddf"

Link code: https://github.com/solendprotocol/suilend/blob/devel/contracts/suilend/Move.toml (opens in a new tab)

  • <ModuleName> đơn giản đại diện cho tên của module đó.

Sau đây là một số Sui modules mà bạn sẽ thường sử dụng

 
# Module này giúp chúng ta xử lý liên quan đến string 
use std::string;
 
// https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/move-stdlib/sources/string.move
 
# Module này sẽ giúp khi ta cần các chức năng transfer object từ một account đến account khác 
use sui::transfer; 
// https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/transfer.move
 
# dòng dưới đây giúp cho việc tạo object trong module.
use sui::object;
// https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/object.move
 
 
# Đây là đoạn import từ sui framework. Giúp ta trong việc đinh nghĩa các thông tin của transaction như là địa chỉ của sender, địa chỉ người ký ...
use sui::tx_context;
// https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/tx_context.move
 
 

Bên cạnh việc import một module, Move cho phép bạn import cụ thể đối tượng từ module bao gồm functions và types. Điều này hữu ích khi bạn chỉ muốn một chức năng của module, Giảm việc không cần những đoạn code không cần thiết. Ví dụ:

 
// import function từ một module 
use sui_bootcamp::module_one::learn; 
 
// import từ Learner Type 
use sui_bootcamp::module_one::Learner;
 

Không chỉ thế Move cho phép ta import nhiều từ module hoặc package bằng cách dùng dấu {}:

 
// import learn function và Learner type từ module one
use sui_bootcamp::module_one::{learn, Learner};
 
// import module và Learner type
 
use sui_bootcamp::module_one::{Self, Learner};

Làm sao để giải quyết vấn đề trùng tên? (Name conflict)

Giả sử khi import nhiều modules, vấn đề trùng tên sẽ có thể diễn ra. Move cung cấp giải pháp này bằng cách dùng as để thay đổi tên của members. Đây là ví dụ:

use sui_bootcamp::module_one::{Self as Learnmode, Learner as Lea};

Như vậy ta đã hiểu về module đóng vai trò như thế nào trong việc tạo Sui Move và use dùng để import các module khác bên ngoài.