---
title: Accounts
description:
  Solana accounts are the fundamental data unit for storing state on the
  network. Account structure, addresses, types, rent, ownership, and
  modification rules.
url: /docs/core/accounts
type: conceptual
prerequisites: []
related:
  - /docs/core/accounts/account-structure
  - /docs/core/accounts/account-types
  - /docs/core/programs
  - /docs/core/transactions
---

An account is Solana's fundamental data unit for storing state. The network
stores all state in a key-value store where each key is a 32-byte address and
each value is an account.

![Diagram of 3 accounts and their addresses. Includes the account structure definition.](/assets/docs/core/accounts/accounts.png)

<Cards>
  <Card title="Account Structure" href="/docs/core/accounts/account-structure">
    Account addresses (public key, PDA), the five fields every account contains,
    rent state machine, with interactive code walkthrough.
  </Card>
  <Card title="Account Types" href="/docs/core/accounts/account-types">
    Program accounts (executable code), data accounts (program state), system
    accounts, and sysvars (cluster-wide state).
  </Card>
  <Card
    title="Modification Rules"
    href="/docs/core/accounts/modification-rules"
  >
    Runtime-enforced rules for lamports, data, owner, executable flag, and
    borrows.
  </Card>
  <Card title="Account Runtime" href="/docs/core/accounts/account-runtime">
    Account loading validation, BPF serialization format, and deserialization.
  </Card>
</Cards>

## Key facts

- **Structure**: Every account has the same
  [five fields](/docs/core/accounts/account-structure): lamports, data, owner,
  executable, rent_epoch.
- **Address**: Each account is identified by a unique 32-byte address (either an
  Ed25519 public key or a [PDA](/docs/core/pda)).
- **Ownership**: Only the account's owner program can modify its data or debit
  lamports. Any program can credit lamports to any writable account.
- **Rent**: Every account must hold a minimum lamport balance proportional to
  its data size to remain onchain.

## Limits

| Limit                           | Value                                                       | Source                                                                                                                        |
| ------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| Max account data size           | 10 MiB (10,485,760 bytes)                                   | [`MAX_ACCOUNT_DATA_LEN`](https://github.com/anza-xyz/agave/blob/v3.1.8/transaction-context/src/lib.rs#L34)                    |
| Max data growth per instruction | 10 KiB (10,240 bytes)                                       | [`MAX_PERMITTED_DATA_INCREASE`](https://github.com/anza-xyz/solana-sdk/blob/clock%40v2.2.3/account-info/src/lib.rs#L17)       |
| Max data growth per transaction | 20 MiB (20,971,520 bytes)                                   | [`MAX_ACCOUNT_DATA_GROWTH_PER_TRANSACTION`](https://github.com/anza-xyz/agave/blob/v3.1.8/transaction-context/src/lib.rs#L38) |
| Account base storage overhead   | 64 bytes per account                                        | [`TRANSACTION_ACCOUNT_BASE_SIZE`](https://github.com/anza-xyz/agave/blob/v3.1.8/svm/src/account_loader.rs#L45)                |
| Address size                    | 32 bytes (Ed25519 public key)                               | --                                                                                                                            |
| Rent-exempt minimum (formula)   | (account_size + 128) \* 3,480 lamports/byte-year \* 2 years | [`minimum_balance()`](https://github.com/anza-xyz/solana-sdk/blob/clock%40v2.2.3/rent/src/lib.rs#L93)                         |
