在傳統的區塊鏈系統中,使用者通常以“錢包”和“智能合約”來思考。然而,在 Solana 中,幾乎所有東西都圍繞著 帳戶 。程式、代幣、NFT、用戶餘額,甚至可執行代碼都存儲在不同的帳戶類型中。
理解 Solana 的帳戶架構對於在該網絡上開發的開發者至關重要。與以太坊的合約存儲模型相比,Solana 的帳戶系統更為明確、模組化,並針對高效能的並行執行進行了優化。
本文將解釋主要的 Solana 帳戶類型、它們的內部運作以及為什麼它們對 Solana 的可擴展性至關重要。
什麼是 Solana 帳戶?
Solana 帳戶本質上是一個容器,存儲著:
- SOL 餘額
- 程式狀態數據
- 可執行代碼
- 代幣所有權信息
- 元數據
每一項鏈上數據都存在於帳戶內。
與以太坊不同,以太坊的智能合約直接持有內部存儲,Solana 則將數據存儲與可執行程序分開。這種分離是 Solana 能夠並行處理交易的原因之一。
每個帳戶包含:
欄位描述LamportsSOL 餘額Owner控制該帳戶的程序Data任意二進位數據Executable帳戶是否包含可執行代碼
codeRent EpochRent 交易追蹤
為何 Solana 使用帳戶Solana 的執行時優化了速度和並發性。
在交易執行之前,Solana 要求交易明確聲明將讀取或修改哪些帳戶。這使得執行時可以判斷交易是否可以在沒有衝突的情況下並行運行。
好處包括:
- 大規模的並行執行
- 預測性狀態訪問
- 減少執行時歧義
- 更高的吞吐量
- 更好的可擴展性
這種設計與以太坊的全局共享狀態模型根本不同。
有幾種重要的帳戶類別,開發者應該了解。
系統帳戶是Solana上最基本的帳戶類型。
它們通常是由密鑰對控制並由系統程式擁有的錢包帳戶。
系統帳戶可以:
- 持有SOL
- 發送交易
- 支付手續費
- 創建新帳戶
新生成的錢包地址通常是一個系統帳戶。
示例:
const accountInfo = await connection.getAccountInfo(publicKey);
如果擁有者是系統程式,那麼它很可能是一個標準的錢包帳戶。
程式帳戶包含
可執行的智能合約代碼。
這些帳戶被標記為:
executable = true
與以太坊合約不同,Solana 程式通常是無狀態的。它們不直接在內部存儲用戶數據。相反,它們在傳入指令的單獨數據帳戶上運行。
特徵:
屬性 值
存儲可執行代碼 是
存儲可變狀態 通常不是
可升級 可選
可執行 是
程式作為鏈上帳戶部署。
常見的例子包括:
- 代幣程式
- 關聯代幣程式
- Metaplex 程式
- Jupiter 程式
數據帳戶存儲程式狀態。
程式在執行期間讀取和修改這些帳戶。
例如:
- AMM 流動性池狀態
- NFT 元數據
- 用戶質押資訊
- 訂單簿
- DAO 治理狀態
數據帳戶通常由程式擁有:
owner = ProgramID
擁有的程式有權修改帳戶數據。
這種架構在以下方面創建了明確的區分:
- 邏輯 → 程式帳戶
- 狀態 → 數據帳戶
代幣帳戶是 SPL 代幣程式使用的專用帳戶。
與以太坊 ERC-20 余額不同,代幣余額並不直接存儲
錢包內的代幣。相反,每個代幣餘額存在於獨立的代幣帳戶中。
一個代幣帳戶存儲:
字段描述
Mint:屬於哪個代幣
Owner:錢包擁有者
Amount:代幣餘額
例如:
- USDC 餘額
- BONK 餘額
- Wrapped SOL 餘額
所有代幣都存在於獨立的代幣帳戶中。
關聯代幣帳戶是一個標準化的代幣帳戶,來源於:
錢包地址 + 代幣 Mint
這確保用戶對每個 SPL 代幣都有可預測的代幣帳戶地址。
好處:
- 更容易的錢包整合
- 標準化代幣
- 處理
- 簡化用戶體驗
大多數錢包在接收代幣時會自動創建 ATA。
鑄造帳戶定義了一個代幣本身。
它們儲存代幣級別的配置,例如:
字段描述供應總供應量小數精度鑄造權限誰可以鑄造凍結權限誰可以凍結
例如,USDC 鑄造帳戶定義:
- Solana 上的 USDC 總供應量
- 小數精度
- 鑄造權限
所有引用該鑄造帳戶的代幣帳戶共享相同的代幣定義。
PDA 是由程式生成的確定性帳戶。
它們不具有
私鑰。
相反,它們完全由程式邏輯控制。
在 Solana 開發中,PDA(程序導向賬戶)非常重要,因為它們允許程序安全地管理狀態。
使用範例:
- 使用者保險庫
- 信託賬戶
- 流動性池
- NFT 元數據
- 質押記錄
PDA 是使用以下方式生成的:
PublicKey.findProgramAddressSync()
優勢:
- 確定性地址
- 無需私鑰管理
- 安全的程序所有權
- 可預測的狀態結構
Sysvar 賬戶儲存網絡級的運行時資訊。
這些是內建的
由 Solana 運行時提供的唯讀帳戶。
示例包括:
SysvarPurposeClock 當前時間戳和插槽
Rent 租金參數
EpochSchedule 時期信息
RecentBlockhashes 最近的區塊哈希
程序使用 sysvars 來訪問區塊鏈上下文。
示例:
- 檢查當前插槽
- 計算質押獎勵
- 時間鎖驗證
租金和帳戶存儲
在 Solana 上,存儲數據會消耗區塊鏈資源。
帳戶必須保持最低 SOL 餘額,稱為:
Rent-exempt balance
如果餘額過低,帳戶最終可能會被刪除。
較大的帳戶需要更多的 SOL 來支持。
保持租金豁免。
示例:
帳戶類型典型大小錢包帳戶小型代幣帳戶約 165 位元組NFT 元資料較大AMM 池狀態更大
租金鼓勵網路上有效的儲存使用。
Solana 使用可執行標記來區分帳戶。
類型可執行錢包帳戶否代幣帳戶否PDA否程式帳戶是
僅有可執行帳戶可以處理指令。
每個帳戶都有一個擁有者。
擁有者決定哪個程式可以修改帳戶的數據。
示例:
帳戶擁有者錢包帳戶系統程式代幣帳戶SPL 代幣程式NFT
元數據Metaplex程序
程序無法任意修改它們不擁有的帳戶。
這創造了強大的安全邊界。
架構差異顯著。
特點Solana以太坊狀態存儲獨立帳戶內部合約存儲平行執行是有限的明確帳戶訪問必須不需要代幣餘額獨立的代幣帳戶存儲在合約中無狀態程序常見稀有
Solana的模型初看起來更複雜,但能夠實現更高的吞吐量。
一次簡單的USDC轉移可能涉及:
- 發件人錢包
這種明確的結構使得 Solana 能夠高效且安全地處理交易。
帳戶架構是 Solana 中最重要的創新之一。
它使得:
- 並行交易執行
- 高 TPS
- 可預測的運行時行為
- 模組化程序設計
- 高效的狀態管理
對於開發者來說,理解帳戶是:
- 編寫程式的基礎
- 除錯
- 交易
- 管理狀態
- 優化性能
- 構建可擴展的去中心化應用(dApps)