跳至內容
0%

Solana 智能合約完整指南

發布於 2023年8月10日閱讀時間 4 分鐘

Solana 是一個專注於智慧合約開發的區塊鏈平台,旨在解決現有區塊鏈所面臨的挑戰。它承載著各種區塊鏈專案,包括 NFT 和 DeFi 專案。

Solana 生態系近年來因其極低的交易手續費和高擴展性而日益普及。Solana 的獨特之處在於它將權益證明共識演算法與獨特的歷史證明機制結合,為開發者提供一個多功能的網路,用於建立 NFT 平台應用程式等。

本文將說明 Solana 智慧合約的運作方式、如何建立與部署 Solana 程式,以及所需的工具。此外,我們還會回顧一些 Solana 智慧合約教學、範例、儲存庫、開發者工具和資源,幫助你入門。

什麼是 Solana 智慧合約?

Solana 智慧合約,又稱為 program,是解讀指令並建立協議條款的程式碼。許多開發者認為 Solana 智慧合約是 Ethereum 智慧合約的可行替代方案,原因是其交易手續費相對低廉。

智慧合約讓開發者能夠建立利用區塊鏈安全性、可靠性及可及性的應用程式,同時提供從貸款、保險到物流、遊戲等各種精密的點對點功能。

Solana 智慧合約可以用多種程式語言撰寫。雖然 Rust 是 Solana 智慧合約的原生語言,但該協議也透過第三方 JSON RPC API SDK 客戶端支援以 C++、Solidity 等語言開發智慧合約。

Solana 智慧合約架構

Solana 使用的智慧合約模型與傳統基於 EVM 的區塊鏈不同。在傳統區塊鏈中,程式碼與狀態合併於單一合約,而 Solana 智慧合約則是無狀態的,僅包含程式邏輯。

Solana 架構旨在展示一組軟體演算法的存在,當這些演算法組合實作於區塊鏈時,能消除軟體作為效能瓶頸的問題,使交易吞吐量能隨著網路頻寬成比例擴展。

為了增強與應用程式的互動,Solana 還提供了命令列介面(CLI)與 JSON RPC API。應用程式也可以使用現有的 SDK 與區塊鏈及 Solana program 互動。

Solana 驗證流程示意圖

Solana 的歷史證明機制

Solana 旨在透過結合權益證明與歷史證明來提升區塊鏈的擴展性。它使用 Tower 拜占庭容錯(BFT)系統,讓節點不再需要即時相互通訊,從而提高效率,實現每秒 50,000 筆交易(TPS)的高交易速率。

因此,Solana 能夠在維持去中心化的同時處理大量交易。Solana 在 200 個驗證節點的協助下,每 400 毫秒建立一個新區塊,同時交易手續費維持在一美元以下。

Solana 以其更高的擴展性和更快的交易速度而聞名。Solana 網路在核心層級即具備擴展性,因此不需要第 2 層方案來提升擴展性。

Solana 網路的技術將資料分割成較小的區塊,使資料更容易在網路上傳輸。Solana 也使用 Sealevel 協助在 GPU 與 SSD 上處理交易,從而打造出高效率的區塊鏈網路。

圖片來源:Solana Labs

Solana program 與 Ethereum 智慧合約有何差異?

Ethereum 的智慧合約以Solidity 程式語言撰寫,而 Solana 的智慧合約主要以 Rust 撰寫,稱為 program。它們是無狀態的,僅代表程式邏輯。

兩者之間最顯著的差異在於所採用的共識機制。Ethereum 使用權益證明(PoS),旨在打造更去中心化、更節能的網路。另一方面,Solana 採用歷史證明(PoH),這是一種以速度和效率為優先的獨特方法,能實現快速且低成本的交易。

Solana program 完全由程式碼組成,不包含任何資料。所有資料都是以輸入的形式提供。這種解耦的設計讓多份 Solana program 副本能夠針對不同輸入平行執行,從而實現高效能。換句話說,來自多個使用者帳戶、對同一個 Solana program 的交易可以同時發生。這正是 Solana 具備高擴展性的特色之一。

如何在 Solana 上建立智慧合約

本節將深入說明在 Solana 上建立智慧合約所需的步驟。我們將引導你完成整個流程,並提供入門所需的所有資訊。

前置條件

  • 對 Solana 運作方式有基本了解
  • 依照下方設定章節安裝好 Anchor 與 Rust
  • 準備好學習

