跳至內容
0%

什麼是 Solana Program Library?

發布於 2023年1月26日閱讀時間 2 分鐘

Solana 是一條高速的可程式化區塊鏈,讓開發者能夠建構並部署去中心化應用程式。Solana 維護著一個專屬的文件庫,稱為 Solana Program Library——這是一組預先編譯、部署並優化過的程式(即智能合約),可用於 Solana 區塊鏈上。

在這篇文章中,我們將探索 Solana 的世界,並了解如何運用 Solana Program Library 快速進行開發。無論你是 Solana 新手還是經驗豐富的開發者,都能透過 SPL 輕鬆建立並部署自己的自訂代幣或去中心化交易所。

Solana 中的程式是什麼?

Solana 中的程式是儲存在稱為帳戶的緩衝儲存空間中的可執行程式碼,可透過交易來執行,類似於 Ethereum 或其他可程式化區塊鏈上的智能合約。 然而,與 Ethereum 不同的是,Ethereum 將程式與狀態一併儲存在智能合約中,而 Solana 採用的是無狀態程式模型,將資料與程式分別儲存在帳戶中。

Solana 中的帳戶是什麼?

根據 Solana 文件的說法:「帳戶是 Solana 帳本中的一筆紀錄,可以是儲存資料,也可以是可執行的程式。」

可以把 Solana 想像成一個資料庫,帳戶就是資料列,公鑰扮演 ID 的角色,而值則是帳戶中儲存的資訊。這些資訊可以是程式(即智能合約),也可以是程式的資料/狀態。

帳戶由唯一的公鑰(256 位元組)識別,其形式通常類似於:「DM6n1qcUCLzJ1RaAuA4gUbBZ9sfHP6KvEwX8oExQqPhk」。

Solana 在邏輯上將程式碼與其資料分開,因此存在兩種帳戶類型——可執行帳戶與不可執行帳戶。

1. 可執行帳戶

只儲存不可變的程式碼、被標記為「可執行」的帳戶。

2. 不可執行帳戶

這類帳戶儲存程式可能會使用到的所有資料,包括變數、資產以及程式的狀態。雖然任何人都能讀取這些帳戶中的資料,但只有程式的擁有者(部署者)能夠變更它。

這些帳戶由驗證節點維護,驗證節點會收取一種稱為「租金」的維護費用,以換取儲存上述資訊所需的記憶體空間。租金以 lamports 支付——這是 SOL(Solana 的原生代幣)的最小計價單位。

Solana 之所以將程式碼與程式資料分開維護,是由於一套名為 Sealevel Parallel Runtime 的系統。

什麼是 sealevel parallel runtime?

Sealevel Parallel Runtime 是 Solana 對平行交易處理系統的實作。 像 Ethereum 這類傳統的單執行緒區塊鏈,一次只能處理一筆交易,以避免並行問題。這是因為 Ethereum 智能合約是有狀態的——意味著狀態與程式碼耦合在同一個合約中。

在 Sealevel 的協助下,Solana 能夠並行處理數千筆不衝突的交易。透過運用多個驗證核心,Solana 還能以 400 毫秒的區塊時間,達到最高 50,000 Tps 的執行能力。這之所以可行,是因為交易指令本身是無狀態的,且會事先決定要修改哪個帳戶的資料。因此,不共用同一帳戶資料的程式可以同時執行。

Solana 有哪些類型的程式?

Solana 的生態系統由兩種截然不同的程式類型組成——原生程式與鏈上程式。我們來分別看看這兩種。

什麼是原生程式?

原生程式負責實作 Solana 網路的核心功能,例如管理帳戶儲存空間的分配、建立新帳戶、處理交易,以及執行 Solana 網路的規則。

原生程式是 Solana 核心區塊鏈模型不可或缺的一部分。它們通常以 Rust 和 C/C++ 等低階語言撰寫,這些語言針對效能與安全性做了優化。原生程式可以被任何程式/使用者呼叫,這一點與作業系統中的核心層級程式不同——後者無法被使用者直接呼叫與存取。

這些程式的更新只能作為核心區塊鏈升級或叢集升級的一部分進行,以新增功能、修復錯誤或改善效能。

有許多原生程式有助於保護驗證器的安全,其中一些包括:

1. System program

System program 負責建立新帳戶、在兩個帳戶之間轉移 SOL、分配帳戶所有權,以及執行更多此類帳戶管理操作。

