0Pricing
Web3 & DApp Development Fundamentals · Leçon

Optimisation du stockage

Regroupement et emplacements

Optimisation du stockage est une leçon Web3 & DApp Development Fundamentals gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Web3 & DApp Development Fundamentals, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Web3 & DApp Development Fundamentals comprend 4 leçons au total.

Certaines parties de cette leçon n'ont pas encore été traduites et s'affichent en anglais.

Storage Slots Basics

Contract storage is a giant array of 32-byte slots, indexed from slot 0. State variables are assigned to slots in declaration order.

Every slot you write costs gas, so the fewer slots your data occupies, the cheaper your contract is to use. Understanding the slot layout is the foundation of storage optimization.

contract Layout {
    uint256 a; // slot 0
    uint256 b; // slot 1
    uint256 c; // slot 2
}

Variable Packing

The Solidity compiler packs multiple small variables into a single 32-byte slot when they fit consecutively.

A uint128 uses 16 bytes, so two of them share one slot. A bool uses 1 byte and a uint8 uses 1 byte. Packing reduces both deployment and runtime storage costs.

contract Packed {
    uint128 a; // slot 0 (bytes 0-15)
    uint128 b; // slot 0 (bytes 16-31)
    uint256 c; // slot 1
}

Declaration Order Matters

Packing only works for variables that are adjacent in declaration. A poorly ordered layout wastes slots.

In the bad example below, the uint256 forces the two uint128s into separate slots. Reordering so the small types are together lets them pack.

// BAD: 3 slots
uint128 a; // slot 0
uint256 b; // slot 1
uint128 c; // slot 2

// GOOD: 2 slots
uint128 a; // slot 0
uint128 c; // slot 0
uint256 b; // slot 1

Choosing Integer Sizes

Smaller integers only save gas when they pack. A lone uint8 in its own slot is not cheaper than a uint256, and may even cost more because of masking operations.

Rule of thumb: use uint256 by default, and only downsize when you can fit several small values into one slot.

Packing Structs

Structs follow the same packing rules. Order struct members so small types group together. A well-packed struct can cut the number of SSTORE operations dramatically.

struct Order {
    uint128 amount;  // slot 0
    uint64 timestamp;// slot 0
    uint64 id;       // slot 0
    address maker;   // slot 1
}

Constants and Immutables

Values that never change should not live in storage at all.

  • constant — inlined into bytecode at compile time, zero storage
  • immutable — set once in the constructor, stored in bytecode not storage

Both avoid expensive SLOAD operations entirely.

uint256 public constant MAX_SUPPLY = 10000;
address public immutable owner;

constructor() {
    owner = msg.sender;
}

Mappings and Dynamic Arrays

Mappings and dynamic arrays do not pack. Each entry occupies its own slot computed by hashing the key with the base slot.

You cannot pack across mapping entries, but you can pack the struct stored as a mapping value. Designing the value struct to fit in fewer slots saves gas on every write.

mapping(address => Order) public orders;
// each Order packs into 2 slots regardless of mapping

Caching Storage Reads

Reading a storage variable repeatedly inside a function pays for each access. Copy it into a local memory variable once, then use the local.

This is especially valuable inside loops, where each iteration would otherwise re-read storage.

uint256 len = items.length; // cache length once
for (uint256 i = 0; i < len; i++) {
    // process items[i]
}

Batched Writes

When updating multiple fields of a packed struct, load the struct into memory, modify it, then write it back once. The compiler can combine adjacent fields into a single SSTORE.

Writing fields one at a time may trigger multiple read-modify-write cycles on the same slot.

Order memory o = orders[id];
o.amount = newAmount;
o.timestamp = uint64(block.timestamp);
orders[id] = o; // single packed write of slot 0

Zero to Non-Zero Penalty

Initializing a slot from zero to non-zero costs 20000 gas, while updating an already non-zero slot costs only 5000 gas.

This is why some contracts pre-warm slots or use a sentinel value (like 1 instead of 0) to keep slots non-zero, trading a one-time cost for cheaper repeated updates.

// Using 1 as 'false' and 2 as 'true' keeps the slot non-zero
uint256 private locked = 1; // never goes back to 0

Layout Audit Checklist

When auditing storage for gas:

  • Group small types so they pack into shared slots
  • Use constant / immutable for fixed values
  • Cache repeated storage reads in memory
  • Batch struct writes
  • Avoid unnecessary zero to non-zero transitions

Always verify with a gas report after changes.

Quick Check

You declare a uint128, then a uint256, then another uint128. How many storage slots do they use?

Recap

You learned to optimize storage layout:

  • Storage is 32-byte slots; adjacent small types pack together
  • Declaration order determines packing
  • constant and immutable avoid storage entirely
  • Cache reads and batch struct writes
  • Mind the zero to non-zero write penalty

Next we look at optimizing loops and calldata handling.

Questions Fréquemment Posées

La leçon « Optimisation du stockage » est-elle gratuite ?

Oui — le texte complet de « Optimisation du stockage » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Web3 & DApp Development Fundamentals, passe à CoddyKit PRO. Le cours Web3 & DApp Development Fundamentals comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Optimisation du stockage » ?

Regroupement et emplacements Tu pratiques Web3 & DApp Development Fundamentals avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Web3 & DApp Development Fundamentals ?

Aucune expérience préalable n'est requise. Web3 & DApp Development Fundamentals sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Optimisation du stockage » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Web3 & DApp Development Fundamentals ?

Oui. Chaque leçon Web3 & DApp Development Fundamentals inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Modèle du coût du gas
  2. Optimisation du stockage
  3. Astuces sur les boucles et calldata
  4. Mesurer le gas
← Retour à Web3 & DApp Development Fundamentals