步驟 1:安裝 Rust、Solana、yarn 與 anchor

讓我們開始設定 Solana 開發環境。

安裝 Rust

我們先安裝 Rust,這是撰寫 Solana program 所使用的程式語言。

使用以下指令確認 Rust 與 Rust 編譯器已正確安裝。

你現在應該也已經安裝了 Cargo,也就是 Rust 的套件管理工具。執行以下指令確認 Cargo 已正確安裝。

Rustup 是安裝與更新 Rust 的工具。

Rustc 是 Rust 程式語言的編譯器;它能讓你將 Rust 程式編譯成可在所有現行作業系統上執行的檔案。

Cargo 是 Rust 程式語言的建置系統與套件管理工具。

安裝 Solana

如果安裝過程要求你變更 path,請依照指示操作。

安裝 node.js

請前往官方網站下載 Node.js,並確認選擇適合你作業系統的版本。

你可以透過以下指令確認 Node.js 已安裝完成:

安裝 yarn

Yarn 是與 npm 類似的套件管理工具。

檢查你的 Yarn 版本。

安裝 anchor

Anchor 是 Solana Sealevel runtime 的框架,提供多項實用的開發者工具。

執行以下指令安裝 Anchor。

接著,確認安裝結果。

步驟 2:設定專案

在本節中,我們會將 solana cli 設定為 devnet,並使用 anchor 框架初始化專案。為了模擬實際部署情境,我們會部署到 Solana Devnet

請在終端機中執行以下指令繼續操作。

下一步是建立錢包,這是執行與發布程式所必需的。

使用以下指令取得你的 pubkey。

之後,你可以執行以下指令查詢你的地址。

接著,你會需要一些 testnet SOL 用於開發。你可以使用以下指令將一些 SOL 空投到你的錢包。

執行以下指令即可顯示你的餘額。

讓我們執行以下指令來初始化 Anchor 專案。此指令會建立專案所需的所有資料夾與額外相依項:

步驟 3:撰寫我們的第一個 HelloWorld program

在專案結構中,你會看到以下檔案與資料夾。

  • program — 這是包含你所有 Solana program 的目錄
  • test — 存放 Javascript 測試程式碼的資料夾
  • migrations — 這是 program 的部署腳本
  • app — 建置前端的位置

請記得,lib.rs 是我們 Solana program 的起始檔與主要檔案。它包含一些起始程式碼,如下所示。

讓我們來看看 Rust 的運作方式。 Rust 中的第一行程式碼是匯入相依項或函式庫。在這個範例中,它匯入的是 anchor 函式庫。

Solana 將位址或 program ID 儲存在 declare_Id 變數中。Anchor 預設會為我們建立一個 program ID。

接下來是 program 區段,這裡存放著 program 的邏輯。

最後一個區段是 derive Accounts 區段,account struct 就存放在這裡。

initialize struct 定義了 initialize 函式的 context,而 struct 用於宣告一個結構。在 Rust 中定義方法的方式與其他程式語言不同。將程式碼與資料分離的能力,正是 Solana 的一大賣點。

讓我們深入了解 Hello World Solana program。請記得,Solana program 只是 Solana 網路上一種特殊的帳戶,能夠儲存並執行指令。我們會使用 solana-program crate,它就像是 Solana program 的標準函式庫。我們需要使用 solana-program crate 中的一些內容來建立一個基本的 program。

第一個區段使用了 Borsh,全名為 Binary Object Representation Serializer for hashing。Borsh 用於序列化與反序列化傳入及傳出已部署 program 的參數。AccountInfo 是 account_info 模組中的一個 struct,用於存取帳戶資訊。entrypoint 則宣告了 program 的進入點。

entrypoint 模組中的 ProgramResult 會回傳 ProgramReport 或 ProgramError。最後,msg 這個巨集用於將訊息輸出到 program log,而 pubkey 這個 struct 則讓我們能以公開金鑰的形式存取地址。

上方的程式碼片段定義了帳戶中儲存的狀態類型,以及 counter u32,也就是用來記錄問候次數的 32 位元無號整數型別。

如上方第一行程式碼所示,Solana program 需要一個 entrypoint 巨集來處理 program 指令。entrypoint 需要一個帶有 program_id 參數的 process_instruction 函式,program_id 是產生 hello world program 帳戶的公開金鑰。accounts 參數是我們打算問候的帳戶,而 instruction_data 參數則包含額外的輸入內容。ProgramResult 會輸出訊息「Hello World Rust Program」。

