Este artículo fue generado por IA. Por favor, verifique la información importante de forma independiente.

Solana Account Model Explained for Developers

Crypto Wiki|Oct 9, 2026|★★★★★★4.5 (500 valoraciones)
Resumen de IA

Learn how Solana's account model separates code from state, enabling parallel execution. Complete guide to accounts, PDAs, rent, and token mechanics.

This guide presents the Solana Account Model explained for developers through account fields, ownership, Program Derived Addresses, lifecycle operations, and implementation constraints. It assumes basic familiarity with transactions and focuses on decisions that affect program correctness.

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're coming from Ethereum, Solana's account model will feel backwards at first. The mental model you built around smart contracts bundling their logic and state together doesn't apply here. This guide rebuilds that mental model from scratch, using Ethereum as your baseline so the differences land clearly.

The Solana account model is the architectural system by which all on-chain state on Solana, including wallet balances, program code, token holdings, and application data, is stored in discrete objects called accounts. Every account holds a balance in lamports (SOL's smallest denomination), arbitrary data, and metadata identifying who owns and controls it.

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. The runtime enforces who can write to which file, and no program can modify a file it doesn't own.

This article covers account anatomy, the five account types, rent mechanics, Program Derived Addresses, the account lifecycle, parallel processing via Sealevel, and SOL's utility within the account model.


Solana Account Model Explained for Developers: Account Anatomy

Before you can build or read a Solana program, you need to understand the data structure that holds all on-chain state. A Solana account is a persistent on-chain data structure containing a lamport balance, arbitrary bytes of data, and three metadata fields governing who controls it and how it behaves. On Solana, all data is stored in accounts: wallet balances, program state, token holdings, and everything else.

Every account on Solana contains exactly five fields:

Solana account model account structure showing lamports, data, owner, executable, and rent_epoch fields

{
  "lamports": 2039280,
  "data": "<raw bytes>",
  "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
  "executable": false,
  "rent_epoch": 0
}
  • lamports (u64): The account's balance in lamports, the smallest denomination of SOL, where 1 SOL equals 1,000,000,000 lamports. Think of lamports like cents to a dollar, but with nine decimal places of precision. Lamports fund the account's rent-exemption deposit and represent transferable value.

  • data (bytes): A raw byte array containing whatever the owning program stores here. For program accounts, this field holds compiled BPF/SBF bytecode. For data accounts, it holds serialized application state. The data field size determines the rent-exemption deposit required, and accounts can store up to 10 MB of data at current mainnet parameters.

  • owner (Pubkey): The 32-byte public key identifying the program with exclusive write access to this account's data field. This is the most counter-intuitive field for Ethereum developers: the owner is not the user who funded the account. It is the program authorized to modify it. Full treatment of how owner differs from authority appears in the Account Ownership and Authority section.

  • executable (bool): A boolean flag. When true, the data field contains compiled program bytecode and the runtime treats this account as a program. When false, the account stores state data and cannot be directly invoked.

  • rent_epoch (u64): A legacy field that tracked the last epoch in which rent was collected. As of SIMD-0084 on Solana mainnet, all new accounts must be rent-exempt at creation, making this field functionally deprecated. It persists in the account structure for historical compatibility.


The Five Types of Solana Accounts

Solana organizes all on-chain entities into five distinct account types, each with a defined owner, executable status, and purpose. Understanding all five is necessary to work with the account model.

Wallet Accounts (System-Owned Accounts)

Wallet accounts store only a lamport balance. The data field is empty, the executable flag is false, and the owner is the System Program. These are what your Phantom or Solflare wallet address represents on-chain. When you send SOL to a new address, the System Program creates a wallet account at that address.

Program Accounts (Executable Accounts)

Program accounts store executable BPF/SBF bytecode (Solana's compiled program format) and are the only account type with executable = true. The owner is the BPF Loader, not the developer who deployed the program. Program accounts are stateless by design: they hold code, not data. Unlike an Ethereum smart contract, which stores its state internally, a Solana program only processes instructions and reads from or writes to the accounts passed to it.

Data Accounts (Program-Owned Accounts)

Data accounts store program state, not code. The executable flag is false, and the owner is whatever program manages this account. Your USDC token balance, your staking position, and your DEX order each live in a dedicated data account owned by the relevant program. Data accounts are where all meaningful on-chain state lives in Solana's architecture.

Native Program Accounts

Native program accounts are built-in programs deployed by the Solana protocol at fixed addresses. The System Program (11111111111111111111111111111111), the BPF Loader, the Vote Program, and the Stake Program are all native program accounts, distinct from user-deployed programs.

Sysvar Accounts

Sysvar accounts are read-only system accounts pre-populated by the Solana runtime at fixed addresses. Programs can read from sysvars to access network state, such as the current block timestamp (Clock sysvar at address SysvarC1ock11111111111111111111111111111111) or current rent parameters (Rent sysvar). Think of sysvar accounts like a government bulletin board in a courthouse: publicly readable, maintained by an authoritative source, containing official information that any program can read but no private party can modify.

Account Types Summary

Account TypeOwnerExecutablePrimary UseExample
Wallet AccountSystem ProgramfalseHold SOL balanceYour Phantom wallet address
Program AccountBPF LoadertrueStore program bytecodeSPL Token Program
Data AccountSpecific programfalseStore program stateYour USDC token account
Native ProgramBuilt-intrueCore protocol operationsSystem Program, Vote Program
Sysvar AccountRuntimefalseProvide network state to programsClock sysvar, Rent sysvar

Programs hold only code. All state lives in separate data accounts owned by those programs. This architectural decision is what makes parallel transaction execution possible, covered in detail in the How the Account Model Powers Solana's Speed section.


Programs vs. Data Accounts: Why Solana Separates Code from State

Solana's code/state separation is the design decision that most confuses Ethereum developers, and understanding why it exists matters more than memorizing how it works. On Ethereum, a smart contract bundles its logic and state at one address, so every call to the contract touches both. Solana takes the opposite approach: programs (the Solana equivalent of smart contracts) are stateless, and state lives in separate data accounts that programs read from and write to.

A program on Solana is like a bank's transaction processing software. The software knows how to process deposits and withdrawals, but the actual balance lives in each customer's file, not inside the software itself. Your data account is the customer file. The program is the processing logic. They are always separate.

This separation produces two concrete benefits. First, a single program can manage an unlimited number of data accounts. The SPL Token Program, for example, owns every token account on Solana: millions of data accounts, one program. Second, programs are immutable once deployed (unless built with an upgradeable loader), so their bytecode cannot be secretly altered after deployment.

Solana programs are stateless, but the system as a whole is stateful. State doesn't disappear; it lives in explicitly created, explicitly owned data accounts. This design is also what enables Sealevel's parallel execution capability, covered later.


Account Ownership and Authority: Who Can Write to What

Two separate mechanisms control who can access a Solana account, and conflating them causes bugs. The owner field and the authority convention serve different purposes, and understanding both is a prerequisite for writing correct programs.

The owner field identifies the program with exclusive write access to an account's data field. No other program can modify that data, regardless of who calls it. The authority is a separate concept: a public key recorded inside program-specific account data that authorizes particular user operations, like transferring tokens.

The safety deposit box analogy clarifies the distinction. The bank owns the box and is the only party that can physically touch its contents. You hold the key that instructs the bank what to do: deposit, withdraw, or transfer. The bank (program) is the owner. You (your wallet public key) are the authority.

Token accounts make this concrete. Your USDC token account has two distinct controlling parties:

  • Owner: The SPL Token Program. Only this program can modify the account's data field.
  • Transfer authority: Your wallet public key. This key is stored inside the data field and tells the Token Program who is authorized to initiate transfers.

When you send USDC, your wallet signs a transaction calling the SPL Token Program. The program checks that your public key matches the transfer authority stored in the account data. If it matches, the program writes the updated balance as the account's owner. You never directly write to the account.


Solana Account Rent and Rent-Exemption Explained

Validators must store all active account state in memory. Without a cost mechanism, an attacker could create millions of zero-balance accounts and consume validator storage at no cost. Solana's rent mechanism addresses this by requiring accounts to maintain a minimum lamport balance proportional to the data they store.

What Is Rent and Why Does It Exist?

Rent on Solana is a storage fee charged in lamports to persist account data on the network. Accounts that deposit a minimum lamport balance upfront, meeting the rent-exemption threshold, are permanently exempt from rent charges and will never be purged by the runtime.

The original model charged rent each epoch from any account below the exemption threshold. The current model, formalized in SIMD-0084, requires all new accounts to be rent-exempt at creation. The rent_epoch field is now a legacy artifact. All newly created accounts have this field set to the maximum value, indicating permanent exemption.

How Rent-Exemption Works

An account becomes rent-exempt by depositing a minimum lamport balance at or above the exemption threshold for its data size. The threshold scales with the account's data field size:

Account SizeApprox. Minimum BalanceNotes
0 bytes (wallet)~890,880 lamports (~0.00089 SOL)Verify with solana rent 0
165 bytes (token account)~2,039,280 lamports (~0.00204 SOL)Standard SPL token account
1 KB data account~7,161,600 lamports (~0.00716 SOL)Scales with data size

Verify current values with solana rent <BYTES> or the getMinimumBalanceForRentExemption RPC method. Values are approximate and subject to change with protocol upgrades.

solana rent <BYTES>

To make an account rent-exempt, fund it with at least the minimum lamport balance for its declared data size when creating it. The lamports field defined in account anatomy covers the lamport balance structure in detail.

The rent-exemption deposit is recoverable capital, not a fee. When your program closes an account it no longer needs, it transfers the lamport balance back to a recipient address. Think of it like a security deposit on a storage unit: you lock up a minimum balance to guarantee the account's existence, and you get that deposit back when you close the account.


Program Derived Addresses (PDAs): Accounts Without Private Keys

A Program Derived Address (PDA) is a Solana account address derived deterministically from a program ID and seed values. It has no private key, so only the program that derived it can authorize transactions on its behalf.

Why PDAs Exist

Programs on Solana cannot hold private keys. A keypair-based account is controlled by whoever holds the corresponding private key, which means a program cannot autonomously sign transactions. But programs need to own and control accounts without human intervention for trustless protocol logic to work. A DeFi liquidity pool cannot have a human holding its private key.

PDAs solve this problem. Think of a PDA like a physical lockbox built specifically for one program: nobody else can produce the correct combination, and the lockbox opens only through the program that created it. No private key exists, so no private key can be stolen or leaked.

How PDA Derivation Works

PDA derivation feeds a program ID and a set of seeds into a hash function. The seeds can be arbitrary bytes, commonly user public keys, string constants, or numeric identifiers. The resulting hash is checked against the Ed25519 elliptic curve. If the hash falls on the curve, it could have a corresponding private key, which defeats the purpose. A bump seed (a single byte, starting at 255 and decrementing) is appended and the hash recomputed until the result lands off-curve, meaning no private key can correspond to this address.

Because derivation is deterministic, anyone who knows the program ID and seeds can compute the same PDA address without a lookup table. The program signs transactions involving its PDAs via Cross-Program Invocation (CPI), a mechanism that lets programs authorize actions on accounts they derived.

For context on the programs that own data accounts underlying this control model, see Programs vs. Data Accounts.

Real-World Uses of PDAs

PDAs appear in three of the most common on-chain operations on Solana:

  1. DeFi liquidity pools: An AMM program holds pooled funds in token accounts that are PDAs derived from the pool's configuration. No human holds the private key to the pool.

  2. NFT escrow: During an NFT auction, the NFT transfers to a PDA-controlled escrow account. The auction program controls release without a trusted intermediary.

  3. Associated Token Accounts: Your USDC account address is a PDA derived from your wallet public key and the USDC mint address. This makes your token account address predictable and findable by any program or wallet without a separate lookup.

PDAKeypair Account
Private keyNoneYes
Address derivationDeterministic (program ID + seeds)Random
Who authorizes transactionsThe program (via CPI)The key holder
Address predictabilityYes, given inputsNo

Ethereum developers will recognize a partial analogy: PDAs resemble CREATE2-derived contract addresses, where the address is deterministic given a salt and bytecode hash. The control model differs because Solana programs are stateless, but the predictability property is the same.


The Solana Account Lifecycle: From Creation to Closure

Every Solana account is created by the System Program, the only native program authorized to allocate account space and assign ownership. The System Program's address is 11111111111111111111111111111111 (32 ones). No other program can create new accounts.

The lifecycle of a Solana account runs through four stages:

  1. Request: A transaction submits a CreateAccount instruction to the System Program, specifying the account's public key address, the number of bytes to allocate for the data field, and the program that will own the new account.

  2. Fund: The transaction must include enough lamports to meet the rent-exemption threshold for the declared data size. These lamports transfer from the payer to the new account as part of the same transaction. No lamports means no account.

  3. Assign: The System Program sets the new account's owner field to the designated program's public key. From this point, only that program can write to the account's data field.

  4. Close: When your program no longer needs an account, it can zero out the account's data and transfer the lamport balance to a recipient address. The runtime garbage-collects the empty account. This recovers the rent-exemption deposit, an important consideration for programs that create many temporary accounts.

Transaction account limits: A single Solana transaction can reference up to 64 accounts at current network parameters (increased from 32 in earlier versions via Address Lookup Tables). Each account must be declared upfront as read-only or read-write before execution begins. This upfront declaration is the foundation of Sealevel's parallel execution model.


How the Account Model Powers Solana's Speed: Sealevel and Parallel Execution

Solana's account model enables parallel processing because every transaction must declare the full list of accounts it will read or write before execution begins. Sealevel, Solana's parallel smart contract runtime, uses those declarations to identify non-overlapping transactions and run them simultaneously on separate CPU cores.

The causal chain works like this:

  1. Each transaction submitted to the network includes a complete list of all accounts it will touch, labeled as read-only or read-write.
  2. Sealevel inspects all pending transactions and maps their account access lists.
  3. Transactions touching different accounts, with non-overlapping access sets, are grouped for parallel execution.
  4. Those grouped transactions execute simultaneously across multiple CPU cores, rather than waiting in a sequential queue.

Ethereum's EVM executes transactions sequentially against a shared global state. Because contract state and code live together, the EVM cannot determine read/write conflicts without running the code. That sequential dependency is the architectural constraint Solana's design avoids.

The supermarket analogy makes this concrete. Think of Sealevel like a supermarket with many checkout lanes. Each transaction is a shopper with a declared list of items. Shoppers who are not reaching for the same items check out simultaneously. Solana knows in advance who needs what, because the account model forces every transaction to declare it upfront.

Proof of History (PoH), invented by Solana co-founder Anatoly Yakovenko, operates alongside this system as a cryptographic clock. PoH creates a verifiable sequence of timestamps that allows validators to agree on transaction ordering without real-time coordination. Solana uses Proof of Stake (PoS) for consensus, where validators stake SOL to participate in block production, and PoH for clock synchronization. Together, these mechanisms let Sealevel schedule parallel execution with confidence in the transaction ordering.

The account model is not a storage convention. It is a parallelism prerequisite. Its scalability implications extend directly to how SOL functions as the network's native token, covered in the next section.


For deeper field-level reference, use the technical account model reference; token-account behavior is covered in the Solana Program Library guide. Mainnet developers may consult the SOL price page for market context and the SOL/USDT spot market when access to mainnet SOL is relevant. Test-network tokens have no monetary value.


FAQ: Solana Account Model Explained for Developers

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 state lives in distinct data accounts owned by those programs. This separation lets Sealevel identify non-conflicting transactions and execute them in parallel, something Ethereum's sequential execution model cannot do.

What is rent on Solana and how does it work?

Rent on Solana is a storage cost mechanism. Rather than paying an ongoing fee, accounts deposit a minimum lamport balance upfront (the rent-exemption threshold) to persist indefinitely without being purged. The deposit is recoverable when the account is closed. For a standard 165-byte token account, the deposit is approximately 0.00204 SOL at current network parameters.

What is a Program Derived Address on Solana?

A Program Derived Address (PDA) is a Solana account address derived deterministically from a program ID and 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 liquidity pools, 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 begins. Sealevel, Solana's parallel smart contract runtime, uses these declarations to identify transactions with non-overlapping account access and executes them simultaneously on separate CPU cores. Because code and state are always in separate accounts, Sealevel can perform this conflict analysis statically, without executing the transactions first.

What is the owner field in a Solana account?

The owner field is a 32-byte public key identifying the program that has exclusive write access to 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 distinct from "authority," which is a user-defined field stored inside some programs' account data to identify who can call specific instructions.

How does SOL get used in the account model?

SOL is used in the account model in three ways: every account must hold a lamport balance for its rent-exemption deposit; creating data accounts requires SOL to fund that deposit; and validators stake SOL to participate in consensus and earn rewards for maintaining account state. These three mechanisms create structural demand for SOL at the network layer.

What is Sealevel and how does it relate to accounts?

Sealevel is Solana's parallel smart contract runtime, the engine that executes programs. It relates to accounts through the upfront declaration requirement: every transaction must list its account dependencies before execution, allowing Sealevel to group non-conflicting transactions for simultaneous execution. The account model's separation of program logic from state is what makes this static analysis possible.

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 lamport balance. A program account is owned by the BPF Loader, has executable = true, and stores compiled program bytecode. Wallet accounts represent user balances; program accounts represent deployable code. Neither holds application state. State lives in data accounts.

How many accounts can a Solana transaction have?

A single Solana transaction can reference up to 64 accounts at current network parameters, increased from 32 in earlier versions through the introduction of Address Lookup Tables. Each account must be declared upfront as read-only or read-write. This limit and the upfront declaration requirement together are what enable Sealevel's parallel execution model.

Can Solana accounts store executable code?

Yes. Program accounts on Solana store executable BPF/SBF bytecode and have executable = true. These accounts are the on-chain equivalent of smart contracts. All other account types (wallet accounts, data accounts, native program accounts when not containing bytecode, and sysvar accounts) have executable = false and store data, not runnable code.


Key Takeaways and Next Steps

Key Takeaways:

  • Every piece of on-chain state on Solana lives in an account with five fields: lamports, data, owner, executable, and rent_epoch.
  • Solana has five account types: wallet, program, data, native program, and sysvar. All five must be understood to work with the account model.
  • Programs are stateless. They hold only code. State lives in separate data accounts owned by programs.
  • Rent-exemption deposits lock lamports in accounts; they are recoverable when accounts close.
  • Program Derived Addresses give programs autonomous, key-free control over accounts.
  • The account model enables Sealevel's parallel execution by requiring every transaction to declare its account dependencies upfront.

Next Steps for Developers

Solana programs are written in Rust (or C/C++), though the Anchor framework provides higher-level abstractions over account management boilerplate. To proceed from this conceptual foundation to implementation:

  • Read the official Solana accounts documentation for precise field specifications and runtime behavior details.
  • Work through the Solana Cookbook for practical code examples covering account creation, ownership mechanics, and PDA derivation workflows.
  • Explore the Anchor framework for a typed, macro-driven approach to account validation that abstracts much of the manual boilerplate.

The account model is the prerequisite. Once it clicks, every other Solana concept builds directly on top of it: instructions, transactions, cross-program invocations, and full program architecture.

  • What Is NEAR Token Account Model Explained
  • NEAR Account Model Explained: Keys and Storage