閱讀時間 6 分鐘
概覽
Stacks 「轉帳證明」(Proof of Transfer, PoX)共識機制的開源第一層區塊鏈。Stacks 借鑒了Bitcoin,並允許Bitcoin 。Stacks 它支援智慧合約,因此開發者可以建構去中心化應用程式(dApps),例如去中心化交易所、DAO、NFT 市場等等! 本指南將示範Testnet Clarinet(一款用於開發、測試和部署智慧合約的命令列工具),在Stacks Testnet )上建立並部署 Clarity 智慧合約。讓我們開始吧!
您需要準備的物品
- 請在您的電腦上安裝Clarinet(請依照連結中的說明進行安裝)
- 整合開發環境(IDE)或文字編輯器(我們推薦VSCode)
- Hiro Web Wallet(點此瞭解更多安裝資訊)
- STXTestnet (您可透過此水龍頭領取一些)
您將負責的工作內容
- 了解《Clarity》與單簧管
- 建立一個單簧管專案
- 使用 Clarity 建立一個 Storage 智慧合約
- 在本地環境中測試智慧合約
- 將智慧合約部署至Stacks Testnet
清晰度入門
Clarity 是一種專為Stacks 設計的 Lisp 風格智慧合約語言。它與其他智慧合約語言的不同之處在於,它無需編譯且不具備圖靈完備性。這究竟意味著什麼呢?在大多數基於 EVM 的區塊鏈上,您需要將 Solidity 合約程式碼編譯成位元組碼,以便 EVM 能夠理解。Stacks 則不同,您無需編譯程式碼。相反地,執行的程式碼是人類可讀的,這使得審計工作更加容易。這對使用者還有另一項好處:當您在Stacks 部署智慧合約時,該合約的原始碼會自動公開,而在基於 EVM 的區塊鏈上,這並非總是如此。
Clarity 的其他特性包括:
- 無重入攻擊漏洞
- 不會發生算術下溢或上溢
- 精確的氣體估算
- 內建自訂代幣支援功能
- 後置條件(即有助於您驗證當前操作的提示)
若想了解 Clarity 程式語言,請參閱以下Clarity 程式語言書籍資源。在下一節中,我們將簡要介紹智慧合約開發工具 Clarinet。
什麼是單簧管?
既然您已經對Stacks Clarity 有些了解,讓我們深入探討將用於建置智慧合約的工具——Clarinet。Clarinet 是一款有助於高效開發智慧合約的命令列工具,可用於開發、測試、除錯,以及將合約部署至本地端和生產環境。它與其他熱門的 web3 智慧合約函式庫(例如 Hardhat)類似。
Hiro 網路錢包設定
為了將我們的 Clarity 智慧合約部署至Testnet ,您需要先安裝Hiro 網路錢包。完成錢包設定後,您還需將錢包的網路設定變更為Testnet。操作方式為:點擊錢包首頁上的省略號(「...」)按鈕,然後點擊「變更網路」。
接下來,請確認您已持有一些 STXTestnet 。您可以在Stacks 的「水龍頭」頁面申請代幣。只需連接您的錢包,然後點擊「申請 STX」按鈕即可。
一旦您準備好錢包並取得 STXTestnet ,歡迎繼續閱讀下一節!
建立單簧管專案
安裝完畢後,請開啟終端機並執行以下指令,以建立一個新的 Clarinet 專案。
clarinet new storage-project && cd storage-project
上述 clarinet 指令會建立一個名為storage-project的範本專案目錄,我們可以利用它來快速開發智慧合約。
接下來,我們需要建立一個智慧合約檔案,用來存放儲存邏輯。我們可以在同一個終端機視窗中執行以下指令,為智慧合約建立一個.clar檔案,並為測試建立一個.ts檔案(目前我們會先忽略測試部分,但在正式環境中,建立單元測試是最佳實務)。
單簧管合約 新儲存合約
建立並定義 Clarity 智慧合約
在您慣用的程式碼編輯器中,開啟位於contracts資料夾內的storage-contract.clar檔案,然後刪除範本註解。在本教學中,我們將使用自訂的註解。接著,請在該檔案中輸入以下程式碼。
;; define variables
(define-data-var storage (string-utf8 500) u"initial value")
;; define public get function
(define-read-only (get-storage)
(var-get storage)
)
;; define public write function
;; #[allow(unchecked_data)]
(define-public (set-storage (message (string-utf8 500)))
(ok (var-set storage message))
)
上述程式碼的說明:
第 1-2 行:我們先定義以「;;」開頭的註解,接著定義我們的公開字串變數storage(其最大長度為 500 個字元)。
第 4-7 行:我們定義註解,以及一個公開的唯讀函式,該函式會傳回storage變數的值。
第 9-13 行:一個公開的寫入函式,該函式接受一個字串參數,並將其設定為storage變數的值。
在本地環境中測試智慧合約
要驗證我們的儲存合約的語法和完整性,請在終端機中執行命令 `clarinet check`:

