Le remix montre les valeurs des getters déclarant seulement «constant»

Alejandro Muñoz

Le remix montre les valeurs des getters déclarant seulement «constant»


 pragma solidity ^0.4.0; contract MyFirstContract { uint private age; function setAge(uint newAge) { age = newAge; } function getAge() returns (uint) { return age; } } 

Quand je crée le contrat en remix et que je mets par exemple le numéro 3 à l’âge variable, alors quand j’appelle getAge () cela ne montre rien. Mais si j’ajoute « constant » comme:

 function getAge() constant returns (uint) { return age; } 

alors ça marche. J’ai vu une vidéo montrant que le même code fonctionnait sans déclarer « constant », donc je ne comprends pas vraiment pourquoi cela ne fonctionne pas pour moi.

Réponses


 smarx

Il existe deux façons d’appeler une fonction dans un contrat intelligent:

  1. Vous pouvez envoyer une transaction . Une transaction est envoyée au réseau et est extraite dans le cadre d’un bloc. Il est vérifié par tous les nœuds du réseau.
  2. Vous pouvez appeler une fonction. Cela n’envoie rien au reste du réseau; un appel est exécuté localement sur le nœud auquel vous êtes connecté. Vous récupérez la valeur de retour de la fonction, mais sinon l’appel n’a pas d’effets secondaires. S’il a transféré de l’éther ou changé une variable d’état, ces changements sont simplement rejetés. L’avantage d’un appel est qu’il est rapide et gratuit (pas besoin de payer le gaz).

Remix décide d’envoyer une transaction ou d’effectuer un appel selon que la fonction est marquée comme état de mutation ou non. view / constant indique au compilateur puis à Remix que vous ne mutez pas, donc cette fonction peut être call ed au lieu d’envoyer une transaction.

Cela explique pourquoi Remix traite la fonction différemment selon que vous utilisez le modificateur constant . La dernière pièce du puzzle est que les transactions n’ont pas de valeur de retour . Si vous getAge tant que transaction, le code s’exécutera, mais vous ne récupérerez pas la valeur de retour.

En raison de ces différences, il est recommandé de toujours marquer les fonctions qui ne modifient pas l’état comme view (un meilleur alias pour constant ). Cela rend la fonction rapide, gratuite et capable de vous renvoyer une valeur.


 TC8

Voir ici pour plus d’informations sur les getters:

Le compilateur crée automatiquement des fonctions getter pour toutes les variables d’état public.

parce que votre variable d’âge est déclarée privée, les fonctions getter ne sont pas créées automatiquement et cela pourrait être la raison pour laquelle votre fonction getAge doit être déclarée constante ( ou mieux, en tant que vue ) afin d’accéder à l’état.

Notez qu’il est recommandé de déclarer la visibilité pour toutes les fonctions – vous obtenez probablement des erreurs sur «aucune visibilité spécifiée. La valeur par défaut est «public» dans votre compilateur. voir Appels de fonction dans les documents de solidité pour plus d’informations.

smarx

Cela n’a aucun sens. getAge est une fonction de ce contrat. Bien sûr, il peut accéder à des variables d’état privées.

 

constant, déclarant, des, getters, Le, Les, montre, remix, seulement, valeurs

 

yahoo

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *