Let's Move 是一項學習 Move 語言的激勵計畫,鼓勵更多的人學習 Move 語言
學習日誌 (alva-lin)
任務 1 - hello move#
Sui CLI 基本操作#
參照文檔 Sui CLI: Client
網路#
- 查看當前添加的網路列表
sui client envs
輸出如下,其中 alias 為網路別名,url 為網路地址,active 為當前激活的網路
╭─────────┬─────────────────────────────────────┬────────╮
│ alias │ url │ active │
├─────────┼─────────────────────────────────────┼────────┤
│ devnet │ https://fullnode.devnet.sui.io:443 │ │
│ mainnet │ https://fullnode.mainnet.sui.io:443 │ │
│ testnet │ https://fullnode.testnet.sui.io:443 │ * │
╰─────────┴─────────────────────────────────────┴────────╯
- 添加網路
如果前面的網路中,沒有測試網 (testnet),則可以自行添加。
sui client new-env --alias=testnet --rpc https://fullnode.testnet.sui.io:443
輸出如下
Added new Sui env [testnet] to config.
可以再執行一次 sui client envs
,來查看是否添加到列表中。
- 切換當前環境的網路
sui client switch --env testnet
輸出如下
Active environment switched to [testnet]
輸出提示切換成功,也可以再執行一次 sui client envs
,來查看當前活躍網路是否是 testnet。
地址#
- 查看地址列表
sui client addresses
命令和環境類似,執行後的輸出如下
╭──────────────────┬───────────────────────┬────────────────╮
│ alias │ address │ active address │
├──────────────────┼───────────────────────┼────────────────┤
│ adoring-turquois │ 0xb31fc********c57f48 │ * │
╰──────────────────┴───────────────────────┴────────────────╯
- 切換當前活躍的地址
sui client active-address
輸出如下,直接將當前活躍的地址全部輸出了
0xb31fc********c57f48
編譯 & 發布 & 調用#
- 新建包
sui move new 03_hello_move
該命令不會有輸出,會在當前路徑創建一個 sui package 文件夾,其內容如下
❯ tree 03_hello_move
03_hello_move
├── Move.toml
└── sources
1 directory, 1 file
我們將代碼文件放在 sources 文件夾下即可。
package 命名問題:
如果你也和我一樣,為了方便記錄學習,每個項目前都以一個數字開頭,那麼在後續的代碼編譯時會報錯
❯ sui move build UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git INCLUDING DEPENDENCY Sui INCLUDING DEPENDENCY MoveStdlib BUILDING 03_hello_move error[E01002]: unexpected token ┌─ sources/hello_move.move:1:11 │ 1 │ module 03_hello_move::hello { │ ^^^ │ │ │ Unexpected 'hello_move' │ Expected '::' Failed to build Move modules: Compilation error.
解決辦法有兩種
(推薦) 創建項目時,使用不帶序號的項名:
sui move new hello_move
,後續再修改文件夾名稱:mv hello_move 03_hello_move
正常創建項目,然後找到
Move.toml
文件中的[addresses]
块,修改03_hello_move
為hello_move
。並且需要注意,在編寫代碼時, package 名是hello_move
另外還有個地方有差異,
Move.toml
文件中的[package]
块,其中name
字段的名稱,是根據sui move new <package_name>
中的包名來直接命名的
- 編譯
先進入到 package 對應的路徑,然後執行以下命令
sui move build
如果代碼沒有基本錯誤,輸出如下
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING 03_hello_move
同時注意到,當前路徑下,多了個 build 文件夾和 Move.lock
文件
❯ tree -L 2
.
├── Move.lock
├── Move.toml
├── build
│ ├── 03_hello_move
│ └── locks
└── sources
└── hello_move.move
- 發布
發布前,需要注意當前激活的網路和地址。在 package 對應的路徑下,執行以下命令,將包發布到對應的網路
sui client publish --gas-budget 100000000
這裡的 gas-budget
指運行模塊初始化程序時的 gas 費用預算。
如果發布成功,則會輸出以下內容,注意:每次執行時輸出內容中某些值會有所不同,但是內容結構大致相同。
輸出被分為多個塊
-
交易數據
-
交易效果
-
交易事件
-
對象變更
-
餘額變更
找到 交易效果
塊中的 創建的對象
輸出信息,其中 擁有者
為 Immutable
的對象,就是發布的包。可以看到對應的 package ID 為 0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15
UPDATING GIT DEPENDENCY https://github.com/MystenLabs/sui.git
INCLUDING DEPENDENCY Sui
INCLUDING DEPENDENCY MoveStdlib
BUILDING 03_hello_move
Successfully verified dependencies on-chain against source.
Transaction Digest: FAGtpXnChnj2ZPxoZvt3kAuWY7esvPHGmpHbwAAUcdPX
╭──────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 交易數據 │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 發送者: 0xb31fc********c57f48 │
│ Gas 擁有者: 0xb31fc********c57f48 │
│ Gas 預算: 100000000 MIST │
│ Gas 價格: 1000 MIST │
│ Gas 支付: │
│ ┌── │
│ │ ID: 0x91cbd3fe3422844d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ 版本: 920427 │
│ │ 摘要: Gucz8kmhru994mu1SMfsrasg3YjsPkzscj5KKkEmxu4X │
│ └── │
│ │
│ 交易類型: 可編程 │
│ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮ │
│ │ 輸入對象 │ │
│ ├──────────────────────────────────────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 純參數: 類型: 地址, 值: "0xb31fc********c57f48 " │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ ╭─────────────────────────────────────────────────────────────────────────╮ │
│ │ 命令 │ │
│ ├─────────────────────────────────────────────────────────────────────────┤ │
│ │ 0 發布: │ │
│ │ ┌ │ │
│ │ │ 依賴: │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000001 │ │
│ │ │ 0x0000000000000000000000000000000000000000000000000000000000000002 │ │
│ │ └ │ │
│ │ │ │
│ │ 1 轉移對象: │ │
│ │ ┌ │ │
│ │ │ 參數: │ │
│ │ │ 結果 0 │ │
│ │ │ 地址: 輸入 0 │ │
│ │ └ │ │
│ ╰─────────────────────────────────────────────────────────────────────────╯ │
│ │
│ 簽名: │
│ Hl+Chc7V72WhwKAwJ3T8PrhCibN9T27nZMNmVFpN7FqiTBPSVbxYfL+B5uyp3oRQ463WjGA8/oJ0cxmRfz92BA== │
│ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 交易效果 │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 摘要: FAGtpXnChnj2ZPxoZvt3kAuWY7esvPHGmpHbwAAUcdPX │
│ 狀態: 成功 │
│ 執行時期: 318 │
│ │
│ 創建的對象: │
│ ┌── │
│ │ ID: 0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15 │
│ │ 擁有者: Immutable │
│ │ 版本: 1 │
│ │ 摘要: 2iv1DT3ARdBDwowswWA87ucPubfbEXfYkrcM1R6QyxWd │
│ └── │
│ ┌── │
│ │ ID: 0xea782e392b95749ab43c20d9902f19b2976226391bdbd70e81f380f079932460 │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 版本: 920428 │
│ │ 摘要: 6kC43pZb8YDZ9BDisXc3fmktSWt9PxP13N4QNa1sLank │
│ └── │
│ 變更的對象: │
│ ┌── │
│ │ ID: 0x91cbd3fe3422844d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 版本: 920428 │
│ │ 摘要: CDN8E9EuPNgtwiLF77ZxAdx8BXMw27uQzcG1ADxuG9fZ │
│ └── │
│ Gas 對象: │
│ ┌── │
│ │ ID: 0x91cbd3fe3422844d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 版本: 920428 │
│ │ 摘要: CDN8E9EuPNgtwiLF77ZxAdx8BXMw27uQzcG1ADxuG9fZ │
│ └── │
│ Gas 成本摘要: │
│ 存儲成本: 7539200 MIST │
│ 計算成本: 1000000 MIST │
│ 存儲回扣: 978120 MIST │
│ 不可退還的存儲費用: 9880 MIST │
│ │
│ 交易依賴: │
│ 27si9MdVQzBrEzHWrbZJThtB7nVSHC1x14EuE5r3o2V2 │
│ GZcMfNx5jvGHsfSKEHJD7jZss7yCHqEGfhVk8Jx8a2N1 │
│ HuSWWnS6ZXZyyBpyoaWf7b8N961SPMUW7q9apQ5VkJTr │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────╮
│ 沒有交易區塊事件 │
╰─────────────────────────────╯
╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 對象變更 │
├──────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 創建的對象: │
│ ┌── │
│ │ ObjectID: 0xea782e392b95749ab43c20d9902f19b2976226391bdbd70e81f380f079932460 │
│ │ 發送者: 0xb31fc********c57f48 │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 對象類型: 0x2::package::UpgradeCap │
│ │ 版本: 920428 │
│ │ 摘要: 6kC43pZb8YDZ9BDisXc3fmktSWt9PxP13N4QNa1sLank │
│ └── │
│ 變更的對象: │
│ ┌── │
│ │ ObjectID: 0x91cbd3fe342284d015fa2a7da45721d42226cd2cd6c54f2a5097a8679fc678b │
│ │ 發送者: 0xb31fc********c57f48 │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 對象類型: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ 版本: 920428 │
│ │ 摘要: CDN8E9EuPNgtwiLF77ZxAdx8BXMw27uQzcG1ADxuG9fZ │
│ └── │
│ 發布的對象: │
│ ┌── │
│ │ PackageID: 0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15 │
│ │ 版本: 1 │
│ │ 摘要: 2iv1DT3ARdBDwowswWA87ucPubfbEXfYkrcM1R6QyxWd │
│ │ 模塊: hello │
│ └── │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
╭───────────────────────────────────────────────────────────────────────────────────────────────────╮
│ 餘額變更 │
├───────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ┌── │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ 金額: -7561080 │
│ └── │
╰───────────────────────────────────────────────────────────────────────────────────────────────────╯
- 調用函數
我們可以調用剛才發布的合約中的 say_hello
函數,來獲得一個對象。
首先將剛才的 package ID 保存為變量
export PACKAGE_ID=<package object ID>
然後使用相關命令
sui client call --package $PACKAGE_ID --module hello --function say_hello --gas-budget 300000000
如果執行無誤,則會輸出以下內容
同樣的,我們找到 交易效果
塊中的 創建的對象
,這次只有一個對象被創建,拿到對應的 ID 0xc3eb50f39ec09e4e2eed994fdf60f855f4841b3591c94ca85e54047ed105280d
Transaction Digest: 3Ys1pYtBSgUiXUYMsK37KPWftcXX5icbbPLgT1f1frPp
╭──────────────────────────────────────────────────────────╮
│ 交易數據 │
├──────────────────────────────────────────────────────────┤
│ 發送者: 0xb31fc********c57f48 │
│ Gas 擁有者: 0xb31fc********c57f48 │
│ Gas 預算: 300000000 MIST │
│ Gas 價格: 1000 MIST │
│ Gas 支付: │
│ ┌── │
│ │ ID: 0x91cbd3fe34228********cd26c54f2a5097a8679fc678b │
│ │ 版本: 920429 │
│ │ 摘要: BgNZWUPLdG1WNxupJjP8R1RbQdqHYmLYP8GXYHEX2bg │
│ └── │
│ │
│ 交易類型: 可編程 │
│ 此交易沒有輸入對象 │
│ ╭────────────────────────────────────────────────────╮ │
│ │ 命令 │ │
│ ├────────────────────────────────────────────────────┤ │
│ │ 0 MoveCall: │ │
│ │ ┌ │ │
│ │ │ 函數: say_hello │ │
│ │ │ 模塊: hello │ │
│ │ │ 包: 0x96ad76ea3a055****a35350b83a76abd15 │ │
│ │ └ │ │
│ ╰────────────────────────────────────────────────────╯ │
│ │
│ 簽名: │
│ FlBbaPmrMt9DNKt9EMug********R8KcJes7dzem52d2CDkFcBA== │
│ │
╰──────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────╮
│ 交易效果 │
├──────────────────────────────────────────────────────────┤
│ 摘要: 3Ys1pYtBSgUiXUYMsK37KPWftcXX5icbbPLgT1f1frPp │
│ 狀態: 成功 │
│ 執行時期: 318 │
│ │
│ 創建的對象: │
│ ┌── │
│ │ ID: 0xc3eb50f39ec09e4e2e****91c94ca85e54047ed105280d │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 版本: 920430 │
│ │ 摘要: ZmguJw2kjwwrFYUYuZ8xG4EZcHc6n2CjMibhc9CjYNr │
│ └── │
│ 變更的對象: │
│ ┌── │
│ │ ID: 0x91cbd3fe342284d********c54f2a5097a8679fc678b │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 版本: 920430 │
│ │ 摘要: 74GDCP91puviUXMmMFv7EEYSkuP7uMTt4MaPxGJi3JRj │
│ └── │
│ Gas 對象: │
│ ┌── │
│ │ ID: 0x91cbd3fe342284d******2cd6c54f2a5097a8679fc678b │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 版本: 920430 │
│ │ 摘要: 74GDCP91puviUXMmMFv7EEYSkuP7uMTt4MaPxGJi3JRj │
│ └── │
│ Gas 成本摘要: │
│ 存儲成本: 2340800 MIST │
│ 計算成本: 1000000 MIST │
│ 存儲回扣: 978120 MIST │
│ 不可退還的存儲費用: 9880 MIST │
│ │
│ 交易依賴: │
│ 65HTDLBC9h1cTbdPcuDPRpL3ZJUGvgWZHaQSpVcnos2R │
│ FAGtpXnChnj2ZPxoZvt3kAuWY7esvPHGmpHbwAAUcdPX │
╰──────────────────────────────────────────────────────────╯
╭─────────────────────────────╮
│ 沒有交易區塊事件 │
╰─────────────────────────────╯
╭──────────────────────────────────────────────────────────╮
│ 對象變更 │
├──────────────────────────────────────────────────────────┤
│ 創建的對象: │
│ ┌── │
│ │ ObjectID: 0xc3eb50****47ed105280d │
│ │ 發送者: 0xb31fc********c57f48 │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 對象類型: 0x96ad76****0b83a76abd15::hello::Hello │
│ │ 版本: 920430 │
│ │ 摘要: ZmguJw2kjwwrFYUYuZ8xG4EZcHc6n2CjMibhc9CjYNr │
│ └── │
│ 變更的對象: │
│ ┌── │
│ │ ObjectID: 0x91cbd3fe342284****a5097a8679fc678b │
│ │ 發送者: 0xb31fc********c57f48 │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ 對象類型: 0x2::coin::Coin<0x2::sui::SUI> │
│ │ 版本: 920430 │
│ │ 摘要: 74GDCP91puviUXMmMFv7EEYSkuP7uMTt4MaPxGJi3JRj │
│ └── │
╰──────────────────────────────────────────────────────────╯
╭──────────────────────────────────────────────────────────╮
│ 餘額變更 │
├──────────────────────────────────────────────────────────┤
│ ┌── │
│ │ 擁有者: 帳戶地址 ( 0xb31fc********c57f48 ) │
│ │ CoinType: 0x2::sui::SUI │
│ │ 金額: -2362680 │
│ └── │
╰──────────────────────────────────────────────────────────╯
Sui 瀏覽器錢包#
這兩個錢包都暫時只有瀏覽器擴展
Sui Explorer & SuiScan#
Sui 區塊瀏覽器,可以查看鏈上的任何記錄,只要提供地址或 ID。
以 suiscan 為例,我們前面使用 sui client call ...
來調用剛剛發布的合約中的函數,得到了一个 object ID。我們可以直接按一定格式 https://suiscan.xyz/<env>/object/<object ID>
,可以看到這個新創建的 object 信息。或者是將 package ID 傳入,也是可以看到相關信息。
這是 package 鏈接:
https://suiscan.xyz/testnet/object/0x96ad76ea3a055760f257b839668c8c8d113502bcc04b688a35350b83a76abd15
這是 hello object 鏈接:
https://suiscan.xyz/testnet/object/0xc3eb50f39ec09e4e2eed994fdf60f855f4841b3591c94ca85e54047ed105280d