Compare All Storage Models
Side-by-side comparison of how Bitcoin, Ethereum, Substrate, Cosmos, Solana, Sui, Aptos, and Verkle trees store state — and how that shapes their capabilities.
Quick Reference
| Chain | Model | DB | Proof Size | Write Cost | Parallel ⚡ | History 📚 | Contracts 📜 | |
|---|---|---|---|---|---|---|---|---|
₿Bitcoin | UTXO + Merkle | LevelDB | O(log n) — binary Merkle | Low | ✅ | — | — | Deep Dive |
ΞEthereum | Merkle Patricia Trie | LevelDB / RocksDB | ~10KB (many hash nodes) | High (trie update = many node rewrites) | — | — | ✅ | Deep Dive |
●Substrate / Polkadot | Composed Key Trie | RocksDB / ParityDB | Medium (optimized trie) | Medium | — | — | ✅ | Deep Dive |
⚛Cosmos / Tendermint | IAVL Tree (Immutable | GoLevelDB / RocksDB | Medium | Medium (AVL rebalance + versioning) | — | ✅ | ✅ | Deep Dive |
◎Solana | Flat Account Store | RocksDB (accounts-db) | N/A (no state trie) | Very Low (direct account writes) | ✅ | — | ✅ | Deep Dive |
◈Sui | Object Model + | RocksDB | Small (SMT fixed depth) | Low for owned objects | ✅ | — | ✅ | Deep Dive |
⬡Aptos | Jellyfish Merkle Tree | RocksDB | Small (JMT optimized) | Low | ✅ | — | ✅ | Deep Dive |
◊Verkle Trees (Future ETH) | Verkle Tree (Polynomial | LevelDB / RocksDB | ~150 bytes (vs 10KB for MPT!) | Medium (polynomial operations) | — | — | ✅ | Deep Dive |
Detailed Comparison
Key Formation
hash(tx) → Merkle path
keccak256(address) → 64 nibbles → MPT
Twox128(pallet) ++ Twox128(storage) ++ hash(key)
module_prefix + key → IAVL AVL path
pubkey → DIRECT (no tree!)
object_id → SMT 256-bit path
keccak256(address ++ struct_tag) → JMT
address ++ suffix → 256-way Verkle path
Underlying DB
LevelDB (blocks + chainstate)
LevelDB or RocksDB
RocksDB or ParityDB
GoLevelDB or RocksDB
RocksDB (AccountsDB)
RocksDB
RocksDB
LevelDB or RocksDB (same as ETH)
Write Cost
Low — UTXO insert/delete
High — O(log n) trie nodes re-hashed per write
Medium — similar trie traversal
Medium — AVL rebalance + node creation
Very Low — direct account write
Low for owned, medium for shared objects
Low — JMT optimized sparse tree
Medium — polynomial commitment update
Proof Size
O(log₂ n) × 32 bytes — binary Merkle
~10KB per account (many MPT nodes)
Medium — similar to ETH but optimized encoding
Medium — IAVL AVL path
N/A — no global state Merkle proof!
Small — SMT with sparse compression
Small — JMT optimized proofs
~150 bytes (100× smaller than ETH MPT!)
Deep Dives
All blockchains use key-value databases (LevelDB / RocksDB) under the hood. The DIFFERENCE is entirely in how they build keys and what data structure sits on top: Bitcoin: DB["C" + txid + vout] → flat UTXO set + separate Merkle tree in block header Ethereum: DB[keccak256(RLP(trie_node))] → 16-way Patricia Trie Substrate: DB[trie_path_hash] → Trie with composed keys Cosmos: DB[iavl_node_hash] → Immutable Versioned AVL Tree Solana: DB[pubkey] → No tree at all! Direct lookup Sui: DB[object_id] → Sparse Merkle Tree Aptos: DB[jmt_node_hash] → Jellyfish Merkle Tree (sparse binary)