---
title: "什麼是 Solana Program Library?"
description: "了解如何使用 Solana Program Library 在 Solana 上開發去中心化應用程式"
---

# 什麼是 Solana Program Library?

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

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

## **Solana 中的程式是什麼？**

**Solana 中的程式是儲存在稱為帳戶的緩衝儲存空間中的可執行程式碼，可透過交易來執行，類似於 Ethereum 或其他可程式化區塊鏈上的智能合約。** 然而，與 Ethereum 不同的是，Ethereum 將程式與狀態一併儲存在智能合約中，而 Solana 採用的是[無狀態程式模型](https://www.alchemy.com/overviews/solana-account-model)，將資料與程式分別儲存在帳戶中。

### **Solana 中的帳戶是什麼？**

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

可以把 Solana 想像成一個資料庫，[帳戶](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)就是資料列，公鑰扮演 ID 的角色，而值則是帳戶中儲存的資訊。這些資訊可以是程式（即智能合約），也可以是程式的資料/狀態。

帳戶由唯一的公鑰（256 位元組）識別，其形式通常類似於：「DM6n1qcUCLzJ1RaAuA4gUbBZ9sfHP6KvEwX8oExQqPhk」。

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

#### **1. 可執行帳戶**‍

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

#### **2. 不可執行帳戶**‍

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

這些帳戶由[驗證節點](https://www.alchemy.com/overviews/what-is-firedancer)維護，驗證節點會收取一種稱為「[租金](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)」的維護費用，以換取儲存上述資訊所需的記憶體空間。租金以 **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 區塊鏈上建構各式各樣的應用程式與服務。

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

<ImageBlock
  src="https://media.alchemy.com/1703692327-programs-in-solana.png"
  alt="Solana 程式將狀態儲存在獨立資料帳戶中的示意圖"
  width={557}
  height={385}
  caption="Solana 中的程式"
/>

## **什麼是 Solana Program Library？**

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

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

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

### **SPL 的先決條件**

要與 SPL 互動，你可以選擇 CLI 方式，或是較常見的 JS 方式——後者會使用 solana/[web3.js](https://www.alchemy.com/dapps/web3-js) 讓你的 JavaScript 程式碼與 Solana 區塊鏈互動。

要與任何 Solana 叢集互動，你也必須[設定好 Solana CLI（命令列介面）](https://www.alchemy.com/docs/reference/solana-api-quickstart)。對於新手開發者來說，CLI 或許不是最友善的工具，但它提供了對你 Solana 帳戶最直接、最安全的存取方式。此外，CLI 也是 Solana 核心開發者最先部署新功能的地方。

## **什麼是 SPL token program？**

**SPL Token program 是 Solana 區塊鏈上同質化與非同質化代幣的通用實作。** 它提供了一套介面與詳細的實作，讓開發者能夠建立自己的代幣。該程式碼原生以 Rust 撰寫，其自動產生的綁定則有 C 與 JavaScript 版本。原始碼可在 [SPL GitHub 儲存庫](https://github.com/solana-labs/solana-program-library/tree/master/token/program)中取得。

在 Ethereum 中，[ERC20](https://www.alchemy.com/overviews/erc20-solidity) 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](https://www.alchemy.com/docs/add-alchemy-rpc-to-any-project)，並且已[空投足夠的 devnet SOL](https://www.alchemy.com/overviews/solana-devnet) 到你的錢包中。

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

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

**指令如下**：`spl-token create-token`

<ImageBlock
  src="https://media.alchemy.com/1703692444-running-spl-token-create-token-command.png"
  alt="執行 spl-token create-token 指令的結果"
  width={1058}
  height={159}
  caption="執行 spl-token create-token 指令的結果"
/>

### **步驟 2：建立代幣帳戶**

用來將與我們代幣相關的資訊儲存在一個獨立的資料帳戶中。這個[代幣帳戶](https://www.alchemy.com/overviews/associated-token-account)由 SPL-Token Program 所擁有，該程式會控制對這些代幣的存取，並搭配 owner 欄位（也就是我們可以用來花費/轉移代幣的 Token-ID）。

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

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

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

<ImageBlock
  src="https://media.alchemy.com/1703692522-solana-token-balance.png"
  alt="執行 spl-token create-account 指令後的餘額。"
  width={892}
  height={225}
  caption="執行 spl-token create-account 指令後的餘額。"
/>

### **步驟 3：鑄造所需數量的代幣**

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

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

<ImageBlock
  src="https://media.alchemy.com/1703692591-results-after-minting-tokens.png"
  alt="鑄造 2,000 個 SPL token 後的終端機輸出，顯示更新後的供應量"
  width={841}
  height={80}
  caption="鑄造 2,000 個 token 後的結果"
/>

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

<ImageBlock
  src="https://media.alchemy.com/1703692668-checking-spl-token-supply.png"
  alt="查詢 spl-token supply 與帳戶餘額的結果"
  width={808}
  height={162}
  caption="查詢 spl-token supply 與帳戶餘額的結果"
/>

現在，讓我們把代幣轉移到我們的 [Phantom 錢包](https://www.alchemy.com/dapps/phantom)——這是 Solana 上一款熱門的錢包。

### 步驟 4：轉移代幣

計畫是將「x」數量的代幣轉移給接收方——也就是我們的 Phantom 錢包。「fund recipient」負責在接收方尚未擁有代幣帳戶時，為其建立一個代幣帳戶。這個過程稱為建立[關聯代幣帳戶（Associated Token Account）](https://www.alchemy.com/overviews/associated-token-account)。

**以下是轉移代幣的指令：**

<ImageBlock
  src="https://media.alchemy.com/1703692742-token-transfer-results.png"
  alt="spl-token transfer 指令將 token 傳送到 Phantom 錢包的終端機輸出"
  width={1345}
  height={197}
  caption="Token 轉帳結果"
/>

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

<ImageBlock
  src="https://media.alchemy.com/1703692827-phantom-wallet-transfer-confirmation.png"
  alt="Phantom 錢包轉帳成功訊息"
  width={358}
  height={533}
  caption="Phantom 錢包轉帳成功訊息"
/>

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

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

<ImageBlock
  src="https://media.alchemy.com/1703693162-token-balance-vs-token-supply.png"
  alt="比較 SPL token 帳戶餘額與總供應量的終端機輸出"
  width={812}
  height={163}
  caption="Token 餘額與 Token 供應量比較"
/>

### **步驟 5：限制代幣供應量**

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

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

<ImageBlock
  src="https://media.alchemy.com/1703693237-minting-extra-tokens.png"
  alt="在停用鑄造功能前額外鑄造 3000 個 token"
  width={899}
  height={201}
  caption="在停用鑄造功能前額外鑄造 3000 個 token"
/>

<ImageBlock
  src="https://media.alchemy.com/1703693326-mint-authority-disabled.png"
  alt="停用 SPL token 鑄造權限後的終端機輸出"
  width={977}
  height={155}
  caption="鑄造權限停用結果"
/>

### **步驟 6：銷毀代幣**

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

以下是相關指令：`spl-token burn`

<ImageBlock
  src="https://media.alchemy.com/1703693386-burning-spl-tokens.png"
  alt="執行 spl-token burn 指令的終端機輸出"
  width={904}
  height={122}
  caption="銷毀 SPL Token"
/>

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

<ImageBlock
  src="https://media.alchemy.com/1703693454-spl-token-burn-results.png"
  alt="銷毀 SPL token 後的終端機輸出，顯示減少後的餘額與供應量"
  width={817}
  height={184}
  caption="SPL Token 銷毀結果"
/>

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

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

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

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

如果你是初學者，想要展開自己的 Solana 開發之旅，第一步就是探索 SPL 以及 [Alchemy 的 Solana API](https://www.alchemy.com/docs/reference/solana-api-quickstart)，並申請一個[免費的 Solana RPC 節點帳戶](https://dashboard.alchemy.com/signup/?a=solana-program-library)。這些工具將幫助你快速讓自己的程式運作起來。
