# [Sui Move] 如何學習 Sui Move 開發？需要先學 Rust 嗎？

By [Whien](https://paragraph.com/@whien) · 2023-02-11

---

｜前言
---

凡事總要開始，但開始總是最難的事。在這篇文章跟大家分享我是如何突破瓶頸並進一步開始在 Sui 開發。

｜TL;DR
------

建議可以透過 [Rust Book](https://rust-lang.tw/book-tw/title-page.html) 稍微明白 Rust 有哪些特性，大致的了解後，就可以進入 Move 語言的開發了，在將來如果有計畫想要更深入學習 Move 背後的靈感來源或有興趣想更深層研究 Rust，就可以再花費比較多的時間去學習與應用。

認真想學習一門新程式語言時，用 `看的` 或撰寫 `Hello World` 都是不夠的，至少要思考如何開發一個有流程的功能，功能不用多也不用複雜，但至少這個功能流程最終可以得到某個結果，而不僅僅是打印了 `Hello World` 多參考網路上的範例，照樣複製貼上並改寫一些內容達到不同的效果都是可以快速學習一門語言的方法。

｜遭遇問題
-----

Move 語言繼承了 Rust 的良好開發傳統，也可以說 Rust 奠定了 Move 的基礎，而 Move 即是從它的基礎之上打造了對於區塊鏈開發良好的一門語言。

但 Rust 是一門不容易入門的語言，有著許多語言特性需要一步一步學習，在過去學習也撰寫了各式各樣的程式語言，在不同的用途中，程式語言都擁有不同的優勢存在。

在基礎的型別（字串、數字）、迴圈、流程判斷式、比較等等大多是很雷同的概念。

如果曾經學過強型別語言甚至是 Rust，那撰寫起 Move 語言感受會親切點，需要熟悉的就是型別宣告、組合以及泛型的應用。

那僅學習過弱型別語言的人們就會比較痛苦一些，要開始思考著型別之間的關係，如何透過強型別讓程式模組關係可以更強化。

另外 Rust 也有許多符號上的應用，例如

`::`

`.`

`’static`

`#[]`

還有一些關鍵字，例如

`match`

`mut`

`&`

還有許多細節，有興趣可以到 [Rust Book](https://rust-lang.tw/book-tw/title-page.html) 進一步學習。

｜直接開始學習 Move
------------

這篇文章主要不是分享程式碼，而是降低學習過程的時間浪費，因此在 Move 語言學習時，有幾點跟幾個資源是必要先了解的。

### ｜Sui Command Line

官方資源

[https://docs.sui.io/build/install](https://docs.sui.io/build/install)

影音資源（來自 [MoveDevs](https://www.youtube.com/@MoveDevs)）

[![]({{DOMAIN}}/editor/youtube/play.png)](https://www.youtube.com/watch?v=56eFdPHEk7A)

Sui Command Line Interface 有兩個比較重要的用途：

*   `sui move` 用於與程式碼開發比較有關係的用途（例如建立專案、編譯、測試…）
    
*   `sui client` 用於與節點比較有關係的用途（例如部署、呼叫、查詢…）
    

建議安裝完以後，可以先玩玩指令（$ 為終端機開頭符號可以忽略）

到 [Sui Explorer](https://explorer.sui.io/) 中任意點一筆 [TRANSACTION ID](https://explorer.sui.io/transaction/9x4ALij1ErXPBDV4uWanrAZr6ysiLoX6JMthb1T17tsW)，然後複製右邊的 sender 地址，輸入後就可以得到這個地址所擁有的 Object

    $ sui client objects 0x2191b9c96508ed2490a8942a4908cbc53bb91079
    

![](https://storage.googleapis.com/papyrus_images/3c10630bfa6728ec3039eedd84723d6775c1b3cb5dd1832d7e3f154b00096d1e.png)

    $ sui client addresses
    

![](https://storage.googleapis.com/papyrus_images/af5c4d610352301dd459a5836553d168f87a20e52ceb4a9e71e213e10afdf079.png)

    $ sui move new hello_sui
    

### ｜Practice from Official Documentation Example

官方資源

[https://docs.sui.io/build/move/write-package](https://docs.sui.io/build/move/write-package)

這一步很重要，就算還沒有認識非常多的 Move 語法，都一定要先跑過一遍官方所給的範例，概念很簡單，學習如何透過 Sui CLI 來建立專案，了解 toml 設定什麼參數，最後打包、測試與部署。

這個過程會滿辛苦的，因為範例程式碼中夾雜了不少說明跟備註，很容易迷失方向，但只要有耐心的一步一步解決按照以下流程去思考，最後都能夠順利在鏈上部署。

*   學習（Create new account addresses）[新增開發用帳戶地址](https://docs.sui.io/build/cli-client#create-new-account-addresses)
    
*   透過 `sui move new first_sui` 指令來建立專案
    
*   了解 `Move.toml` 預設的參數表示什麼
    
    `Move.toml` 一開始最需要理解的是 `[addresses]`，只要把它想成在開發 Sui Move 時，模組之間都會有一個獨立的編號在鏈上呼叫，預設看到的兩個分別為以下意思
    
        [addresses]
        first_sui = "0x0" # 預設開發中的模組（開發中）都會是用 0x0，直到部署後才會獲得地址
        sui = "0000000000000000000000000000000000000002" # 表示這個模組在 Sui 節點鏈上是 0x2 的地址
        
    
*   在專案中建立第一個檔案 `touch my_first_package/sources/my_module.move`開始撰寫範例功能
    
*   透過 `sui move build` 來確認編譯與錯誤結果
    
*   透過 `sui move test` 學習 Sui Move 的測試概念（這步學習也可以選擇先跳過）
    
*   學習（Publish packages）[部署合約](https://docs.sui.io/build/cli-client#publish-packages)
    
*   透過 [Sui Explorer](https://explorer.sui.io/) 確認結果
    

### ｜開發學習主階段

煎熬了一段時間後，才正式要進入下一個地獄級的大門，在這個階段要學習的會有幾個重點，最重要的是清楚知道關於 Sui Objects 的運作方式（Programming Objects Tutorial Series），因為 Sui Objects 細節相當多，我會建議分為三個階段來學習。

#### ｜基本 Objects 使用

*   [Chapter 1: Object Basics](https://docs.sui.io/build/programming-with-objects/ch1-object-basics)
    
*   [Chapter 2: Using Objects](https://docs.sui.io/build/programming-with-objects/ch2-using-objects)
    
*   [Chapter 3: Immutable Objects](https://docs.sui.io/build/programming-with-objects/ch3-immutable-objects)
    

#### ｜中階 Objects 使用

*   [Chapter 4: Object Wrapping](https://docs.sui.io/build/programming-with-objects/ch4-object-wrapping)
    

#### ｜進階 Objects 使用

*   [Chapter 5: Dynamic Fields](https://docs.sui.io/build/programming-with-objects/ch5-dynamic-fields)
    
*   [Chapter 6: Collections](https://docs.sui.io/build/programming-with-objects/ch6-collections)
    

以上最難的就是在 Dynamic Fields 的理解，這部分只要通了以後，就可以撰寫很多各式各樣的功能了。

#### ｜理解結構 Struct 運用

在 Sui Move 中，`Struct` 很重要，也包含了幾個關鍵字，例如 `has` `key` `store` .. 等等，稱為 [key ability](https://github.com/move-language/move/blob/main/language/documentation/book/src/abilities.md#key)，這大大影響了實際應用時物件的關係，短時間也很容易卡在這裡一段時間要跟 `Move編譯器` 打交道，盡可能地去了解編譯器給予的錯誤提示，也可以進一步學習到對於 Move 的語法特性。

#### ｜理解 Object 所有權

在 Sui Move 中，所有權是很重要的，這除了影響資產的使用（呼叫）方式以外，也會影響節點共識的進行方式（不展開說明），對於細節可以參考此份[官方文件](https://docs.sui.io/learn/objects)，主要列出四個 Object 類型

*   Owned by an address
    
    賦予在某個帳戶地址（例如某個 Coin 餘額，其他帳戶都不可接觸到）
    
*   Owned by another object
    
    賦予在某個物件中（父子關係）
    
*   Immutable
    
    不可改（例如部署的模組）
    
*   Shared
    
    所以帳戶共享的物件（例如一個池的物件）
    

* * *

以上是目前我記憶中比較有清楚脈絡的過程，中間或後續還有不少心得，例如：

*   更深入理解 Sui Move 與 Rust 之間的關係與應用
    
*   透過查閱 Sui Move Library 原始碼來開發智能合約（比看文件更快）
    
*   更深入理解 Sui 的節點運作模式（交易池、共識機制、單寫、共寫等等..）
    

學習過程總是煎熬的，但之後看向過去不就都只是過程嗎？現在的我們有什麼好焦慮的。

最後祝大家學習愉快！

---

*Originally published on [Whien](https://paragraph.com/@whien/sui-move-sui-move-rust)*
