使用 Move Module 進入 Aptos 智能合約開發的第一步

使用 Move Module 進入 Aptos 智能合約開發的第一步

作者:師大科技系 PecuLab 蔡芸琤 (Pecu)

這篇會帶到 https://aptos.dev/tutorials/first-move-module 提及的,在智能合約開發過程中,所需要的 compile (編譯), test (測試), publish (發布) and interact (與合約互動) with Move modules on the Aptos blockchain。

前情提要,請參考【成為 Aptos 公鏈開發者的第一步】

確認已經都安裝過上述的環境,若先前已成功安裝過,要再繼續在 Visual Studio Code 開啟 Docker 專案,要先將 Docker Desktop 開起來,如下圖。

在專案開始前,先開啟 Docker Desktop,請更新至最新版本 (lastest)。

確認 Docker 開啟著,就會看到 Visual Studio Code 的 Docker IMAGES 有成功出現 maxmilian/aptos-sdk,我們先使用 latest 這個版本,繼續前進。

看到 Visual Studio Code 的 Docker IMAGES 有成功出現 maxmilian/aptos-sdk。

成功載入後,執行 image 啟動 Aptos 開發環境

docker run --rm -it maxmilian/aptos-sdk:latest

若成功進入 Docker 的環境,終端機的本地端會從 DESKTOP 變成 d 開頭的編號型式。

因為,我們使用的 Docker image 已經存在 Aptos CLI,所以,可以直接從官網文件 https://aptos.dev/tutorials/first-move-module 中的 Step 2: Create an account and fund it 往下走。

aptos init

帳號初始化

上圖的帳號初始化,會詢問要在 Aptos 的哪個鏈上開啟新帳號,本文先以 devnet 做示範,接著,會詢問使用者,是要開新帳戶,還是要輸入已經在此鏈上開會的帳號地址。若是新開帳戶,就直接按下 Enter 鍵,讓系統繼續協助我們產生一組帳號地址。

我在 Aptos 的 devnet 鏈上獲得的新帳號地址為:0b2a44b96e26ca90198d5843e1f66fbd6a423be9b8f8ada76068e71e00687e48。

讀者可自行記下自己的帳號地址,在下回要繼續開發智能合約時,就直接填入自己的地址即可,不需要每次都重新建立一個。

aptos account fund-with-faucet --account default

初始化後的新帳戶地址,devnet 會先空投 500000 Octas 代幣到這個帳號中。Octa 是 Aptos鏈上代幣 APT 的最小單位,1 Octa = 0.00000001 APT。所以,首次空投得到的 500000 Octas = 0.005 APT。

執行查閱帳戶餘額初始狀態會看到的結果。

確認準備好帳戶 (不一定是等於使用者錢包,在這裡的例子,是合約本身自己就擁有這個帳戶),就可以開始先編譯第一個以 Move 撰寫的智能合約範例。原始程式碼 https://github.com/aptos-labs/aptos-core/blob/main/aptos-move/move-examples/hello_blockchain/sources/hello_blockchain.move 可在此找到。

cd aptos-core/aptos-move/move-examples/hello_blockchainaptos move compile --named-addresses hello_blockchain=default

順利編譯成功之後會看到的畫面。

測試的目的在於,還沒將智能合約發布至鏈上時,可以先模擬前端呼叫智能合約的行為,看看是否如同我們所設計的邏輯,撰寫測試程式也能額外進行對各 function 的功能單元測試,避免一些非常基礎的錯誤在還沒測試過,就誤以為編譯成功,就代表程式沒有問題的開發者盲點。原始程式碼 https://github.com/aptos-labs/aptos-core/blob/main/aptos-move/move-examples/hello_blockchain/sources/hello_blockchain_test.move 可在此找到。

aptos move test --named-addresses hello_blockchain=default

順利執行測試程式後會看到的畫面。

確認編譯、測試都沒問題之後,就能進行發布動作。

aptos move publish --named-addresses hello_blockchain=default

發布成功之後會看到的畫面。

在確認發布前,終端機會出現目前的發布手續費 (gas fee) 為多少,若接受這個手續費,就按下 y 鍵,繼續完成發布,否則就按下 n 鍵,離開這次的發布動作。

確認發布此智能合約之後,就可以透過終端機跟這張已經在鏈上的合約進行互動。從原始檔中可觀察到,要寫入此張智能合約的資料,可以此張合約的 set_message(~) 函式所接受的兩個 input 來完成,分別為 account 和 message。而 account 不需要額外輸入,是因為在執行的過程中,已經跟我們的帳戶連在一起了,所以,執行後的程式已自動取得帳戶地址,由 signer 這個型態來管理,更多此型態的說明可參考 https://ithelp.ithome.com.tw/articles/10299773

在這個範例中的程式碼看到,能與透過 set_message 函式來寫入資料至此智能合約中。

aptos move run \
  --function-id 'default::message::set_message' \
  --args 'string:hello, blockchain'

因此,透過 — function-id 呼叫執行 ‘default::message::set_message’,透過 — args 來塞入參數設定另一個 input,‘string:hello, blockchain’。

順利執行透過 set_message 函式來寫入資料至此智能合約中會看到的畫面。

若要查詢此筆資料是否有順利上鏈,可透過瀏覽器,使用 Aptos Node API (以 RESTful API方式進行) 來查看。因為我的 account address 是 0b2a44b96e26ca90198d5843e1f66fbd6a423be9b8f8ada76068e71e00687e48,所以網址在 https://fullnode.devnet.aptoslabs.com/v1/accounts/ 後面接上我的 address (請讀者要自行更動為自己的 address),網址 /resource 後面要跟的也是這個 address,只是要注意,把開頭的 0b 改成 0xb。最後,這份合約存在 MessageHolder 這個 function,可直接看到被寫入的資料內容,若未來開始撰寫其他合約時,就要依照合約內容置換這個 function 的名稱。

這是此合約中的 resource段落所提供的 MessageHolder 函式,才能直接透過瀏覽器使用 Aptos Node API 直接呼叫此函式。

https://fullnode.devnet.aptoslabs.com/v1/accounts/0b2a44b96e26ca90198d5843e1f66fbd6a423be9b8f8ada76068e71e00687e48/resource/0xb2a44b96e26ca90198d5843e1f66fbd6a423be9b8f8ada76068e71e00687e48::message::MessageHolder

順利看到寫入的資料已經在 Aptos 的 devnet 鏈上了。

關於 Move Module 的官方語法介紹,可在此找到 https://move-language.github.io/move/introduction.html

這裡有個和 solidity 不太一樣的地方,就是我們創建出來的這個帳戶 address 不見得是等於使用者的錢包,而是屬於合約本身,Move 將每張合約都擬人化,是目前我觀察到最有趣的設計方式,之後有更深入的探討,再來分享。

下一篇再來仔細解釋這個範例程式碼的內容,請各位持續追蹤每週更新的 Aptos 技術白話文。