DEV Community

Cover image for The Solana Account Model Explained: Everything is an Account
Lymah
Lymah Subscriber

Posted on

The Solana Account Model Explained: Everything is an Account

The Aha Moment

During Epoch 1 of #100DaysOfSolana, I hit a wall. I'd built wallets, sent transactions, decoded data — but nothing clicked until I stopped thinking about Solana like traditional programming and started thinking about it as a system where everything is an account.

When I started learning Solana, I kept hearing this phrase: "everything is an account." It sounded like philosophy. But then it hit me: there are literally no users, no wallets, no programs in Solana — only accounts. Your wallet is an account. The Token Program is an account. The system clock is an account. Even your SOL balance is just data in an account.

This single concept unlocks everything else on Solana.

What Is an Account? The Five-Field Structure

Every account on Solana has exactly five fields:

{
  lamports: 5000000,           // Balance (1 SOL = 1 billion lamports)
  data: [0x00, 0x01, ...],     // Binary data (up to 10 MB)
  owner: "11111111111...",     // Program that can modify this account
  executable: false,            // Is this a program (true) or data (false)?
  rent_epoch: 18446744073709... // Rent exemption status
}
Enter fullscreen mode Exit fullscreen mode

That's it. Five fields. Everything on Solana fits into this model.
System Program account showing all 5 fields in Solana Explorer This is a real account (System Program) showing all five fields. You'll see this exact structure for every account on Solana.

Understanding Each Field

lamports - The account's balance in the smallest unit. Accounts must hold enough SOL (lamports) to be "rent-exempt" (roughly $0.02-$2 depending on data size). This prevents network spam. I built a rent calculator and went deeper on storage costs in my Week 2 post if you want the full breakdown.

data - Where the actual information lives. For a wallet, this is empty (0 bytes). For a program, this is bytecode. For a token mint, this is token metadata (supply, decimals, authorities). For a sysvar, this is cluster state.

owner - The program that has permission to modify this account's data. Your wallet is owned by the System Program (11111111111...), so only the System Program can transfer your SOL. A token mint is owned by the Token Program, so only it can mint new tokens.

executable - A boolean flag. If true, this account contains program code and can execute instructions. If false, it's just a data account.

rent_epoch - A legacy field from when Solana charged rent monthly. Now mostly ignored, but technically tracks when rent was last collected.

Three Account Types: Wallets, Programs, and Sysvars

Let me show you how the same five-field structure represents completely different things:
Comparison view showing Wallet vs Program vs SysvarSame five fields, three completely different meanings. This is the power of the account model.

Type 1: Your Wallet (A Data Account)

Owner:      11111111111111111111111111111111  ← System Program
Executable: false                              ← Stores data, not code
Data:       (empty, 0 bytes)
Lamports:   5000000000                         ← Your SOL balance
Rent Epoch: 18446744073709551615 (max)         ← Rent exempt
Enter fullscreen mode Exit fullscreen mode

A typical wallet account - System Program owned, no dataThis is what your wallet looks like on-chain: owned by System Program, no data, just lamports.

Your wallet is a System Program-owned account with empty data. The "balance" is just the lamports field. That's it.

Your wallet is a System Program-owned account with empty data. The "balance" is just the lamports field. That's it.

Key insight: You don't own your wallet — the System Program does. The System Program enforces the rules that only the private key owner can transfer SOL. Your keypair is the authorization mechanism, not the owner — if this distinction feels fuzzy, I covered how Solana identity and keypairs actually work in my Week 1 post. This is what "custody" means on Solana: the program is the enforcer.

Type 2: The Token Program (An Executable Account)

Owner:      BPFLoaderUpgradeab1e...          ← BPF Loader (manages programs)
Executable: true                              ← Contains program code
Data:       (36 bytes of bytecode)            ← The actual program logic
Lamports:   ~11 SOL                           ← Program's retained SOL
Rent Epoch: 18446744073709551615              ← Rent exempt
Enter fullscreen mode Exit fullscreen mode