'let' 陳述式取得要問候的帳戶。'if' 陳述式則規定,若要修改資料,program 必須擁有該帳戶。

'let' 陳述式取得要問候的帳戶。'if' 陳述式則規定,若要修改資料,program 必須擁有該帳戶。

如何在 Solana 上部署智慧合約

本節將說明在 Solana 上部署智慧合約的步驟。

步驟 1:測試 Solana program

執行以下指令來執行測試。

這會針對特定 cluster 建置、部署並測試 program。

步驟 2:部署至 Devnet

部署到正式運作中的網路很簡單,我們首先要確認自己位於 Devnet。

找到你的 Anchor.toml,並將 cluster 更新為 devnet,cluster = "devnet"

執行以下指令建置 program。

最後,部署 program。

步驟 3:在 Solana explorer 上驗證

接下來,我們會在 Solana Devnet explorer 上,透過提供 program id 來驗證該 program 已成功部署。你應該可以在 history 區段看到部署紀錄。

Solana 智慧合約教學

現在我們已經對智慧合約的運作方式有了紮實的了解,接下來讓我們深入一個實際專案,掌握 Solana 開發架構的運作方式。我們接下來要建立的專案,是用於鑄造 NFT 的 Solana 智慧合約。鑄造 NFT 的方式有很多種,其中一種是使用 Metaplex candy machine。NFT 是智慧合約最熱門的應用案例之一。

在本節中,你將學到:

  • 如何設定 Solana CLI 工具以使用 Devnet,以及 Solana 中其他實用指令
  • 如何在 Rust 中撰寫更複雜的 program
  • 如何使用 anchor 框架初始化專案
  • 理解 Rust 變數與語法

所需條件如下:

快速設定

我們使用以下指令將開發環境設定為與 Devnet 網路搭配運作。

接著使用以下指令產生你的錢包,這是執行與部署 program 所需的。

系統會提示你輸入密碼以保護錢包。接著你會看到你的助記詞,由 12 個單字組成:

之後你可以檢查你的地址。

接著,執行以下指令,將 4 個 testnet SOL 空投到你的地址。

空投 4 個 testnet SOL 後,執行以下指令檢查你的餘額。

現在你已將 Solana 設定為與 Devnet 網路搭配運作,並建立了新的錢包,接下來讓我們建立一個 Anchor 專案,讓它替我們管理所有資料夾及繁瑣的設定。前往終端機並輸入以下指令。

Solana 智慧合約

在深入智慧合約之前,我們需要先設定用於與 SPL tokens 互動的 spl-token CLI。你可以在終端機中執行以下指令來完成此設定。

安裝 solana sdk 與 solana-program。

你會在 programs 資料夾中看到一個 lib.rs 檔案。這就是我們撰寫 Solana program 的地方。如前所述,我們會以 lib.rs 中預設提供的內容為基礎進行開發。你應該會看到如下內容。

在此,我們在程式碼頂端匯入了我們接下來會用到的工具。

定義我們 program 的邏輯

我們使用 mint_authority 賦予 program 權限,用來建立一個 mint(mint_nft),然後為其指定一個 token 帳戶(mint_token_account)。接著我們會使用先前匯入的 token_program 與 associated_token_program。

Authority 代表該帳戶可以鑄造更多 token 或「印錢」。它通常由 wallet 帳戶建立。這是可選的,因為 mint authority 可以放棄自己的權限,使 mint 帳戶變成不可變更。

建立 mint 帳戶

建立 token 帳戶 ‍

撰寫 mint 函式

接下來,我們會將 NFT 鑄造到上方建立的 token 帳戶。

部署 program

現在你已經準備好使用 Anchor 框架來建置 NFT 鑄造用的 Solana program!

建置流程會為你的 program 帳戶產生金鑰對。在部署 program 之前,你必須將這個公開金鑰加入 lib.rs 檔案中,因為使用 Anchor 的 program 都需要它。若要取得這個金鑰對,你需要執行以下指令,從 Anchor 產生的 keypair.json 檔案中取得它。

下一步是編輯 lib.rs 檔案,將 declare_id!() 定義中的金鑰對,替換成你在上一步取得的值。

