web-dev-qa-db-fra.com

Dans Ethereum Solidity, à quoi sert le mot-clé "memory"?

Lorsque vous regardez des exemples de contrats, parfois les tableaux sont déclarés dans des méthodes avec "mémoire" et parfois ils ne le sont pas. Quelle est la différence?

39
fivedogit

Sans le mot clé mémoire , Solidity essaie de déclarer des variables dans le stockage .

Lead Solidity dev chriseth: "Vous pouvez considérer le stockage comme un grand tableau doté d'une structure virtuelle… une structure que vous ne pouvez pas modifier au moment de l'exécution - elle est déterminée par les variables d'état de votre contrat".

Autrement dit, la structure de stockage est figée au moment de la création du contrat en fonction de vos déclarations de variables au niveau du contrat et ne peut pas être modifiée par de futurs appels de méthode. MAIS - le contenu de ce stockage peut être modifié avec les appels sendTransaction. Ces appels changent "d'état", c'est pourquoi les variables au niveau du contrat sont appelées "variables d'état". Donc, une variable de stockage uint8 variable; déclarée au niveau du contrat peut être remplacée par n'importe quelle valeur valide de uint8 (0-255) mais cet "emplacement" pour une valeur de type uint8 sera toujours là.

Si vous déclarez des variables dans des fonctions sans le mot clé mémoire , alors solidity tentera d'utiliser la structure de stockage, qui se compile actuellement, mais peut produire des résultats inattendus. la mémoire indique la solidité de créer un morceau d'espace pour la variable lors de l'exécution de la méthode, garantissant sa taille et sa structure pour une utilisation future dans cette méthode.

la mémoire ne peut pas être utilisée au niveau du contrat. Uniquement dans les méthodes.

Voir l'entrée "Quel est le mot clé memory? Que fait-il?" dans la FAQ. Je le cite ici:

La machine virtuelle Ethereum dispose de trois zones où elle peut stocker des éléments.

Le premier est le "stockage", où résident toutes les variables d'état du contrat. Chaque contrat a son propre stockage et il est persistant entre les appels de fonction et assez coûteux à utiliser.

Le second est "mémoire", il est utilisé pour contenir des valeurs temporaires. Il est effacé entre les appels de fonction (externes) et est moins cher à utiliser.

La troisième est la pile, qui est utilisée pour contenir de petites variables locales. Il est presque gratuit à utiliser, mais ne peut contenir qu'une quantité limitée de valeurs.

Pour presque tous les types, vous ne pouvez pas spécifier où ils doivent être stockés, car ils sont copiés chaque fois qu'ils sont utilisés.

Les types où l'emplacement dit de stockage est important sont les structures et les tableaux. Si vous par exemple passer de telles variables dans les appels de fonction, leurs données ne sont pas copiées si elles peuvent rester en mémoire ou rester en stockage. Cela signifie que vous pouvez modifier leur contenu dans la fonction appelée et ces modifications seront toujours visibles dans l'appelant.

Il existe des valeurs par défaut pour l'emplacement de stockage en fonction du type de variable concerné:

  • les variables d'état sont toujours stockées
  • les arguments de fonction sont toujours en mémoire
  • variables locales de stockage de référence de type struct, tableau ou mappage par défaut
  • les variables locales de type valeur (c'est-à-dire ni tableau, ni structure ni mappage) sont stockées dans la pile
52
fivedogit