Address: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Token Program showing executable=true, much larger balance👆 Notice: executable=true, balance is 11+ SOL, owned by BPF Loader. This is a program account.

The Token Program is an executable account. Its data field contains the program bytecode that defines how tokens work. When you interact with a token (mint, transfer, burn), you're actually calling instructions in this program.

Key insight: Programs are just data stored in accounts. The Solana runtime reads the executable: true flag and knows to execute that account's code. This is why upgrading programs is so clean on Solana — you're just swapping the data in an account.

Type 3: Clock Sysvar (A System Data Account)

Owner: Sysvar1111111111111... ← Sysvar program
Executable: false ← Stores data, not code
Data: (40 bytes of binary time data) ← Current slot, epoch, timestamp
Lamports: ~1 SOL ← Enough for rent exemption
Rent Epoch: 18446744073709551615 ← Rent exempt
Address: SysvarC1ock11111111111111111111111111111111

Clock Sysvar showing executable=false, owned by Sysvar programThis sysvar is readable by every program but not executable. It contains cluster time state.

Why This Matters: Three Real-World Scenarios

The Clock sysvar is a read-only data account containing cluster-wide state. Every program can read the current slot, epoch, and Unix timestamp from this account. It's like /proc/uptime in Linux — a public system file anyone can read.

Key insight: Sysvars are how programs access external state without making RPC calls. The Solana runtime updates them every slot.

Scenario 1: Sending SOL to a Friend

When you send 1 SOL to a friend:

  1. Your wallet account (owned by System Program) loses 1 billion lamports
  2. Your friend's account gains 1 billion lamports
  3. The System Program enforces that only your keypair can authorize this

Both accounts follow the same five-field structure. The only difference is the keypair that can sign for them.

Scenario 2: Creating a Token

When someone creates a USDC token:

  1. They invoke the Token Program (an executable account)
  2. The Token Program creates a new account for the token mint
  3. That new account has the Token Program as its owner
  4. The Token Program stores token metadata in the mint account's data field

Same five-field structure. Different owner (Token Program instead of System Program).

Scenario 3: Reading the Network Time

Inside a program, you might read the current slot:

const clockSysvar = await connection.getAccountInfo(CLOCK_ADDRESS);
const decodedClock = parseClockData(clockSysvar.data);
console.log(`Current slot: ${decodedClock.slot}`);
Enter fullscreen mode Exit fullscreen mode

You're just reading the data field of an account. Solana's runtime automatically updates that account every slot.

The Permission Model: Who Can Modify What?

Here's the crucial rule: Only the account's owner program can modify its data.

  • If owner === SystemProgram, only the System Program can change this account
  • If owner === TokenProgram, only the Token Program can change this account
  • If owner === YourProgram, only your program can change this account

This is Solana's security model. You can't hack someone else's account because you don't own it. You can't create tokens because you don't own the token program. You can only modify accounts your program owns.

Exception: Anyone can send SOL to any wallet. The System Program allows this because receiving SOL doesn't modify the wallet's data field — it only changes lamports. Specifically, the System Program says: "Any keypair can increase another account's lamports, but only the keypair owning an account can decrease it."

That's a Solana transaction at its core — accounts changing state, programs enforcing the rules. If you want to understand how that transaction lifecycle actually works and how it differs from a REST API call, I went deep on it in my Week 3 post.

The Account Model in Action: Building an Explorer

To prove this, I built a simple account explorer that queries any address and shows all five fields:

// solana-account-explorer/explorer.mjs
import { createSolanaRpc, address } from "@solana/kit";

const rpc = createSolanaRpc("https://api.devnet.solana.com");