在檢查完您的合約後,請執行命令 `clarinet console` 以開啟 Clarinet REPL 控制台。Clarinet REPL 將協助我們測試並執行 Clarity 程式碼。Clarinet REPL 在啟動時會自動列出可用的合約以及記憶體中的模擬錢包。以下是我們的顯示結果:

我們的智慧合約識別碼(亦稱為合約地址)為ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.storage-contract,其公開函式為get-storage和set-storage函式。
現在,若要與我們的儲存合約中的get-storage函式進行互動,我們可以使用以下語法:
(contract-call? .storage-contract get-storage)

回應應為我們設定為「初始值」的預設值。讓我們透過set-storage函式在儲存合約中設定一個新值。程式碼應如下所示:
(contract-call? .storage-contract set-storage u"new value")

正確的回覆應為(ok true)。我們可以重新執行第一個函式(即get-storage),以確認我們的storage變數是否已更新。

既然我們已確認儲存合約運作如預期,現在就可以進行Testnet 了!
將智慧合約部署至Testnet
在繼續之前,請務必先完成本指南中「Hiro 網路錢包設定」章節所列的錢包設定步驟。
接著,請前往Stacks Sandbox中的「寫入與部署」分頁,並連接您的錢包。錢包連接完成後,請點擊頁面右上角的「網路」分頁,並確認已選取「Testnet 」Testnet 。
接著,將storage-contract.clar檔案中的程式碼貼到 Clarity 程式碼編輯器中。

注意:預設情況下,Sandbox 會為您的合約生成一個隨機名稱。若您有需要,歡迎自行調整。
接著,點擊「部署」按鈕,然後在您的 Hiro 錢包中確認這筆交易。交易驗證可能需要幾分鐘時間。您可以在 Hiro 錢包的「活動」分頁中查看交易狀態,或透過Stacks 搜尋交易詳細資訊來確認。
一旦您的交易被礦工確認,請前往「呼叫合約」分頁(該 f )並輸入您的Stacks 智慧合約完整地址(例如:ST12KGMZCKXERR1VG1TFEQQZ3VQXSMVVC3J31S604.nft-factory)。「合約名稱」欄位應會自動填入您的合約名稱。接下來只需點擊「取得合約」按鈕即可。
載入合約後,畫面應類似如下:

Stacks 會自動載入所有可供我們使用的公開函式。為了測試合約,我們可以依照與在本地環境中相同的步驟進行。首先,我們將透過點擊函式get-storage,然後點擊「呼叫函式」按鈕,來檢查 storage 變數的值。輸出值應為u"初始值"。
接著,返回上一步,點擊「set-storage」函式,並輸入您希望儲存至儲存變數中的字串。在此測試中,我們將使用值Stacks gmi」。沙盒環境會自動將字串格式化,使其符合合約所接受的格式(即 u"Stacks gmi")。輸入字串後,點擊「呼叫函式」按鈕,並在您的 Hiro 錢包中簽署這筆交易。
一旦交易被礦工確認,您可以再次呼叫set-storage函式來驗證該值。該值應與您輸入的字串相符(即Stacks gmi)。
結論
恭喜您順利完成整個過程!現在您已經學會如何使用 Clarinet 建立並測試 Clarity 智慧合約。若想進一步了解,請參閱我們的 Stacks 如何在Stacks 上鑄造 NFTStacks ,或瀏覽此處的其他教學文章。