2. Berkeley packet filter (bpf):

Berkeley Packet Filter 負責處理鏈上程式的部署、升級與執行。

3. Stake program

Stake program 負責管理 Solana 區塊鏈上 SOL 代幣的質押(staking)。

什麼是鏈上程式?

鏈上程式是使用者撰寫的程式(即智能合約),直接部署在區塊鏈上。 這些程式的範圍可以是 dapp、交易所、練習用合約、多簽錢包的實作,或任何其他一般性的程式。

與原生程式不同的是,鏈上程式並不構成 Solana 叢集的核心。相反地,它們是由開發者建立並部署在 Solana 區塊鏈上的自訂程式。這意味著鏈上程式對於 Solana 區塊鏈的運作而言並非必要。

它們是建構在原生程式所提供的核心基礎設施之上,讓開發者能夠在 Solana 區塊鏈上建構各式各樣的應用程式與服務。

程式所互動的資料儲存在獨立的資料帳戶中,並透過指令以引用的方式傳入。只有帳戶擁有者才能升級程式資料。

Solana 程式將狀態儲存在獨立資料帳戶中的示意圖
Solana 中的程式

什麼是 Solana Program Library?

Solana Program Library(SPL)是一組預先撰寫、模組化的程式集合,可用於在 Solana 區塊鏈上建構去中心化應用程式。SPL 的目標是透過提供一組可重複使用、模組化的元件,讓開發者更容易建立應用程式,這些元件能輕鬆整合進他們的應用程式中,減少開發者從頭撰寫複雜程式碼的需求。

因此,SPL 讓開發者能夠採用「積木」的方式來建構應用程式,每個元件都能輕鬆整合進應用程式中。

SPL 包含多個鏈上通用程式,其中 Token program 及其各種變體最為普遍,可以幫助你將它們整合進自己的專案,而不必從頭實作。

SPL 的先決條件

要與 SPL 互動,你可以選擇 CLI 方式,或是較常見的 JS 方式——後者會使用 solana/web3.js 讓你的 JavaScript 程式碼與 Solana 區塊鏈互動。

要與任何 Solana 叢集互動,你也必須設定好 Solana CLI(命令列介面)。對於新手開發者來說,CLI 或許不是最友善的工具,但它提供了對你 Solana 帳戶最直接、最安全的存取方式。此外,CLI 也是 Solana 核心開發者最先部署新功能的地方。

什麼是 SPL token program?

SPL Token program 是 Solana 區塊鏈上同質化與非同質化代幣的通用實作。 它提供了一套介面與詳細的實作,讓開發者能夠建立自己的代幣。該程式碼原生以 Rust 撰寫,其自動產生的綁定則有 C 與 JavaScript 版本。原始碼可在 SPL GitHub 儲存庫中取得。

在 Ethereum 中,ERC20 Token program 的運作方式與 Ethereum ERC-20 合約不同。讓我們透過一個例子來理解這個差異:

假設你想在 Ethereum 區塊鏈上發行三種不同的代幣。要這麼做,你必須為每個代幣分別部署 3 個獨立的合約。每個代幣合約都會各自追蹤自己的狀態(例如餘額與轉帳紀錄)。

而在 Solana 中,則不需要部署三個獨立的 token program。相反地,你可以部署一個通用的 token program,讓它在多個帳戶上運作(例如鑄造帳戶與接收帳戶)。

鑄造地址(mint address)將唯一識別代幣的類型。這項資訊可以作為參數,傳遞給一個已經部署在 Solana 鏈上、單一靜態的 ERC20 程式實例。

如何使用 SPL token program 建立同質化代幣

透過 SPL Token Program,你可以透過幾個步驟建立自己的同質化代幣。在深入了解 Token program 之前,請確認你已設定好 CLI 錢包,或是已將 Phantom 錢包連接到 Solana 的 Devnet,並且已空投足夠的 devnet SOL 到你的錢包中。

步驟 1:建立你的同質化代幣

create token 指令是給鏈上 SPL Token Program 的指示,用來建立新的 Token。在代幣成功建立後,我們會收到一個 Token ID 以及交易簽章。不過沒錯,我們仍然需要鑄造它們。

指令如下spl-token create-token

執行 spl-token create-token 指令的結果
執行 spl-token create-token 指令的結果

