---
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)维护，验证节点会收取一种称为“[Rent](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)”的维护费用，以换取存储上述信息所需的内存空间。Rent 以 **lamport**（SOL——Solana 原生代币——的最小计价单位）支付。

Solana 的代码和程序数据之所以分开维护，是因为一套称为 **Sealevel 并行运行时** 的系统。

### **什么是 Sealevel 并行运行时？**

**Sealevel 并行运行时是 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 代币的质押。

### **什么是链上程序？**

**链上程序是用户编写的程序（即智能合约），直接部署在区块链上。**它们的范围可以是一个 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) 的工作方式与 Ethereum ERC-20 合约有所不同。我们通过一个例子来理解这个区别：

假设你想在 Ethereum 区块链上发布三种不同的代币。为此，你必须为每种代币各部署一份独立合约。每个代币合约都会各自维护自己的状态（例如余额和转账记录）。

而在 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 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 代币后的终端输出，显示更新后的供应量"
  width={841}
  height={80}
  caption="铸造 2,000 个代币后的结果"
/>

你可以通过运行以下命令查看当前的代币供应量以及与该代币关联的账户：

<ImageBlock
  src="https://media.alchemy.com/1703692668-checking-spl-token-supply.png"
  alt="检查 spl-token 供应量和账户余额的结果"
  width={808}
  height={162}
  caption="检查 spl-token 供应量和账户余额的结果"
/>

现在，让我们把代币转到我们的 [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 命令将代币发送到 Phantom 钱包的终端输出"
  width={1345}
  height={197}
  caption="代币转账结果"
/>

转账成功后，你会收到一条成功消息。

<ImageBlock
  src="https://media.alchemy.com/1703692827-phantom-wallet-transfer-confirmation.png"
  alt="Phantom 钱包转账成功提示"
  width={358}
  height={533}
  caption="Phantom 钱包转账成功提示"
/>

你可以运行以下命令来验证转账：`*spl-token accounts`

注意：如果你运行代币供应量命令，它仍然会显示 2,000 个代币，因为供应量指的是网络中流通的代币数量，而余额指的是你的代币账户所持有的代币数量。

<ImageBlock
  src="https://media.alchemy.com/1703693162-token-balance-vs-token-supply.png"
  alt="比较 SPL 代币账户余额与代币总供应量的终端输出"
  width={812}
  height={163}
  caption="代币余额与代币供应量对比"
/>

### **第 5 步：限制代币供应量**

合约安全性和需求方面的一个关键点是限制代币供应量。要禁用铸造功能，将 mint authority 设置为 “None”。

禁用代币铸造权限的命令：`*spl-token authorize mint --disable`

<ImageBlock
  src="https://media.alchemy.com/1703693237-minting-extra-tokens.png"
  alt="在禁用铸造前额外铸造 3000 个代币"
  width={899}
  height={201}
  caption="在禁用铸造前额外铸造 3000 个代币"
/>

<ImageBlock
  src="https://media.alchemy.com/1703693326-mint-authority-disabled.png"
  alt="禁用 SPL 代币铸造权限后的终端输出"
  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 代币"
/>

销毁之后，供应量和余额都会随之减少。如示例所示，我们的余额从 4,978 降至 3,978，供应量也减少到了 4,000。

<ImageBlock
  src="https://media.alchemy.com/1703693454-spl-token-burn-results.png"
  alt="销毁 SPL 代币后的终端输出，显示减少后的余额和供应量"
  width={817}
  height={184}
  caption="SPL 代币销毁结果"
/>

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)。这些都能帮助你迅速让你的程序运行起来。
