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ệnhsui 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>
và <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"
<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.