步驟 2:建立代幣帳戶

用來將與我們代幣相關的資訊儲存在一個獨立的資料帳戶中。這個代幣帳戶由 SPL-Token Program 所擁有,該程式會控制對這些代幣的存取,並搭配 owner 欄位(也就是我們可以用來花費/轉移代幣的 Token-ID)。

由於這是一個資料帳戶,其資料可以透過 Token Program 進行修改,例如新增/鑄造、轉移或銷毀代幣。

建立代幣帳戶的指令如下spl-token create-account

如下圖所示,我們在建立代幣及其相關帳戶時損失了一小部分 SOL 作為交易手續費。另外請注意,初始供應量為零。這代表我們必須透過鑄造來新增所需數量的供應量。

執行 spl-token create-account 指令後的餘額。
執行 spl-token create-account 指令後的餘額。

步驟 3:鑄造所需數量的代幣

要鑄造指定數量的代幣,請執行以下指令:

指令執行完成後,指定數量的代幣就會被鑄造進你的檔案系統錢包中,代幣供應量也會隨之更新。

鑄造 2,000 個 SPL token 後的終端機輸出,顯示更新後的供應量
鑄造 2,000 個 token 後的結果

你可以透過執行以下指令,查看目前的代幣供應量以及與該代幣關聯的帳戶:

查詢 spl-token supply 與帳戶餘額的結果
查詢 spl-token supply 與帳戶餘額的結果

現在,讓我們把代幣轉移到我們的 Phantom 錢包——這是 Solana 上一款熱門的錢包。

步驟 4:轉移代幣

計畫是將「x」數量的代幣轉移給接收方——也就是我們的 Phantom 錢包。「fund recipient」負責在接收方尚未擁有代幣帳戶時,為其建立一個代幣帳戶。這個過程稱為建立關聯代幣帳戶(Associated Token Account)

以下是轉移代幣的指令:

spl-token transfer 指令將 token 傳送到 Phantom 錢包的終端機輸出
Token 轉帳結果

轉移成功後,你會收到一則成功訊息。

Phantom 錢包轉帳成功訊息
Phantom 錢包轉帳成功訊息

你可以透過執行以下指令來驗證轉移結果:*spl-token accounts

注意:如果你執行 token supply 指令,仍然會顯示 2,000 個代幣,因為 supply(供應量)指的是網路中流通的代幣數量,而 balance(餘額)指的則是你的代幣帳戶所擁有的代幣數量。

比較 SPL token 帳戶餘額與總供應量的終端機輸出
Token 餘額與 Token 供應量比較

步驟 5:限制代幣供應量

合約安全性與需求的關鍵環節之一,就是限制代幣供應量。要停用鑄造功能,可以將 mint authority 設為「None」。

停用 token mint authority 的指令:*spl-token authorize mint --disable

在停用鑄造功能前額外鑄造 3000 個 token
在停用鑄造功能前額外鑄造 3000 個 token
停用 SPL token 鑄造權限後的終端機輸出
鑄造權限停用結果

步驟 6:銷毀代幣

如果你想減少某個代幣的供應量,可以選擇將其銷毀。

以下是相關指令:spl-token burn

執行 spl-token burn 指令的終端機輸出
銷毀 SPL Token

銷毀之後,供應量與餘額都會隨之減少。如範例所示,我們的餘額從 4,978 降到 3,978,供應量則減少至 4,000。

銷毀 SPL token 後的終端機輸出,顯示減少後的餘額與供應量
SPL Token 銷毀結果

SPL 提供了一份完整的參考指南,說明如何運用 Token program 執行更多操作,例如:

  • 將 SOL 包裝成代幣。
  • 將代幣轉移給明確指定的接收方代幣帳戶。
  • 建立非同質化代幣。

透過 SPL 展開你的 Solana 開發之旅

Solana Program Library 提供了大量預先發布的鏈上程式,可以輕鬆與其互動。透過 SPL,開發者可以專注於自家應用程式的獨特功能,而不必花時間在基本、樣板式的代幣建立程式碼上。

如果你是初學者,想要展開自己的 Solana 開發之旅,第一步就是探索 SPL 以及 Alchemy 的 Solana API,並申請一個免費的 Solana RPC 節點帳戶。這些工具將幫助你快速讓自己的程式運作起來。

Background gradient

打造區塊鏈魔法

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