---
title: "什麼是 Solana 帳戶模型？"
description: "了解 Solana 帳戶模型、不同的帳戶類型，以及它們如何協同運作"
---

# 什麼是 Solana 帳戶模型？

Solana 上的所有東西都可以視為一個帳戶（account），而帳戶正是該協定用來「組織」區塊鏈上資料的方式。本文將全面概述 Solana 的帳戶模型，包括帳戶的類型與分類、帳戶組成，以及「rent」的概念。

## **什麼是 Solana 帳戶，運作方式為何？**

**Solana 帳戶可以視為儲存空間，能夠容納各種資料類型：從 SOL 這類代幣，到程式的狀態變數（例如整數、字串、公鑰），甚至是整個程式本身。** 每個帳戶都有指定的 owner，而單一 owner 可以擁有多個不同的帳戶。

Account Model 常被拿來與電腦檔案系統做比較：

<EmbeddedTable
  table={{
    columns: [
      { key: "1", width: 200, title: "Computer File", dataType: "object" },
      { key: "2", width: 200, title: "Solana Account", dataType: "object" },
    ],
    data: [
      {
        "1": { title: "<p>Name</p>", tooltip: "", icon: "" },
        "2": { title: "<p>lamports</p>", tooltip: "", icon: "" },
        id: 0,
      },
      {
        "1": { title: "<p>Address</p>", tooltip: "", icon: "" },
        "2": { title: "<p>owner</p>", tooltip: "", icon: "" },
        id: 1,
      },
      {
        "1": { title: "<p>Email</p>", tooltip: "", icon: "" },
        "2": { title: "<p>rent_epoch</p>", tooltip: "", icon: "" },
        id: 2,
      },
      {
        "1": { title: "<p>Experience</p>", tooltip: "", icon: "" },
        "2": { title: "<p>executable</p>", tooltip: "", icon: "" },
        id: 3,
      },
      {
        "1": { title: "<p>GeorgeBrownCV.docx</p>", tooltip: "", icon: "" },
        "2": { title: "<p>0cnjSElkwFlkffjckDSJRU432RIANCLk</p>", tooltip: "", icon: "" },
        id: 4,
      },
    ],
  }}
/>

## **Solana 帳戶有哪些類型？**

Solana 帳戶主要分為兩種類型：可執行（executable）與不可執行（non-executable）。這是因為 Solana 的程式不像 Ethereum 的智能合約那樣儲存狀態，因此需要將兩種行為分開處理。

### **什麼是可執行程式（executable programs）？**

可執行程式由不可變的程式碼組成，這些程式碼擁有並建立其他用於儲存狀態的帳戶。這些程式碼以 **Rust** 等語言撰寫，接著編譯成 eBPF，這是一種位元組碼（bytecode）形式。

可執行程式最常見的例子是 Solana 的核心 System Program，負責建立人們用來存取代幣與 NFT 的帳戶（也就是錢包）。

### **什麼是不可執行程式（non-executable programs）？**

不可執行程式是「儲存」帳戶，內含所有其他類型的資料，例如程式變數、代幣餘額、NFT、同質化貨幣等。透過不可執行帳戶，協定得以反映每筆交易後所發生的狀態變化。

### **Ethereum 智能合約 vs. Solana 程式**

