If you come from Ethereum, the biggest shift is where state lives. EVM contracts bundle code and storage. Solana separates programs (code) from accounts (data). This drives parallelism, account sizing, and security patterns.
One big account for all users - hits size limits and prevents parallelism. Fix: one account per user/entity with PDA seeds.
Expecting implicit caller context - Solana has no msg.sender global. Fix: pass signer accounts and validate with constraints.
Calling programs without declaring accounts - transactions fail at runtime. Fix: list every account the callee needs in the transaction.
Storing balances inside program binary - impossible; programs are read-only executables. Fix: use token accounts or lamport balances on data accounts.
Assuming atomic cross-program state - CPI shares the transaction's account locks. Fix: design instructions so all needed accounts are in one transaction.
Ignoring rent - accounts need lamport deposits. Fix: fund accounts to rent-exempt minimum at creation.
Stack versions: This page was written for Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, and LiteSVM 0.6.x.
Reviewed by Chris St. John·Last updated Jul 16, 2026