Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/sui concepts #8

Merged
merged 4 commits into from
Nov 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ node_modules
.next
.env
.vercel
package-lock.json
8 changes: 8 additions & 0 deletions pages/Basic_Move_Programming/_meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"sui_move_package" : "Sui move package",
"sui_move_address_accounts":"Addresses and Accounts",
"sui_move_transaction": "Transaction structure",
"sui_move_module": "Modules",
"sui_move_variable": "Sui move Variables",
"": ""
}
42 changes: 42 additions & 0 deletions pages/Basic_Move_Programming/sui_move_address_accounts.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Address là gì ?

Address một định danh duy nhất trên blockchain. Nó được dùng để xác định các `package`, `account` và `object`. Địa chỉ sẽ có kích thước cố định 32 byte và được biểu diễn dưới dạng prefix là `0x`.

Ví dụ:

```bash
0xe51ff5cd221a81c3d6e22b9e670ddf99004d71de4f769b0312b68c7c4872e2f1
```

Địa chỉ trên là địa chỉ valid vì nó có **64 ký tự (32 bytes)** và prefix là `0x`


Sui cũng có các reserved addresses ( địa chỉ được dành riêng ) để định danh các package và object chuẩn. . Các địa chỉ này thường là các giá trị đơn giản, dễ nhớ và dễ gõ. Ví dụ địa chỉ của standard library là 0x1. Các địa chỉ này được mặc định là đã padding các số 0 bên trái:

```bash
0x1 = 0x0000000000000000000000000000000000000000000000000000000000000001
```

Đây là một số ví dụ về reserved addresses:

* 0x1 = Địa chỉ của [Standard library](https://move-book.com/move-basics/standard-library.html) - std
* 0x2 = Địa chỉ của [Sui framework](https://move-book.com/programmability/sui-framework.html)
* 0x3 = Địa chỉ của [Sui system](https://docs.sui.io/references/framework/sui-system/sui_system)
* 0xb = Địa chỉ của [Bridge](https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/docs/bridge/bridge.md)
* 0xdee9 = Địa chỉ của [Deepbook](https://github.com/MystenLabs/sui/tree/main/crates/sui-framework/docs/deepbook)
* 0x403 = Địa chỉ của [DenyList object](https://docs.sui.io/standards/coin)



> Trong những section tiếp theo bạn sẽ được tìm hiểu Address Type. Nội dung tiếp theo liên quan đến address là account


# Account là gì trong Sui Blockchain?

Account( tài khoản) là nơi định danh của người dùng trên blockchain. Nó được tạo ra từ private key và được xác định bằng **address**. Một tài khoản có thể sỡ hữu các object và thực thi các transactions. Mỗi transaction đều có sender ( người gửi)

Sui hỗ trợ nhiều thuật toán cryptographic cho cơ chế tạo account. Hai đường cong hỗ trợ chính là ed25519 và secp256k1 và một cách đặc biệt khác là dùng zklogin - một trong những feature đặc biệt ở Sui. Để hiểu chi tiết về cơ chế account generation bạn có thể đọc các bài viết sau:


* Bài blog của sui về [Cryptography](https://blog.sui.io/wallet-cryptography-specifications/)
* Bài documentation về [Key addresses](https://docs.sui.io/concepts/cryptography/transaction-auth/keys-addresses)
109 changes: 109 additions & 0 deletions pages/Basic_Move_Programming/sui_move_module.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@

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

```rust

module package_name::module::name {
//module code ở đây
}

```

Trong đoạn code trên thì `package_name` và `module` đại diện cho một bên 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`.

Còn `module_name` sẽ là cái tên module mà bạn đã tạo 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.


Bạn có thể module tựa nhưa là một "toolbox" hay "resource library". Khi làm dự án, ta sẽ cần nhiều công cụ từ trong toolbox, hoặc trong move, ta sẽ cần nhiều tài nguyên ( resources) đã được cung cấp bởi các modules khác để viết smart contract.

Mỗi module đều sẽ định nghĩa từ loại tài nghuyên khác nhau, sẽ có những kiểu dữ liệu là crypocurrencies (coin token) hoặc ownership types. Những `resources types` nó giống như các tool đa dạng trong toolbox như là búa, liềm, kéo...

Trong mỗi module sẽ cung cấp nhiều functions và các toán tử trong đó cho từng resource types, được dùng để create, modify, transfer hay destroy cái resource đó. Những function này giống như tác dụng của các tool, giải thích cho việc cần dùng đế nó. 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`:


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

Giải thích về `<Address/Alias>` và `<ModuleName>` là:
* `<Address/Alias>` là những địa chỉ của module mà ta muốn dùng trong module. Để hiểu một cách đơn giản, chúng ta thể sử dụng alias được đặt trong Move.toml mà đã viết ở mục Package manifest

* `<ModuleName>` đơn giản đại diện cho tên của module đó. Ví dụ nếu ta muốn dùng `transfer` module ở trong `sui` package. Ta có thể sử dụng lệnh sau:

```rust
use sui::transfer;
```

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

```rust

# Module này giúp chúng ta xử lý liên quan đến string
use std::string;

# 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;


# dòng dưới đây giúp cho việc tạo object trong module.
use sui::object;

# Đâ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;

```

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ụ:


```rust

// 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 `{}`:

```rust

// 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.




# Module and Standard library imports
The module importing feature is like building with blocks, where different elements can be freely combined to create various possibilities, rather than creating new elements from scratch.
150 changes: 150 additions & 0 deletions pages/Basic_Move_Programming/sui_move_package.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
# Các concepts cơ bản trong sui move
- Hiểu về Package structure / Published Package / Package Manifest
- HIểu về Address / Address type in move / Keys and Addresses
- Hiểu về Transaction structure / Transaction Effects



Trong tài liệu này sẽ viết chi tiết về các các khái niệm về package, address, account, và transaction trong Sui.
Một trong những phần quan trọng trong Sui Move codebase là **Package**.

---

## Vậy package là gì ?

Theo định nghĩa từ documentation:

> Packages are immutable. After you publish a package object on chain to a network, it lives there forever. You cannot directly change the code of an on-chain

Nghĩa là một package là khi được publish trên Blockchain và được xác định là một [address](https://move-book.com/concepts/address.html). Trong package có thể chứa một hoặc nhiều modules. Để hiểu chi tiết về package work thế nào trong Sui, nội dung sẽ được chia thành các phần nhỏ:
* Package Layout: Cấu trúc của package
* Published Package: Các package đã được published bạn cần lưu ý
* Manifest Structure( Move.toml ): Config file trong sui move contract
* Artifact


### Package bao gồm những gì ? (Package Layout)
Một package sẽ chứa nhiều Modules. Trong từng modules đó bao gồm functions, types...

Đây là ví dụ minh hoạ cho một package layout:
```
package HELLO_WORLD
module a
struct A1
fun hello_world()
module b
struct B1
fun hello_package()
```

Để tạo package mới, bạn có thể sử dụng lệnh CLI `Sui move new <Name Package>`. Mục đích của Move package system là để cho phép các developer có thể define dễ dàng nơi chứa các move code, bạn có thể import và use packages ở file move code khác.


### Published Package: Các package đã được published bạn cần lưu ý

Một package khi được published on chain sẽ đi kèm với address đó. Trong môi trường development, Package vẫn sẽ chưa có address mà sẽ mặc định là `0x0`. Cho đến khi package được published thì sẽ nhận được một địa chỉ unique trên mạng blockchain, bao gồm cả chứa bytecode. Package này hoàn toàn là immutable và có thể tương tác tác chạy transactions.

Ví dụ:

![](../assets/Basic_Move_Programming_image/published_package_address.png )


Để hiểu chi tiết hơn về package và một codebase cho sui move sẽ bao gồm những gì thì ta có là Manifest Structure


# Manifest Structure( Move.toml ): Config file trong sui move contract

Một thư mục source move package sẽ luôn có `Move.toml` - package manifest file bao gồm các metadata cho package đó. File này vô cùng quan trọng vì nó quản lý các dependencies, đảm bảo được môi trường stable cho move project của bạn và để quản lý project. Đây là cấu trúc của một package layout:


![](../assets/Basic_Move_Programming_image/sui_manifest_structure.png)

Root của project là tên folder move project của bạn. Trong folder sẽ chứa các files để chạy move project. Trên hình bạn đã thấy các components quan trọng `Move.toml`, `Move.lock` và thư mục `sources`.

Đối với `Move.toml` và `Move.lock` chịu trách nghiệm trong việc quản lý các dependencies. Còn trong thư mục `Source` là nơi ta thấy các file module.move. Các file này chính là core logic của move code. Ngoài ra, còn có thư mục test. Đây là nơi để bạn có thể viết test case cho move code của bạn đảm bảo dự án chạy như kì vọng và maintain được chất lượng codebase.

Cấu trúc được thiết kế giúp cho các developer có thể quản lý code dễ hơn. Tuy nhiên đây chưa honaf toàn là cấu trúc đầy đủ. Nó còn thêm doc_templates và examples.

```
Your_Move_Project
├── Move.toml (required)
├── Move.lock (generated)
├── sources (required)
├── doc_templates (optional)
├── examples (optional, test & dev mode)
└── tests (optional, test mode)
```





Sau đây chính là giải thích chi tiết về những thứ trong move project:

* Move.toml file: Đây là package manifest (mình không biết dịch tiếng việt sao nên hiểu như package.json nhé) chứa các metadata cần thiết cho package. Các thông tin trong package đó bao gồm
![](../assets/Basic_Move_Programming_image/Code_movetoml.png)




*


### Artifact

Artifact là thứ được tạo ra, nó thể bao gồm data model, diagrams... Trong Sui move, khi package được compiled, nó sẽ generate một directory có tên là `build` chứa các artifacts trong đó, bao gồm bytecode binaries(*mv), source maps `*.mvsm` và tài liệu (`*.md`).

File `BuildInfo.yaml` chứa các thông tin về build như là version của compiler và thời gian build


```bash
a_move_package
├── BuildInfo.yaml
├── bytecode_modules
│   ├── dependencies
│   │   ├── <dep_pkg_name>
│   │   │   └── *.mv
│   │   ...
│   │   └── <dep_pkg_name>
│   │      └── *.mv
│   ...
│   └── *.mv
├── docs
│   ├── dependencies
│   │   ├── <dep_pkg_name>
│   │   │   └── *.md
│   │   ...
│   │   └── <dep_pkg_name>
│   │      └── *.md
│   ...
│   └── *.md
├── source_maps
│   ├── dependencies
│   │   ├── <dep_pkg_name>
│   │   │   └── *.mvsm
│   │   ...
│   │   └── <dep_pkg_name>
│   │      └── *.mvsm

│   ...
│   └── *.mvsm
└── sources
   ...
   └── *.move
   ├── dependencies
   │   ├── <dep_pkg_name>
   │   │   └── *.move
   │   ...
   │   └── <dep_pkg_name>
   │      └── *.move
   ...
   └── *.move



```


Đoạn code package.move: https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/package.move


Loading
Loading