async function inspectAccount(addressString) {
  const acct = address(addressString);

  const [balance, accountInfo] = await Promise.all([
    rpc.getBalance(acct).send(),
    rpc.getAccountInfo(acct).send()
  ]);

  console.log(`Address: ${addressString}`);
  console.log(`Lamports (Balance): ${Number(balance.value)}`);
  console.log(`Owner: ${accountInfo.value?.owner}`);
  console.log(`Executable: ${accountInfo.value?.executable}`);
  console.log(`Data Length: ${accountInfo.value?.data.length} bytes`);
  console.log(`Rent Epoch: ${accountInfo.value?.rentEpoch}`);
}

// Try it:
// node explorer.mjs 11111111111111111111111111111111
Enter fullscreen mode Exit fullscreen mode

Account explorer terminal output showing all 5 fields for 3 different accounts
Account explorer terminal output showing all 5 fields for 3 different accounts
Account explorer terminal output showing all 5 fields for 3 different accounts
This tool runs the exact same query on System Program, Token Program, and a wallet. Same structure, different values.

Run this on any Solana address, and you'll see those five fields. Every account. Always the same structure.

Common Misconceptions

❌ "Wallets are real objects"

✅ Wallets are just accounts with the System Program as owner and empty data. The "wallet" concept is a UI abstraction.

❌ "I own my wallet"

✅ The System Program owns your wallet. Your keypair is the authorization mechanism, not the owner. This is actually safer — you can't accidentally delete your wallet.

❌ "Programs can access any account"

✅ Programs can read any account (it's all public data), but they can only modify accounts they own. This is enforced by the Solana runtime.

❌ "The blockchain stores all your data"

✅ The blockchain stores account states. Your actual data lives in those accounts. Different mental model!

Everything Else Is Just Accounts (Seriously)

Once the five-field structure clicks, everything else becomes obvious:

  • Transactions - Signed instructions that modify accounts. A transaction is just a request to change the lamports or data field.
  • Programs - Executable accounts that enforce the rules for modification. They're the gatekeepers.
  • Tokens - Just accounts owned by the Token Program. The token's supply, decimals, authorities? All in the account's data field.
  • NFTs - Same structure. Metadata lives in the account's data. The blockchain isn't storing the image; it's storing a pointer in an account.
  • Wallets - Accounts owned by System Program with no data.
  • DeFi - Programs managing accounts representing liquidity pools, positions, swaps. Every protocol is just accounts + programs enforcing rules.
  • AMMs - Programs that maintain accounts for token reserves and user positions.

All of it. Accounts and the programs that manage them.

What to Do Next

  1. Explore it yourself

  2. Try the inspector

   solana account 11111111111111111111111111111111
Enter fullscreen mode Exit fullscreen mode

This shows you a real System Program account.

  1. Build your own reader
   const connection = new Connection("https://api.devnet.solana.com");
   const accountInfo = await connection.getAccountInfo(publicKey);
   // Now you have: lamports, data, owner, executable, rentEpoch
Enter fullscreen mode Exit fullscreen mode
  1. Understand ownership When building a program, remember: you own accounts your program creates. You can modify them. Users' wallets you can't modify (only System Program can). This shapes how you architect everything.

## The Takeaway

The Solana Account Model is deceptively simple: five fields, one permission rule. That's the entire foundation.

Everything on Solana — wallets, programs, tokens, NFTs, liquidity pools, governance, system clocks, rent — fits perfectly into this structure. There's no special case for "smart contracts" or "user accounts." No complexity hidden in different data structures. Just five fields, repeated across millions of accounts, with one rule controlling who can modify them.

Master this concept, and you've unlocked the mental model for understanding not just Solana, but why Solana is architecturally different from every other blockchain.

Next time someone says "everything is an account," you'll understand exactly why they're right — and why that matters.


Series: The Account Model Foundation

  • Part 1: The Account Model Explained (this post)
  • Part 2: Building an Account Explorer (coming May 17)
  • Part 3: Decoding Account Data (coming May 19)
  • Part 4: System Program Deep Dive (coming May 21)

What aspect of the account model confused you most? Let me know in the comments — I'll update this post with clarifications!

Part of the 100 Days of Solana Epoch 1 challenge.

Top comments (0)