Solidity : choisir le stockage ou la mémoire (storage vs memory)

0

Il existe deux possibilités pour stocker des variables dans Solidity, à savoir storage (stockage) et memory (mémoire). Les variables « storage » sont stockées définitivement dans la blockchain, alors que les variables « memory » sont temporaires et effacées entre les appels externes de fonction. En résumé, lorsqu’on appelle un contrat, la variable mémoire ne sera utilisable que pendant l’exécution de cet appel, alors qu’une variable storage pourra être retrouvée et utilisée au prochain appel.

Il savoir que chaque smart contract possède son propre espace de stockage des données, et c’est une particularité intéressante d’un smart contract soldity, car c’est à la fois un langage de programmation et un espace de stockage, tout cela dans le même code.

Bien entendu, le storage coûte plus cher en gas à l’utilisation que le memory, car il ajoute du travail supplémentaire pour l’ensemble du réseau, contrairement aux variables mémoires qui sont effacées après chaque utilisation.

Gestion par défaut

Solidity gère par défaut le mode de stockage de la façon suivante :
– Les variables d’états sont stockées par défaut en storage , et donc resteront indéfiniment dans la blockchain
– Les paramètres de fonction sont stockés par défaut en memory, et disparaîtront après un appel de la fonction

Mise à jour décembre 2018 : Depuis la version 5.0 de Solidity, l’emplacement explicite des données pour toutes les variables est obligatoire. Une fonction qui transmet un string peut par exemple être définie ainsi :

function definirMessage(string memory _nouveaumessage) 

Aussi, les variables déclarées à l’intérieur des fonctions seront par défaut en memory.

Cependant, il peut arriver que vous souhaitiez forcer l’utilisation d’un mode de stockage, c’est le cas par exemple si vous une utilisez un struct à l’intérieur d’une fonction, ou solidity renverra un warning si vous ne définissez par le mode de stockage.

Imaginons un struct basique :


struct Personne{
    string Nom;
    uint Age;
    address Adresse;
}

Personne[] personnes;

Il faudra alors dans une fonction l’utiliser ainsi :

Personne storage unePersonne = personnes("Michel",34,"0xca35...");

Alors « unePersonne » sera un pointeur vers « personnes ».

Il faudra donc prendre en compte dans la construction de votre contrat le fonctionnement par défaut pour éviter de devoir modifier le mode de stockage, à savoir:
– variables d’états en storage
– paramètre de fonction et variables à l’intérieur des fonctions en memory

LAISSER UN COMMENTAIRE

Please enter your comment!
Please enter your name here

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.