智能合約內建一個稱為「[storage](https://www.alchemy.com/docs/smart-contract-storage-layout)」的特殊區塊，用來儲存其狀態變數。智能合約接著使用其可執行程式碼來修改這些狀態變數。Ethereum 合約可以視為可執行程式碼與不可執行程式碼共存的統一場所。

以 USDC 代幣為例。它的合約中有一個名為「balances」的對應表（mapping），將使用者的地址對應到該使用者所持有的 USDC 數量。當使用者發送或接收 USDC 代幣時，合約會透過其可執行程式碼自行反映相應的變化。

Solana 的處理方式不同。有一個 USDC token program，會為每個代幣持有者建立一個新帳戶。這些帳戶儲存持有者可用的 USDC 數量。當使用者傳播一筆交易時，USDC Token account 會尋找要進行交換的使用者所對應的 token account，然後在其中反映變化。

<ImageBlock
  src="https://media.alchemy.com/1703697343-solana-associated-token-account-structure.png"
  alt="Solana 代幣程式建立關聯代幣帳戶以儲存每位使用者 USDC 餘額的示意圖"
  width={1600}
  height={901}
  caption="Solana 的關聯代幣帳戶結構"
/>

## **Solana 帳戶有哪些分類？**

可執行與不可執行帳戶還可以再細分為幾種類別，例如 native programs、[program accounts 以及 data accounts](https://www.alchemy.com/overviews/solana-data-vs-program-accounts)。

### **什麼是可執行的 native programs？**

**可執行的 native programs 是 [Solana 生態系統](https://www.alchemy.com/dapps/ecosystem/solana)「原生」的程式，負責維護與運行驗證節點等任務。此類型最知名的例子是 System Program**，它負責建立新的系統帳戶（也就是我們常說的「錢包」）、SOL 的轉帳等。其他 Native Programs 的例子還有 **Stake Program**，負責質押機制，以及 BPF Loader，其功能類似於 Ethereum 的 EVM。

### **什麼是可執行的 program accounts？**

可執行的 program accounts 是預先建立好的 Solana 程式，用來建立並儲存其他程式。一個很好的例子是[Solana Program Library](https://www.alchemy.com/overviews/solana-program-library)（SPL）——這是一系列支援多種鏈上活動的程式集合，包括建立、交換、借貸代幣、產生質押池，以及維護鏈上名稱服務。SPL 中一個重要的代表是 **Token Program**，負責建立與管理代幣。

Solana 的 USDC 代幣其實就是一個由 Token Program 管理的 Token account。不過，Token account 本身並不儲存使用者的代幣餘額，這是由第三種帳戶類型的成員來處理：**data accounts。**

### **什麼是不可執行的 data accounts？**

Native Programs 與 Program accounts 屬於可執行類型，而 data accounts 則正好相反：它們是一個登記簿，反映特定程式以及整個 Solana 協定的狀態變化。

Data accounts 可以分為：

1. **Token accounts** - 由 Token Program 建立的帳戶
1. **Associated Token Accounts（ATA）** - 儲存每個使用者代幣餘額的帳戶
1. **System Owned Accounts** - 儲存資料並允許簽署交易

Token accounts 代表每一種同質化貨幣（USDC、USDT 等），並包含該代幣的基本資訊，例如供應量、小數位數、名稱等。每個獨立的 Token account 都會產生一個不同的[associated token account（ATA）](https://www.alchemy.com/overviews/associated-token-account)。舉例來說，如果你同時持有 USDC 和 USDT，你就會擁有兩個分別由 USDC 和 USDT Token account 建立的 ATA。

<ImageBlock
  src="https://media.alchemy.com/1703697445-solana-account-types-and-categories.png"
  alt="Solana 帳戶類別示意圖：原生程式、程式帳戶與資料帳戶"
  width={1600}
  height={901}
  caption="Solana 帳戶類型與類別"
/>

## **Solana 帳戶有哪些組成元素？**

**每個帳戶元素都是一組 metadata，讓協定能夠輕易理解該帳戶的類型與其他資訊。** Metadata 包含：

- **lamports** - 帳戶的 SOL 餘額，以 lamport 為單位計價，1 lamport 相當於十億分之一個 SOL 代幣
- **owner** - 擁有該帳戶的程式的地址
- **executable** - 一個布林變數，表示該帳戶是否包含可執行程式碼
- **data** - 儲存在帳戶中的原始資料位元組陣列，無論是儲存變數還是可執行程式碼
- **rent_epoch** - 表示該帳戶下一次需要繳交 rent 的 epoch

**owner** 與 **holder** 的差異在於：owner 是控制該帳戶的程式，而 holder 則是持有該帳戶私鑰的使用者。舉例來說，System Owned Account 是由 Solana 的 Native System Program 所擁有。

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

每個帳戶都需要[**支付 rent 費用**](https://www.alchemy.com/overviews/how-to-calculate-rent-for-solana-programs)才能使用區塊鏈上的記憶體，這是一項預防措施，用來防止攻擊者利用所有記憶體來堵塞網路。

一條區塊鏈若要滿足所有使用者的需求，就必須包含某種經濟誘因。這對於驗證者（validators）來說尤其重要，他們提供硬體與運算能力來驗證所有交易。驗證者需要維護所有狀態變化的一份運作副本，並藉由收取 rent 作為報酬。

若某帳戶維持的最低餘額相當於 2 年的 rent 費用，則可豁免繳交 rent。若未達此標準，則會在該帳戶被某筆交易引用時，或每個 epoch（目前約為兩天）收取一次費用。若某帳戶不含足以豁免 rent 的最低 SOL 數量，其資料將會從鏈上刪除。

## **如何建立 Solana 帳戶**

在 Solana 上建立 System Account，正是[**Solana 錢包**](https://www.alchemy.com/overviews/solana-wallets)每次使用者建立新「錢包」時，在背後所執行的動作。錢包會透過產生一組位於 ED25519 橢圓曲線上的 64 位元組金鑰對，來建立新帳戶。前 32 個位元組是私鑰，當使用者想要建立交易並與其他帳戶或程式互動時會用到。後 32 個位元組則是該錢包的公鑰。

## **開始在 Solana 上建構**

Account Model 是 Solana 協定用來組織資料的系統。帳戶可以視為儲存空間，能夠容納各種內容——從原始資料、程式碼、狀態變數，到代幣餘額、NFT 等等。帳戶主要分為兩種類型：可執行與不可執行。

若想開始使用 Alchemy 進行開發，[立即開通免費的 Solana 開發者帳戶](https://dashboard.alchemy.com/signup/?a=solana-account-model)！
