Solana Account Model Explained
Learn how Solana's account model stores state, manages ownership, and enables parallel transaction processing for developers and investors.
The Solana Account Model stores balances, program code, token holdings, and application state in separate accounts with explicit ownership rules. This plain-English guide explains the model for general readers before moving into fields, account types, rent exemption, and real-world examples.
Implementation details such as rent handling, account size limits, and client APIs can change. Developers should check current Solana documentation and query current network parameters before deploying.
If you come from Ethereum, Solana's account model will feel inverted at first. That reaction is the correct starting point. The mental model you built on Ethereum does not transfer cleanly, and trying to force it creates confusion at every step.
The Solana account model is the architectural system by which all on-chain state is stored in discrete storage units called accounts. Every wallet balance, program, token holding, and application state record lives in a separate account with a defined owner, a lamport balance, and explicit rules governing who can read or write to it. Nothing exists on Solana outside an account.
Think of Solana as a global filing system. Every piece of data lives in a separate file called an account. Programs are the applications that read and write those files, but a program can only modify a file it owns. The runtime enforces those ownership rules at the protocol level, with no exceptions.
This article covers the five fields inside every Solana account, the five distinct account types, how rent and rent exemption work, what Program Derived Addresses (PDAs) are and why they exist, how accounts are created and closed, and why this architecture makes Solana's parallel transaction processing possible. Solana programs are written in Rust (or C/C++), though frameworks like Anchor abstract much of the account management boilerplate. This article covers the conceptual foundation both require.
Solana Account Model: Anatomy of an Account
A Solana account is a labeled storage slot on the network that holds a balance in lamports, an arbitrary data payload, and a set of metadata fields that define who owns it and what it can do. On Solana, all data, from wallet balances to program state to token holdings, is stored in accounts.
Lamports are the smallest denomination of SOL, the network's native token. Lamports are to SOL what cents are to a dollar, except with nine decimal places of precision: 1 SOL equals 1,000,000,000 lamports. Every account carries a lamport balance that funds the account's continued existence on the network and represents transferable value.
Every Solana account contains exactly five fields:
lamports(u64): The account's balance in lamports. This field funds rent and can be transferred to other accounts.data(byte array): Raw binary storage. In executable accounts, this field holds compiled BPF/SBF bytecode. In data accounts, it holds structured application state. The maximum data field size is 10 MB at current mainnet parameters.owner(Pubkey): The 32-byte public key of the program that has exclusive write authority over this account's data field. This is the most counter-intuitive field for Ethereum developers. Your wallet address is not owned by you at the protocol level; it is owned by the System Program. Full treatment of the owner field appears in the account ownership and authority section.executable(bool): A boolean flag. When true, the data field contains program bytecode and the account functions as a program. When false, the account stores state or holds a balance.rent_epoch(u64): A legacy field that tracked the epoch at which rent was last collected. As of 2024, rent collection is deprecated in favor of the rent-exemption-by-default model. This field persists in the account struct but is no longer actively used.
Here is what a wallet account looks like as a data structure:
{
"lamports": 1000000000,
"data": [],
"owner": "11111111111111111111111111111111",
"executable": false,
"rent_epoch": 0
}
The owner field is a protocol-level concept: the program that controls write access to the data field. Authority is a separate convention stored inside program-managed data, such as the transfer authority field inside a token account. These are not the same thing; the ownership section draws this distinction precisely.
The Five Types of Solana Accounts
Solana has five distinct account types, each serving a specific architectural role determined by its owner field and its executable flag. The type is not stored as a separate field; it is inferred from who owns the account and whether it contains executable code.
System-Owned Accounts (Wallet Accounts)
A system-owned account holds a user's SOL balance and nothing else. The owner is always the System Program (11111111111111111111111111111111), the executable flag is false, and the data field is empty. When you share your wallet address with Phantom or Solflare, you are sharing the address of a system-owned account. You control it by signing transactions with your private key, but the System Program is the protocol-level owner.
Program Accounts (Executable Accounts)
A program account is an executable account containing compiled BPF/SBF bytecode. The executable flag is true, and the owner is the BPF Loader. Program accounts are stateless by design; they hold only code, never state. On Ethereum, a smart contract stores both its code and its state at one contract address. On Solana, the code lives in a program account and the state lives in separate data accounts, always stored apart.
Program accounts can store executable code, with executable = true and BPF/SBF bytecode in the data field. Non-executable data accounts have executable = false and store state instead.
Data Accounts (Program-Owned Accounts)
A data account is a non-executable account owned by a specific program that stores the program's state in its data field. The executable flag is false. The owner is whichever program created and manages the account. Your USDC token balance, a DeFi lending position, an NFT metadata record: each lives in its own dedicated data account owned by the relevant program.
Native Program Accounts
Native program accounts are built-in programs deployed at fixed addresses during network genesis. They include the System Program, the BPF Loader, the Vote Program, and the Stake Program. These are core infrastructure programs that cannot be replaced or upgraded by users. Their executable flag is true.
Sysvar Accounts
Sysvar accounts are read-only accounts pre-populated by the Solana runtime that give programs access to current network state. Think of sysvar accounts as a government bulletin board in a courthouse: publicly readable, maintained by an authoritative source, but no private party can modify them. The Clock sysvar at SysvarC1ock11111111111111111111111111111111 provides the current block timestamp and slot number. The Rent sysvar provides current rent parameters.
| Account Type | Owner | Executable | Primary Use | Example |
|---|---|---|---|---|
| System-owned (Wallet) | System Program | false | Hold SOL balance | Phantom wallet address |
| Program Account | BPF Loader | true | Store program bytecode | SPL Token Program |
| Data Account | Specific program | false | Store program state | USDC token account |
| Native Program | Runtime (genesis) | true | Core infrastructure | Vote Program |
| Sysvar Account | Solana runtime | false | Network state access | Clock sysvar |
Programs are stateless on Solana. All state lives in the data accounts they own and control. This separation of logic from state is the design decision that makes everything else in this article possible.
Programs vs. Data Accounts: The Separation of Logic and State
Solana programs are stateless. They hold no data of their own, and every piece of state they operate on lives in separate data accounts passed to the program at runtime.
Think of a Solana program as a bank's transaction processing software, and data accounts as individual customer account records. The software knows how to process deposits and withdrawals, but the actual balance lives in the customer's file, not inside the software itself. On Ethereum, the equivalent is a bank where the software and every customer's record share the same locked room, with the program and its state inseparable at a single address.
Four properties define how Solana programs interact with accounts:
- Programs process instructions and read from or write to accounts passed to them at call time. They do not hold their own state.
- Programs are immutable once deployed, unless the developer chose the upgradeable loader at deployment time.
- Only the program that owns a data account can modify that account's data field. Any user can call a program, but write access to any account is gated by ownership.
- The
executableflag enforces this distinction at the protocol level and cannot be changed after deployment.
Solana programs are stateless, but the Solana system as a whole is stateful. State persists; it lives in data accounts. The distinction is that state is always external to the program, never bundled inside it.
This separation has a performance consequence. Because every transaction must declare which accounts it will read or write before execution begins, the Sealevel runtime can identify non-overlapping transactions and run them simultaneously. The full explanation of how the account model enables parallel execution follows below.
Account Ownership and Authority: Who Controls What on Solana
The owner field in a Solana account identifies the program that has exclusive permission to modify that account's data. Only that program, at the protocol level, can write to the data field.
The owner field stores a 32-byte program public key. For wallet accounts, the owner is the System Program. For token accounts, the owner is the SPL Token Program. For custom data accounts, the owner is whichever program created them. Ownership is set at account creation and enforced by the Solana runtime on every transaction.
Consider a safety deposit box at a bank. The bank owns the box and is the only entity that can physically open and modify its contents. You hold a key that lets you instruct the bank what to do with your box, but only the bank touches the contents. On Solana, the program is the bank, and you are the account holder with a key.
The distinction between owner and authority trips up many Ethereum developers:
- Owner (protocol field): The program ID that can modify the account's
datafield. Set at account creation. Enforced by the Solana runtime, not by any program's logic. - Authority (data convention): A public key stored inside the account's
datafield by the owning program. It authorizes specific operations within that program's logic. Enforced by the program itself, not the runtime.
For a USDC token account, the Token Program is the owner and can modify the balance stored in the data field. Your wallet is the transfer authority, a public key recorded inside the data field that the Token Program checks before executing a transfer. These are different keys performing different functions. Conflating them is one of the most common errors in new Solana development.
Solana Account Rent and Rent-Exemption Explained
Rent on Solana is a storage fee, denominated in lamports, charged to accounts to compensate validators for maintaining on-chain state. Accounts that hold a minimum lamport balance, the rent-exemption threshold, are permanently exempt from rent charges and will never be purged by the runtime.
What Is Rent on Solana?
Validators must store all active account state in memory. An unbounded number of zero-balance accounts would be a denial-of-service vector against the network, so Solana requires accounts to hold a minimum lamport balance as a commitment to paying storage costs. The original rent model charged per-epoch fees proportional to data size, with accounts below the minimum subject to garbage collection. That model has been deprecated.
As of current Solana mainnet parameters (formalized in SIMD-0084), all new accounts must be rent-exempt at creation. The rent_epoch field in the account struct is now a legacy field.
How Rent Exemption Works
To make your account rent-exempt, fund it with at least the minimum lamport balance for its data size when submitting the creation transaction. At current network parameters:
- A 0-byte account (wallet): approximately 890,880 lamports (~0.00089 SOL)
- A 165-byte account (standard token account): approximately 2,039,280 lamports (~0.00204 SOL)
- A 1,024-byte data account: approximately 7,180,800 lamports (~0.00718 SOL)
These values are approximate and subject to runtime parameter changes. Calculate the exact current minimum using the Solana CLI or the getMinimumBalanceForRentExemption RPC method:
solana rent 0 # rent-exemption for a 0-byte account
solana rent 165 # rent-exemption for a standard token accountRent exemption works like a security deposit on a storage unit. You lock up a minimum lamport balance to guarantee the account's existence on the network. Unlike a fee, this deposit is fully recoverable. When you close the account, those lamports return to you.
The lamport denomination used throughout rent calculations is defined in the account anatomy section. To make a data account rent-exempt when your program creates it, call getMinimumBalanceForRentExemption(dataSize) client-side before building the creation transaction, then include that lamport amount in the instruction.
Solana vs. Ethereum vs. Bitcoin: How Account Models Compare
What Is the Difference Between Solana Accounts and Ethereum Accounts?
On Ethereum, smart contracts bundle their code and state together at one address. A contract account holds both the logic and the data it operates on. On Solana, code and state are always in separate accounts: programs (logic) live in executable accounts, and all state lives in distinct data accounts owned by those programs. This separation is the architectural foundation of everything Solana does differently.
Bitcoin takes a different approach entirely, using a UTXO (Unspent Transaction Output) model. UTXOs are like unspent checks in a checkbook: each transaction consumes existing outputs and creates new ones. There is no persistent account holding a balance over time. Your balance is the sum of unspent outputs associated with your keys. Bitcoin's model predates the concept of programmable state, which is why its smart contract capabilities are limited to Bitcoin Script.
| Feature | Bitcoin (UTXO Model) | Ethereum (EVM Model) | Solana (Account Model) |
|---|---|---|---|
| State storage unit | Unspent Transaction Output | Account (EOA or contract) | Account (5 typed variants) |
| Logic and state | Not applicable (no contract state) | Colocated in contract account | Always separated (program + data account) |
| Account ownership | UTXO is spent, not owned persistently | Controlled by private key (EOA) or contract code | Owned by System Program or specific program |
| Storage cost mechanism | No persistent storage fee | Gas per operation; no deposit | Rent-exemption lamport deposit (recoverable) |
| Parallel execution | Limited (UTXO set scanning) | Sequential (global state conflicts) | High (upfront account declarations enable scheduling) |
| Smart contract model | Limited (Bitcoin Script) | Full (Solidity, colocated state) | Full (programs stateless, state external) |
EVM-compatible networks, including Ethereum, Polygon, BNB Chain, and Avalanche C-Chain, all share the same account model that Solana departs from. One comparison covers all of them.
On Ethereum, user wallets are called Externally Owned Accounts (EOAs). On Solana, the equivalent is a system-owned account controlled by a keypair; the mechanism is similar, but the owner field is explicitly set to the System Program rather than being implicit.
What Ethereum Developers Must Unlearn
Three mental model shifts are required before writing a working Solana program:
- Programs do not hold their own state. Data accounts do. Stop looking for state at the program address.
- The owner of your wallet is not you at the protocol level. You control the account by signing; the System Program owns the data field.
- Storage is not free. Every data account requires a lamport deposit for rent exemption. Budget for this cost when designing programs that create accounts.
Solana's strict separation of code from state is the prerequisite for parallel execution, a connection explored in full in the Sealevel and parallel execution section.
How the Account Model Powers Solana's Speed: Sealevel and Parallel Execution
Solana's account model enables parallel processing because every transaction must explicitly declare the full list of accounts it will read or write before execution begins. Sealevel, Solana's parallel smart contract runtime, uses those upfront declarations to identify transactions that touch different accounts and execute them simultaneously.
Here is the causal chain, step by step:
- A Solana transaction includes a complete list of all accounts it will access, each marked read-only or read-write, before any execution occurs.
- Sealevel inspects all pending transactions in the current slot.
- Transactions that share at least one read-write account are sequenced. Transactions that access entirely different accounts are identified as non-conflicting.
- Non-conflicting transactions execute simultaneously across multiple CPU cores.
Ethereum's EVM executes transactions sequentially against a shared global state. Because contract state is colocated with contract code, determining read/write conflicts would require executing the transaction first, making static scheduling impossible before execution.
Think of Sealevel like a supermarket with many checkout lanes. Each transaction is a shopper with a declared list of items. As long as two shoppers are not reaching for the same item, they check out simultaneously. Solana knows in advance exactly what each transaction needs, because the account model forces that declaration upfront.
Proof of History (PoH), invented by Solana co-founder Anatoly Yakovenko, provides a cryptographic clock that allows validators to agree on transaction order without real-time coordination. Solana uses Proof of Stake (PoS) for consensus, where validators stake SOL to participate in block production, and PoH as a timing layer. Combined with the account model's upfront account declarations, this architecture allows Sealevel to process non-conflicting transactions in parallel without waiting for network-wide confirmation at each step.
The account model is not a storage scheme in isolation. It is the prerequisite for parallelism, and it is the technical root of Solana's throughput and scalability advantage.
Real-World Examples: Token Accounts, NFTs, and DeFi on Solana
Every asset on Solana, a token balance, an NFT, a DeFi position, is a Solana account with a specific data layout. The abstract architecture described above manifests in three patterns that every Solana user encounters.
SPL Token Accounts
SPL tokens, Solana's equivalent of Ethereum's ERC-20 tokens, are managed by the SPL Token Program, which owns all token accounts on the network. Your wallet address holds only SOL (lamports). Each token you hold, whether USDC, JTO, BONK, or any other, lives in its own dedicated token account owned by the SPL Token Program.
A token account's data field stores three pieces of information: the token mint address (which token this account holds), the owner authority public key (your wallet address, which authorizes transfers), and the current token balance. On Ethereum, all ERC-20 balances for a given token live inside the token contract's internal mapping. On Solana, each (user, token) pair requires its own dedicated account.
This is why Solana wallets prompt you to create a token account when receiving a new token for the first time. That creation requires a rent-exempt lamport deposit of approximately 0.00204 SOL for the standard 165-byte account at current network parameters.
Associated Token Accounts (ATAs)
An Associated Token Account (ATA) is a token account whose address is a PDA derived deterministically from your wallet address and the token's mint address. Because the address is deterministic, any protocol can compute where your USDC account should be without storing a lookup table. ATAs are the standard token account type used by virtually all Solana wallets and protocols.
ATAs are an application of PDA derivation. You can have multiple token accounts for the same mint, but your ATA is the canonical one that protocols default to.
NFTs on Solana
An NFT on Solana consists of at least two accounts: a Mint Account owned by the Token Program that defines the token's supply as exactly 1, and a Metadata Account owned by the Metaplex Token Metadata Program that stores the NFT's name, symbol, image URI, and royalty configuration. The NFT image is not stored on-chain; only the URI pointing to it lives in the metadata account. The token balance (1 NFT) is stored in a token account, identical to any other SPL token.
DeFi protocols on Solana, including decentralized exchanges, lending platforms, and liquidity pools, store every user position, pool state, and protocol configuration in dedicated data accounts, with program-owned PDAs controlling pooled funds autonomously.
Why the Solana Account Model Matters for SOL
Note: This section explains how the Solana account model affects SOL's technical utility. Nothing in this article constitutes financial advice or an investment recommendation.
The account model is not only a developer concern. SOL, available on major cryptocurrency exchanges, serves as the network's native utility token. The account model is the primary mechanism through which SOL is demanded and used at the network layer.
SOL gets used in the account model through three distinct mechanisms:
Rent-exemption deposits: Every account on Solana must hold a lamport balance to exist on the network. With millions of token accounts, program data accounts, NFT records, and DeFi state accounts active at any time, this creates a persistent baseline demand for SOL. These lamports are locked in accounts and removed from liquid circulation as long as the accounts remain open.
Transaction fees: Every transaction that creates or modifies accounts pays a base fee in lamports. A portion of each fee is burned under the current fee structure, reducing the circulating supply with each transaction.
Validator staking: Validators stake SOL to participate in consensus under Solana's Proof of Stake mechanism, earning rewards for validating account state transitions across the network.
As on-chain activity grows, more DeFi protocols, more NFT collections, more token launches, the number of accounts grows proportionally. More accounts require more SOL locked in rent-exemption deposits.
The lamports locked in rent-exempt accounts function like security deposits held by the network: not spent, but committed as long as those accounts remain open. When accounts close, those lamports return to their owners.
Related Solana Architecture Resources
Token accounts are easier to understand alongside the Solana Program Library, while concurrency is explained in the guide to Sealevel parallel processing. Readers can review the SOL price page; users evaluating staking-related products can separately review SOL Earn, including its current terms and risks.
FAQ: Solana Account Model
What is the difference between Solana accounts and Ethereum accounts?
On Ethereum, a smart contract stores both its code and its state at one address. On Solana, code and state are always in separate accounts: programs are stateless executable accounts, and all state lives in distinct data accounts owned by those programs. This separation enables Sealevel to execute non-conflicting transactions in parallel, which is not possible with Ethereum's colocated state model.
What is rent on Solana and how does it work?
Rent on Solana is the cost of storing data on the network, denominated in lamports. Rather than paying ongoing fees, accounts must deposit a minimum lamport balance upfront, the rent-exemption threshold, to avoid being purged by the runtime. The deposit is recoverable: when the account is closed, the lamports return to the owner. For a standard 165-byte token account, the deposit is approximately 0.00204 SOL at current network parameters.
What is a Program Derived Address (PDA) on Solana?
A PDA is a Solana account address derived deterministically from a program ID and a set of seed values. It has no corresponding private key, so only the program that derived it can authorize transactions on its behalf via Cross-Program Invocation. PDAs give programs autonomous, trustless control over accounts, a requirement for DeFi protocols, NFT escrows, and Associated Token Accounts.
How does Solana's account model enable parallel processing?
Every Solana transaction must declare the full list of accounts it will read or write before execution. Sealevel, Solana's parallel smart contract runtime, uses those declarations to identify non-conflicting transactions and execute them simultaneously across multiple CPU cores. This static scheduling is only possible because code and state live in separate, explicitly-owned accounts, making read/write conflicts detectable before execution begins.
What is the owner field in a Solana account?
The owner field is a 32-byte public key identifying the program that has authority to modify the account's data field. For wallet accounts, the owner is the System Program. For token accounts, the owner is the SPL Token Program. The owner field is a protocol-level concept enforced by the Solana runtime. It is distinct from the "authority" field found inside certain program-managed data accounts such as token accounts.
How does SOL get used in the account model?
SOL is used in the account model through three mechanisms: every account must hold a lamport balance (SOL) to exist on the network; creating accounts requires SOL to fund the rent-exemption deposit; and validators who process and store account state must stake SOL to participate in consensus. As the network grows, structural demand for SOL grows with it.
What is Sealevel and how does it relate to accounts?
Sealevel is Solana's parallel smart contract runtime. It can execute multiple transactions simultaneously because Solana's account model requires each transaction to pre-declare which accounts it will read or write. Sealevel uses those declarations to identify non-conflicting transactions and schedule them to run in parallel. Without the account model's upfront declarations, this static scheduling would be impossible.
What is the difference between a wallet account and a program account on Solana?
A wallet account is a system-owned account with an empty data field that holds only a SOL balance, controlled by a keypair. A program account is an executable account with executable = true that contains compiled BPF/SBF bytecode; it is owned by the BPF Loader and holds no state of its own. The account types table in the Five Types of Solana Accounts section shows all five variants side by side.
How many accounts can a Solana transaction reference?
A single Solana transaction can reference up to 64 accounts at current mainnet parameters, increased from the original 32 via Address Lookup Tables. Each account must be declared read-only or read-write before execution begins. This upfront declaration is what allows Sealevel to schedule parallel execution without running transactions first to detect conflicts.
Can one Solana account hold multiple tokens?
No. Each SPL token type requires its own dedicated token account. A wallet address holds only SOL; each additional token requires a separate token account linked to the wallet via its authority field. This is why Solana wallets prompt you to create a new token account when receiving a token you have not held before, and why that creation costs a small rent-exempt lamport deposit.
Key Takeaways
- Every piece of on-chain state on Solana lives in an account with five fields:
lamports,data,owner,executable,rent_epoch. - Programs are stateless. All state lives in separate data accounts that programs own and control.
- Accounts require a lamport deposit (rent exemption) to persist on the network. The deposit is recoverable when the account is closed.
- PDAs are addresses with no private key, derived deterministically from a program ID and seeds, signable only by the program that created them via CPI.
- Every transaction declares its account access list upfront. Sealevel uses those declarations to execute non-conflicting transactions simultaneously.
Next Steps
- For implementation specifics, see the Solana accounts documentation on docs.solana.com.
- Developers building their first Solana program can start with the Anchor framework, which abstracts much of the account management boilerplate (programs are written in Rust or C/C++).
- For practical code recipes and working examples in JavaScript/TypeScript, the Solana Cookbook provides hands-on reference material.