🧩 Advanced Storage: Mappings, Arrays & Structs
Master complex data structures and their storage layout
Your Progress
0 / 5 completed🔬 Advanced Storage Patterns
For upgradeable contracts and complex systems, advanced storage patterns are essential to avoid collisions, enable modular upgrades, and maintain flexibility as your contract evolves.
🎯 Interactive: Pattern Comparison Tool
Explore 4 advanced storage patterns for upgradeable contracts:
Proxy Pattern
MediumSeparates logic and storage—proxy holds state, implementation holds logic
- • Upgradeable logic
- • Preserve state across upgrades
- • Single proxy, multiple implementations
- • Storage collision risk
- • Initialization complexity
- • delegatecall gas overhead
// Proxy stores all state
contract Proxy {
address public implementation;
mapping(address => uint) public balances;
fallback() external {
address impl = implementation;
assembly {
calldatacopy(0, 0, calldatasize())
let result := delegatecall(
gas(), impl, 0,
calldatasize(), 0, 0
)
returndatacopy(0, 0, returndatasize())
switch result
case 0 { revert(0, returndatasize()) }
default { return(0, returndatasize()) }
}
}
}Storage Collision Prevention
The biggest risk in upgradeable contracts is storage collision—when V2 accidentally overwrites V1's data. Here's how each pattern handles it:
Implementation can't have its own storage—must inherit from proxy's storage structure.
Uses keccak256 hash to place storage at pseudo-random slots, avoiding sequential collision.
bytes32 slot = keccak256("my.unique.namespace");Storage is completely separate—logic contracts can be replaced without touching storage.
All facets share diamond's storage—must coordinate slot usage across all modules.
Choosing the Right Pattern
| Pattern | Best For | Complexity | Gas Cost |
|---|---|---|---|
| Proxy (UUPS/Transparent) | Most upgradeable contracts | Medium | Good |
| Unstructured Storage | Modern proxies (with above) | Medium | Excellent |
| Diamond (EIP-2535) | Large, modular systems | High | Fair |
| Eternal Storage | Simple upgrades, low traffic | Low | Poor |
Real-World Examples
⚠️ Storage Upgrade Best Practices
uint[50] __gap;