接著,你還需要將取得的 Program ID 值,填入 Anchor.toml 檔案中 chainlink_solana_demo devnet 的定義區塊。

由於你已將 keypair 替換為新的 ID,你可能需要再次使用 Anchor 建置 program。

最後,你就可以部署 program 了。

program 成功部署後,終端機輸出會顯示 program ID,這應該與你填入 lib.rs 和 Anchor.toml 檔案中的值一致。

已部署的合約也可以在 Solana Devnet Explorer 上驗證。

已部署的合約顯示於 Solana Devnet explorer 上。

Solana 智慧合約範例與儲存庫

有許多 Solana 智慧合約範例與儲存庫,能為你的 Solana 開發歷程帶來極大的價值。我們在下方列出其中一些。

1. Hello world 智慧合約

Hello World 智慧合約提供了一個使用 Anchor 與 Rust 的實作 Solana program 範例。它採用循序漸進的方式,帶你在 Solana 上建立智慧合約與應用程式,同時提供在鏈上使用、建置及部署 program 的範例程式碼。

2. Simple Solana Program

Simple Solana Program 在功能上與 Hello World 範例相關。它示範了如何在 Solana 區塊鏈上建立並呼叫一個 program。在此範例中,這個 Solana program 會計算它被執行的次數,並將該資訊儲存在鏈上。

3. Awesome Solana

Awesome Solana 是一個詳盡的資源庫,內含適合初學者及進階 Solana 開發者的資源。它提供關於 Solana 開發、Solana 交易、Solana 函式庫、Solana program 運作原理的說明,以及有助於學習的影片範例。

4. Break Solana

Break Solana 是一款遊戲,由網頁前端客戶端、網頁伺服器後端以及鏈上 Solana program 組成。Break Solana 這款遊戲讓玩家能盡可能快速地發送簡單的智慧合約交易,以此展示 Solana 的速度。

用於撰寫 program 的 Solana 開發者工具與資源

有一系列學習資源與開發者工具,在你於 Solana 上撰寫 program 時十分實用。

1. Solana Playground

Solana Playground 提供一個極為簡便的方式,讓使用者能夠依照自身獨特需求,完全自訂 Solana 交易,藉此與區塊鏈系統互動。即使是沒有程式開發經驗的人,也能透過 Solana Playground 更加了解區塊鏈的運作方式。該專案的儲存庫可在 Github 上取得。

2. Start on Solana

Start on Solana 提供在 Solana 上開發及貢獻 Solana 生態系的指引。它提供多項以 Javascript 與 Rust 撰寫的任務,涵蓋從在 Solana 上建立 NFT,到用 Javascript 鑄造與建立加密貨幣等主題。

3. Solana Cookbook

Solana Cookbook 是一項開發者資源,提供在 Solana 上建置應用程式所需的基本概念與參考資料。它是一項專注於 Solana 開發的重要資源,同時為開發者提供了大量範例。

4. Sol Dev Course

Sol Dev Course 旨在簡化 Solana 開發流程,是初學者開始在 Solana 上開發的最佳去處之一。它還擁有活躍的社群,讓成員能夠貢獻內容,協助其他 web3 開發者。

5. 由 buildspace 提供的「使用 react 與 Rust 在 Solana 上建置 Web3 應用程式」課程

Buildspace 是一個絕佳的社群,能讓你展開 Solana 開發之旅,並在完成里程碑後獲得 NFT。這些互動式課程非常適合想在 Solana 上快速建置成品的初學者。

開始撰寫 Solana program

在區塊鏈與智慧合約的世界中摸索可能相當複雜,但像 Solana 這樣的平台,正為更高效、更具擴展性且更經濟實惠的解決方案鋪路。本指南全面概述了 Solana 在智慧合約開發上的獨特方法,並著重說明其獨特的架構、共識機制,以及提供給開發者的各種工具。

無論你是經驗豐富的開發者,還是剛踏入區塊鏈領域,Solana 都提供了充滿前景的創新途徑。隨著區塊鏈生態的持續演進,像 Solana 這樣的平台無疑將在形塑去中心化應用程式與更廣泛的 web3 生態系未來上,扮演關鍵角色。放手投入、動手實驗,善用 Solana 的力量,打造你的下一個專案。

Background gradient

打造區塊鏈魔法

Alchemy 結合最強大的 Web3 開發者產品與工具,並提供資源、社群與卓越的支援。