開發你在Sui上的第一個智能合約(上)

本篇文章要分享怎麼用Sui Move開發智能合約,並且在Sui上發佈你第一個智能合約!

就算不太知道Move怎麼寫,也可以照抄一遍,相信就會對Move和Sui有進一步的了解,那我們開始吧!

事前準備

首先我們要先安裝好Sui的程式,若是還沒安裝的話,請先閱讀Sui開發環境建置的文章,再回來這篇文章

如果已經安裝的話可以直接繼續往下

初始化專案

輸入以下命令初始化你的專案:

1
sui move new my_first_package

專案裡面的結構長這樣:

1
2
3
my_first_package
├── Move.toml
└── sources

Move.toml是專案的設定檔
sources就是你放Move程式的地方

專案設定檔

我們可以先來看一下設定檔Move.toml

1
2
3
4
5
6
7
8
9
10
[package]
name = "my_first_package"
version = "0.0.1"

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

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

[package]就是放專案的基本資料,[dependencies]是需要用到的一些sui程式庫,這邊也可以放別人寫好的packagemy_first_package是你package的地址,當你發布自己的package之後,你會拿到一個object ID,如果你想要讓別人可以使用你的package,就把my_first_package的0x0改成你的object ID,並且推到github上。sui = "0x2"就是在用sui的package,0x2這邊是簡寫,代表16進位的0000000000000000000000000000000000000002

模組(Module)範例

一個package裡面可以有很多個模組,模組可以存放在sources資料夾底下,副檔名會是.move,以下我們來看官方的一個move模組教學範例,可以分成不同的區塊來閱讀,註解裡有寫Part 1, Part 2…等,我們可以先輸入以下命令來產生一個move檔案:

1
touch my_first_package/sources/my_module.move

接著把下面的code貼到檔案裡面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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)
}

Part 1是Import,使用關鍵字use,sui::object::{Self, UID}裡面的Self,代表sui::object,在code裡面可以直接使用object,UID對應到的是sui::object::UID,在code裡面也是直接使用UID就可以了。在sui裡面很多東西都是一個物件(object),比如說NFT, coin…等,sui::transfer::transfer可以用來轉移物件的所有權。sui::tx_context::TxContext,若是放在一個函數的最後一個變數,當我們呼叫合約的時候,這個參數就會自動傳入。

Part 2是結構的定義,關鍵字key代表,這個東西可以被存在區塊鏈上,store代表可以這個東西可以被存在某個擁有key關鍵字的物件裡面。

Part 3在Sui Move裡面,當模組被publish時,會執行init這個function,也是跟原本Move不一樣的地方之一

Part 4是一些可以讀取struct attributes的函數

Build package

現在讓我們來試試Build專案吧!首先確認自己在my_first_package目錄

然後輸入以下命令

1
sui move build

應該會看到以下結果
sui move build

恭喜你build了第一個Sui move package!

下一次會跟大家分享下集,如何為你的智能合約撰寫測試還有發布合約到Sui區塊鏈上!