Solana 帳戶模型說明
Learn how Solana's account model stores state, manages ownership, and enables parallel transaction processing for developers and investors.
Solana 帳戶模型將餘額、程式碼、代幣持有量和應用程式狀態儲存在具有明確所有權規則的獨立帳戶中。本白話指南在深入探討欄位、帳戶類型、租金豁免和實際範例之前,將為一般讀者解釋此模型。
租金處理、帳戶大小限制和客戶端 API 等實作細節可能會有所變動。開發者在部署前應查閱最新的 Solana 文件並查詢目前的網路參數。
如果您來自以太坊,Solana 的帳戶模型一開始可能會感覺顛倒。這種反應是正確的起點。您在以太坊上建立的心智模型無法順利轉移,試圖強行套用將在每一步造成混淆。
Solana 帳戶模型是所有鏈上狀態都儲存在稱為帳戶的離散儲存單元中的架構系統。每個錢包餘額、程式、代幣持有量和應用程式狀態記錄都存在於一個獨立帳戶中,該帳戶具有定義的所有者、lamport 餘額,以及關於誰可以讀取或寫入它的明確規則。在 Solana 上,沒有任何東西存在於帳戶之外。
將 Solana 想像成一個全球檔案系統。每段資料都存在於一個稱為帳戶的獨立檔案中。程式是讀寫這些檔案的應用程式,但程式只能修改它擁有的檔案。執行環境在協定層級強制執行這些所有權規則,沒有例外。
本文涵蓋了每個 Solana 帳戶中的五個欄位、五種不同的帳戶類型、租金與租金豁免的運作方式、程式衍生地址 (PDAs) 是什麼以及它們為何存在、帳戶的建立與關閉方式,以及為何這種架構能實現 Solana 的平行交易處理。Solana 程式以 Rust (或 C/C++) 編寫,儘管 Anchor 等框架能抽象化許多帳戶管理樣板程式碼。本文涵蓋了兩者所需的概念基礎。
Solana 帳戶模型:帳戶的解剖
A Solana 帳戶是網路上的標記式儲存槽,持有 lamports 餘額、任意資料負載以及一組定義其所有者及功能的中繼資料欄位。在 Solana 上,所有資料,從錢包餘額到程式狀態再到代幣持有量,都儲存在帳戶中。
Lamports 是 SOL(網路的原生代幣)的最小單位。Lamports 對於 SOL 就像美分對於美元一樣,只是精確度有九個小數點:1 SOL 等於 1,000,000,000 lamports。每個帳戶都有 lamport 餘額,為帳戶在網路上的持續存在提供資金,並代表可轉移的價值。
每個 Solana 帳戶都包含恰好五個欄位:
lamports(u64):帳戶的 lamports 餘額。此欄位為租金提供資金,並可轉移至其他帳戶。data(位元組陣列):原始二進位儲存。在可執行帳戶中,此欄位包含已編譯的 BPF/SBF 位元組碼。在資料帳戶中,它包含結構化的應用程式狀態。在目前的 mainnet 參數下,資料欄位的最大尺寸為 10 MB。owner(Pubkey):擁有此帳戶資料欄位寫入權限的程式的 32 位元組公鑰。這對於以太坊開發者來說是最違反直覺的欄位。您的錢包地址在協定層級上不由您擁有;它由 System Program 擁有。owner 欄位的完整論述出現在 帳戶所有權與授權章節。executable(bool):一個布林值旗標。如果為 true,則 data 欄位包含程式位元組碼,該帳戶充當程式。如果為 false,則帳戶儲存狀態或持有餘額。rent_epoch(u64):一個舊欄位,用於追蹤上次收取租金的 epoch。截至 2024 年,租金收取已被棄用,轉為預設的租金豁免模式。此欄位保留在帳戶結構中,但不再積極使用。
錢包帳戶作為資料結構的樣子如下:
{
"lamports": 1000000000,
"data": [],
"owner": "11111111111111111111111111111111",
"executable": false,
"rent_epoch": 0
}
owner 欄位是協定層級的概念:控制對 data 欄位寫入權限的程式。Authority 是儲存在程式管理資料中的獨立約定,例如代幣帳戶內的 transfer authority 欄位。這兩者並不相同;所有權章節 精確地劃分了這種區別。
Solana 的五種帳戶類型
Solana 有五種不同的帳戶類型,每種類型都由其 owner 欄位和 executable 旗標決定,扮演特定的架構角色。類型並非儲存在單獨的欄位中;它是從帳戶的所有者以及是否包含可執行程式碼推斷出來的。
系統擁有的帳戶 (錢包帳戶)
系統擁有的帳戶只持有使用者的 SOL 餘額,沒有其他。所有者始終是 System Program (11111111111111111111111111111111),executable 旗標為 false,data 欄位為空。當您與 Phantom 或 Solflare 分享您的錢包地址時,您分享的是一個系統擁有帳戶的地址。您透過使用私鑰簽署交易來控制它,但 System Program 是協定層級的所有者。
程式帳戶是包含已編譯 BPF/SBF 位元組碼的可執行帳戶。executable 旗標為 true,所有者是 BPF Loader。程式帳戶在設計上是無狀態的;它們只包含程式碼,從不包含狀態。在以太坊上,一個智能合約在其單一合約地址儲存其程式碼和狀態。在 Solana 上,程式碼存放在程式帳戶中,狀態存放在獨立的資料帳戶中,兩者始終分開儲存。
程式帳戶可以儲存可執行程式碼,executable = true 且 data 欄位中有 BPF/SBF 位元組碼。非可執行資料帳戶則 executable = false 且儲存狀態。
資料帳戶 (程式擁有的帳戶)
資料帳戶是特定程式擁有的非可執行帳戶,在 data 欄位中儲存該程式的狀態。executable 旗標為 false。所有者是創建和管理該帳戶的任何程式。您的 USDC 代幣餘額、一個 DeFi 借貸倉位、一個 NFT 中繼資料記錄:每個都存在於由相關程式擁有的獨立資料帳戶中。
原生程式帳戶是內建的程式,在網路創世時部署於固定地址。它們包括 System Program、BPF Loader、Vote Program 和 Stake Program。這些是無法由使用者取代或升級的核心基礎設施程式。它們的 executable 旗標為 true。
Sysvar 帳戶是 Solana 執行環境預先填入的唯讀帳戶,讓程式能夠存取當前的網路狀態。您可以將 sysvar 帳戶想像成法院的政府公告板:公開可讀,由權威來源維護,但任何私人不得修改。SysvarC1ock11111111111111111111111111111111 的 Clock sysvar 提供目前的區塊時間戳和 slot 編號。Rent sysvar 提供目前的租金參數。
| 帳戶類型 | 所有者 | 可執行 | 主要用途 | 範例 |
|---|---|---|---|---|
| 系統所有 (錢包) | 系統程式 (System Program) | 否 | 持有 SOL 餘額 | Phantom 錢包地址 |
| 程式帳戶 | BPF 載入器 (BPF Loader) | 是 | 儲存程式位元組碼 | SPL 代幣程式 |
| 資料帳戶 | 特定程式 | 否 | 儲存程式狀態 | USDC 代幣帳戶 |
| 原生程式 | 運行時 (創世) | 是 | 核心基礎設施 | 投票程式 (Vote Program) |
| Sysvar 帳戶 | Solana 運行時 | 否 | 訪問網路狀態 | Clock sysvar |
在 Solana 上,程式是無狀態的。所有狀態都存在於它們所擁有並控制的資料帳戶中。這種將邏輯與狀態分離的設計決策,使得本文中提到的一切成為可能。
程式 vs. 資料帳戶:邏輯與狀態的分離
Solana 程式是無狀態的。它們不持有自己的數據,且它們操作的每一部分狀態都存在於運行時傳遞給程式的獨立資料帳戶中。
將 Solana 程式想像成銀行的交易處理軟體,而將資料帳戶想像成單獨的客戶帳戶記錄。軟體知道如何處理儲值和提款,但實際的餘額存在於客戶的檔案中,而不是軟體本身。在 Ethereum 上,對等物就像是一家軟體和每位客戶記錄都共享同一個鎖定房間的銀行,程式及其狀態在單一地址上密不可分。
四個屬性定義了 Solana 程式如何與帳戶互動:
- 程式處理指令,並讀取或寫入呼叫時傳遞給它們的帳戶。它們不持有自己的狀態。
- 程式一旦部署便是不可變的,除非開發者在部署時選擇了可升級的載入器。
- 只有擁有資料帳戶的程式才能修改該帳戶的資料欄位。任何使用者都可以呼叫程式,但對任何帳戶的寫入權限都受所有權門檻限制。
executable(可執行) 標記在協定層級強制執行此區分,且在部署後無法更改。
Solana 程式是無狀態的,但 Solana 系統整體是有狀態的。狀態是持久的;它存在於資料帳戶中。區別在於狀態始終位於程式外部,從不捆綁在程式內部。
這種分離帶來了效能上的影響。因為每筆交易在執行開始前都必須聲明它將讀取或寫入哪些帳戶,Sealevel 運行時可以識別非重疊的交易並同時運行它們。關於 帳戶模型如何實現並行執行 的完整解釋如下。
帳戶所有權與權限:誰在 Solana 上控制什麼
Solana 帳戶中的所有者 (owner) 欄位識別了擁有修改該帳戶資料之專屬權限的程式。在協定層級,只有該程式可以寫入資料欄位。
所有者欄位儲存一個 32 位元的程式公鑰。對於錢包帳戶,所有者是系統程式。對於代幣帳戶,所有者是 SPL 代幣程式。對於自定義資料帳戶,所有者是建立它們的任何程式。所有權在帳戶建立時設定,並由 Solana 運行時在每筆交易中強制執行。
考慮銀行的保險箱。銀行擁有這個箱子,是唯一能從物理上開啟並修改其內容的實體。你持有一把鑰匙,讓你指示銀行如何處理你的箱子,但只有銀行能觸碰內容。在 Solana 上,程式就是銀行,而你就是持有鑰匙的帳戶持有人。
所有者 (Owner) 與權限 (Authority) 之間的區別常讓許多 Ethereum 開發者感到困惑:
- 所有者 (Owner) (協定欄位):可以修改帳戶
data欄位的程式 ID。在帳戶建立時設定。由 Solana 運行時強制執行,而非由任何程式邏輯強制執行。 - 權限 (Authority) (資料慣例):由所有者程式儲存在帳戶
data欄位內的公鑰。它在該程式的邏輯內授權特定操作。由程式本身強制執行,而非運行時。
對於 USDC 代幣帳戶,代幣程式是所有者,可以修改儲存在資料欄位中的餘額。你的錢包是轉帳權限 (transfer authority),這是記錄在資料欄位內的公鑰,代幣程式在執行轉帳前會進行檢查。這些是執行不同功能的動態金鑰。混淆它們是 Solana 新開發中最常見的錯誤之一。
Solana 帳戶租金與免租金說明
Solana 上的租金 (Rent) 是一種儲存費用,以 lamports 為單位,向帳戶收取以補償驗證者維護鏈上狀態的成本。持有最低 lamport 餘額(即免租金門檻)的帳戶可永久免除租金支出,且永遠不會被運行時清除。
什麼是 Solana 上的租金?
驗證者必須將所有活動帳戶狀態儲存在記憶體中。無限數量的零餘額帳戶將成為針對網路的阻斷服務攻擊向量,因此 Solana 要求帳戶持有最低 lamport 餘額作為支付儲存成本的承諾。最初的租金模型按 epoch 收取與資料大小成比例的費用,低於最低限額的帳戶將被垃圾回收。該模型已被廢棄。
根據目前的 Solana 主網參數(在 SIMD-0084 中正式確定),所有新帳戶在建立時必須是免租金的。帳戶結構中的 rent_epoch 欄位現在是一個遺留欄位。
免租金如何運作
要使你的帳戶免租金,請在提交建立交易時,根據其資料大小存入至少最低限額的 lamport 餘額。以目前的網路參數計算:
- 0 位元組帳戶 (錢包):約 890,880 lamports (~0.00089 SOL)
- 165 位元組帳戶 (標準代幣帳戶):約 2,039,280 lamports (~0.00204 SOL)
- 1,024 位元組資料帳戶:約 7,180,800 lamports (~0.00718 SOL)
這些值是近似值,可能會隨運行時參數的變化而改變。使用 Solana CLI 或 getMinimumBalanceForRentExemption RPC 方法計算確切的當前最小值:
solana rent 0 # 0 位元組帳戶的免租金金額
solana rent 165 # 標準代幣帳戶的免租金金額免租金運作方式就像儲存單位的押金。你鎖定最低 lamport 餘額以保證帳戶在網路上的存在。與手續費不同,這筆押金是完全可回收的。當你關閉帳戶時,這些 lamports 會退還給你。
租金計算中使用的 lamport 單位在帳戶解剖章節中定義。要在你的程式建立資料帳戶時使其免租金,請在構建建立交易前在客戶端呼叫 getMinimumBalanceForRentExemption(dataSize),然後將該 lamport 金額包含在指令中。
Solana vs. Ethereum vs. Bitcoin:帳戶模型如何比較
Solana 帳戶與 Ethereum 帳戶有什麼區別?
在 Ethereum 上,智能合約將程式碼和狀態捆綁在一個地址中。合約帳戶同時持有邏輯和它所操作的數據。在 Solana 上,程式碼和狀態始終位於不同的帳戶中:程式(邏輯)存在於可執行帳戶中,而所有狀態都存在於由這些程式所擁有的獨立資料帳戶中。這種分離是 Solana 所有不同做法的架構基礎。
Bitcoin 採取完全不同的方法,使用 UTXO(未花費交易輸出)模型。UTXO 就像支票簿中未使用的支票:每筆交易消耗現有的輸出並建立新的輸出。沒有持久的帳戶隨時間持有餘額。你的餘額是與你的金鑰相關聯的未花費輸出的總和。Bitcoin 的模型早於可編程狀態的概念,這就是為什麼它的智能合約功能僅限於 Bitcoin Script。
| 特性 | Bitcoin (UTXO 模型) | Ethereum (EVM 模型) | Solana (帳戶模型) |
|---|---|---|---|
| 狀態儲存單位 | 未支出交易輸出 (UTXO) | 帳戶 (EOA 或合約) | 帳戶 (5 種類型變體) |
| 邏輯與狀態 | 不適用 (無合約狀態) | 與合約帳戶共置 | 始終分離 (程式碼 + 資料帳戶) |
| 帳戶所有權 | UTXO 被花費,非永久擁有 | 由私鑰 (EOA) 或合約程式碼控制 | 由 System Program 或特定程式碼擁有 |
| 儲存成本機制 | 無永久儲存費用 | 每次操作收取 Gas;無押金 | 租金豁免的 lamport 押金 (可收回) |
| 平行執行 | 有限 (UTXO 集掃描) | 循序執行 (全局狀態衝突) | 高效 (預先宣告帳戶以啟用排程) |
| 智能合約模型 | 有限 (Bitcoin Script) | 全功能 (Solidity,共置狀態) | 全功能 (程式碼無狀態,狀態外部化) |
包括 Ethereum、Polygon、BNB Chain 和 Avalanche C-Chain 在內的 EVM 相容網路,都共享與 Solana 不同的帳戶模型。一個比較可以涵蓋所有這些網路。
在 Ethereum 上,使用者錢包稱為外部擁有帳戶 (EOA)。在 Solana 上,對應的概念是由金鑰對控制的系統擁有帳戶;機制相似,但 owner 欄位明確設為 System Program,而不是隱含的。
Ethereum 開發者必須捨棄的觀念
在編寫可工作的 Solana 程式之前,需要進行三項思維模型的轉變:
- 程式碼本身不持有狀態。資料帳戶持有。請勿在程式碼地址上尋找狀態。
- 在協議層面上,您的錢包擁有者不是您。您透過簽名來控制帳戶;System Program 擁有資料欄位。
- 儲存不是免費的。每個資料帳戶都需要一筆 lamport 押金以獲得租金豁免。在設計創建帳戶的程式時,請考慮此成本。
Solana 嚴格的程式碼與狀態分離是實現平行執行的先決條件,這一點在 Sealevel 與平行執行章節 中有全面探討。
帳戶模型如何驅動 Solana 的速度:Sealevel 與平行執行
Solana 的帳戶模型支援平行處理,因為每個交易在執行前都必須明確聲明其將讀取或寫入的所有帳戶的完整列表。Sealevel,Solana 的平行智能合約執行環境,利用這些預先聲明來識別觸及不同帳戶的交易,並同時執行它們。
以下是循序漸進的因果鏈:
- Solana 交易在任何執行發生之前,都會包含一個將存取的全部帳戶列表,每個帳戶都標記為唯讀或讀寫。
- Sealevel 會檢查當前 slot 中所有待處理的交易。
- 共享至少一個讀寫帳戶的交易將被排序。存取完全不同帳戶的交易將被識別為不衝突。
- 不衝突的交易將跨多個 CPU 核心同時執行。
Ethereum 的 EVM 會對共享的全局狀態順序執行交易。由於合約狀態與合約程式碼共置,確定讀取/寫入衝突需要先執行交易,這使得在執行前無法進行靜態排程。
將 Sealevel 想像成一個有多個結帳通道的超市。每筆交易就像一個購物者,帶著一份聲明的物品清單。只要兩位購物者不去拿相同的物品,他們就可以同時結帳。Solana 預先知道每筆交易需要什麼,因為帳戶模型強制要求事先聲明。
由 Solana 聯合創始人 Anatoly Yakovenko 發明的 Proof of History (PoH),提供了一個密碼學時鐘,讓驗證者無需即時協調即可就交易順序達成一致。Solana 使用 Proof of Stake (PoS) 進行共識,其中驗證者質押 SOL 來參與區塊生產,並使用 PoH 作為計時層。結合帳戶模型的預先帳戶聲明,這種架構使 Sealevel 能夠在不等待每一步網路範圍確認的情況下,同時處理不衝突的交易。
帳戶模型本身並非單純的儲存方案。它是實現平行化的先決條件,也是 Solana 吞吐量和可擴展性優勢的技術根源。
實際案例:Solana 上的代幣帳戶、NFT 和 DeFi
Solana 上的每個資產,無論是代幣餘額、NFT、DeFi 倉位,都是具有特定資料佈局的 Solana 帳戶。上述抽象架構體現在每個 Solana 用戶都會遇到的三種模式中。
SPL 代幣帳戶
SPL 代幣,Solana 對應 Ethereum 的 ERC-20 代幣,由 SPL Token Program 管理,該程式碼擁有網路上的所有代幣帳戶。您的錢包地址僅持有 SOL (lamports)。您持有的每種代幣,無論是 USDC、JTO、BONK 或其他任何代幣,都儲存在由 SPL Token Program 擁有的專用代幣帳戶中。
代幣帳戶的資料欄位儲存三項資訊:代幣鑄造地址(此帳戶持有哪種代幣)、所有權授權公鑰(您的錢包地址,授權轉帳)以及當前的代幣餘額。在 Ethereum 上,特定代幣的所有 ERC-20 餘額都儲存在代幣合約的內部映射中。在 Solana 上,每個 (用戶, 代幣) 對都需要一個專用帳戶。
這就是為什麼 Solana 錢包在您首次接收新代幣時會提示您創建一個代幣帳戶。根據當前的網路參數,此創建過程需要大約 0.00204 SOL 的租金豁免 lamport 押金,以支援標準的 165 位元組帳戶。
關聯代幣帳戶 (ATA) 是一種代幣帳戶,其地址是從您的錢包地址和代幣的鑄造地址確定性派生的 PDA。由於地址是確定性的,任何協議都可以計算您的 USDC 帳戶應在哪裡,而無需儲存查找表。ATA 是幾乎所有 Solana 錢包和協議使用的標準代幣帳戶類型。
ATA 是 PDA 派生的應用。您可以為同一個代幣擁有數個代幣帳戶,但您的 ATA 是協議預設使用的規範帳戶。
Solana 上的 NFT 由至少兩個帳戶組成:由 Token Program 擁有的 Mint Account,定義代幣供應量為剛好 1;以及由 Metaplex Token Metadata Program 擁有的 Metadata Account,儲存 NFT 的名稱、符號、圖像 URI 和版稅配置。NFT 的圖像不會儲存在鏈上;只有指向該圖像的 URI 存在於中繼資料帳戶中。代幣餘額 (1 NFT) 儲存在代幣帳戶中,與任何其他 SPL 代幣相同。
Solana 上的 DeFi 協議,包括去中心化交易所、借貸平台和流動性池,將每個用戶倉位、池狀態和協議配置儲存在專用的資料帳戶中,由程式碼擁有的 PDA 自動控制流動資金。
為什麼 Solana 帳戶模型對 SOL 很重要
注意: 本節解釋 Solana 帳戶模型如何影響 SOL 的技術用途。本文中的任何內容均不構成財務建議或投資建議。
帳戶模型不僅是開發者的考量。SOL,可在主要加密貨幣交易所取得,作為網路的原生效用代幣。帳戶模型是 SOL 在網路層被需求和使用的主要機制。
SOL 透過三種不同的機制在帳戶模型中使用:
租金豁免押金: Solana 上的每個帳戶都必須持有 lamport 餘額才能在網路上存在。每當有數百萬個代幣帳戶、程式碼資料帳戶、NFT 記錄和 DeFi 狀態帳戶活躍時,這就會產生對 SOL 的持續基本需求。這些 lamports 會鎖在帳戶中,只要帳戶保持開啟狀態,它們就會從流動性循環中移除。
交易費用: 每筆創建或修改帳戶的交易都會支付一筆以 lamports 計價的基礎費用。在當前的費用結構下,每筆費用的一部分會被銷毀,從而隨著每筆交易減少流通供應量。
驗證者質押: 驗證者質押 SOL 以參與 Solana 權益證明機制下的共識,並因驗證整個網路的帳戶狀態轉換而獲得獎勵。
隨著鏈上活動的增長,更多的 DeFi 協議、更多的 NFT 收藏品、更多的代幣發行,帳戶數量成比例增長。更多的帳戶需要更多的 SOL 鎖定在租金豁免儲值中。
鎖定在租金豁免帳戶中的 lamports 功能類似於由網路持有的保證金:不會被花掉,但只要這些帳戶保持開啟狀態就會被承諾鎖定。當帳戶關閉時,這些 lamports 會退還給其所有者。
相關 Solana 架構資源
代幣帳戶與 Solana 程式庫 (SPL) 一起理解會更容易,而併發性則在 Sealevel 平行處理指南中有所解釋。讀者可以查看 SOL 價格頁面;);評估質押相關產品的用戶可以單獨查看 Bybit 賺幣,),包括其目前的條款和風險。
常見問題:Solana 帳戶模型
Solana 帳戶和以太坊帳戶有什麼區別?
在以太坊上,智能合約在一個地址同時存儲其程式碼和狀態。在 Solana 上,程式碼和狀態始終位於不同的帳戶中:程式是無狀態的可執行帳戶,而所有狀態都位於這些程式擁有的不同數據帳戶中。這種分離使 Sealevel 能夠並行執行互不衝突的交易,這在以太坊的狀態共置模型中是不可能的。
Solana 上的租金是什麼,它是如何運作的?
Solana 上的租金是在網路上存儲數據的成本,以 lamports 計價。帳戶不必支付持續的費用,而是必須預先存入最低 lamport 餘額(即租金豁免門檻),以避免被運行時環境清除。這筆儲值是可收回的:當帳戶關閉時,lamports 會退還給所有者。對於標準的 165 字節代幣帳戶,按當前網路參數計算,儲值約為 0.00204 SOL。
什麼是 Solana 上的程式衍生地址 (PDA)?
PDA 是由程式 ID 和一組種子值確定性地推導出來的 Solana 帳戶地址。它沒有對應的私鑰,因此只有推導出它的程式才能透過跨程式調用代表它授權交易。PDA 賦予程式對帳戶的自主、去信任控制,這是 DeFi 協議、NFT 託管和關聯代幣帳戶的要求。
Solana 的帳戶模型如何實現平行處理?
每筆 Solana 交易在執行前必須聲明它將讀取或寫入的帳戶完整列表。Sealevel(Solana 的平行智能合約運行時)使用這些聲明來識別互不衝突的交易,並在多個 CPU 核心上同時執行它們。這種靜態調度之所以可行,是因為程式碼和狀態位於獨立的、明確擁有的帳戶中,使得讀寫衝突在執行開始前即可檢測到。
Solana 帳戶中的 owner(所有者)欄位是什麼?
owner 欄位是一個 32 字節的公鑰,用於識別有權修改帳戶數據欄位的程式。對於錢包帳戶,所有者是系統程式(System Program)。對於代幣帳戶,所有者是 SPL 代幣程式。owner 欄位是由 Solana 運行時強制執行的協定級概念。它不同於在某些程式管理的數據帳戶(如代幣帳戶)內部找到的「authority」(權限)欄位。
SOL 在帳戶模型中是如何使用的?
SOL 透過三種機制在帳戶模型中使用:每個帳戶必須持有 lamport 餘額 (SOL) 才能在網路上存在;創建帳戶需要 SOL 來資助租金豁免儲值;處理和存儲帳戶狀態的驗證者必須質押 SOL 才能參與共識。隨著網路的增長,對 SOL 的結構性需求也隨之增長。
什麼是 Sealevel,它與帳戶有什麼關係?
Sealevel 是 Solana 的平行智能合約運行時。它可以同時執行多筆交易,因為 Solana 的帳戶模型要求每筆交易預先聲明它將讀取或寫入哪些帳戶。Sealevel 利用這些聲明來識別互不衝突的交易,並安排它們平行運行。如果沒有帳戶模型的預先聲明,這種靜態調度將無法實現。
Solana 上的錢包帳戶和程式帳戶有什麼區別?
錢包帳戶是系統擁有的帳戶,數據欄位為空,僅持有 SOL 餘額,由金鑰對控制。程式帳戶是 executable = true 的可執行帳戶,包含編譯後的 BPF/SBF 字節碼;它由 BPF 加載器擁有,本身不持有任何狀態。五種 Solana 帳戶類型章節中的帳戶類型表並排顯示了所有五種變體。
一筆 Solana 交易可以引用多少個帳戶?
在當前主網參數下,單筆 Solana 交易最多可以引用 64 個帳戶(已透過地址查找表從最初的 32 個增加)。每個帳戶在執行開始前必須聲明為唯讀或讀寫。這種預先聲明正是 Sealevel 能夠在不先運行交易以檢測衝突的情況下安排平行執行的原因。
一個 Solana 帳戶可以持有桶多種代幣嗎?
不可以。每種 SPL 代幣類型都需要自己專用的代幣帳戶。錢包地址僅持有 SOL;每種額外的代幣都需要一個單獨的代幣帳戶,透過其權限欄位連結到錢包。這就是為什麼 Solana 錢包在收到您以前未持有過的代幣時會提示您創建一個新的代幣帳戶,以及為什麼該創建過程需要支付一小筆租金豁免的 lamport 儲值。
關鍵要點
- Solana 上的每一條鏈上狀態都存在於一個具有五個欄位的帳戶中:
lamports、data、owner、executable、rent_epoch。 - 程式是無狀態的。所有狀態都存在於由程式擁有並控制的獨立數據帳戶中。
- 帳戶需要在網路上存入一筆 lamport 儲值(租金豁免)才能存續。當帳戶關閉時,該筆儲值可收回。
- PDA 是沒有私鑰的地址,由程式 ID 和種子(seeds)確定性地推導出來,僅能由創建它們的程式透過跨程式調用(CPI)進行簽署。
- 每筆交易都會預先聲明其帳戶訪問列表。Sealevel 利用這些聲明同時執行互不衝突的交易。
下一步
- 有關實作細節,請參閱 docs.solana.com 上的 Solana 帳戶文件)。
- 開發者構建其第一個 Solana 程式時,可以從 Anchor 框架,)開始,它抽象化了大部分帳戶管理模板(程式以 Rust 或 C/C++ 編寫)。
- 對於 JavaScript/TypeScript 的實用程式碼配方和工作範例,Solana Cookbook) 提供了實踐參考資料。