
La mutabilité d’état est un concept solide qui définit le comportement des fonctions et la manière dont elles interagissent avec les données stockées sur la blockchain. Dans cet article, vous découvrirez les différents modificateurs de mutabilité d’état et comment les appliquer dans la rédaction de contrats intelligents optimisés.
Les deux principaux modificateurs de mutabilité d’état dans la solidité sont :
Afficher les fonctions
Les fonctions d’affichage sont des fonctions en lecture seule et sont déclarées avec le view
mot-clé. Ils ne modifient pas l’état de la blockchain. Cela signifie que les fonctions déclarées avec le view
Le mot-clé ne peut pas contenir de code susceptible de modifier des variables d’état ou des données stockées sur la blockchain.
Aditionellement, view
les fonctions ne peuvent pas recevoir ou envoyer d’éther et ne peuvent appeler que d’autres view
ou pure
les fonctions. UNE view
La fonction qui modifie potentiellement l’état de la blockchain générera une erreur et ne pourra pas être compilée. De même, lorsque le compilateur détecte une fonction qui lit mais n’écrit pas dans la blockchain, il vous suggérera de définir la mutabilité d’état de cette fonction sur view
.
L’exemple dans contrat A ci-dessous montre comment voir résultat la fonction lit les données (num1 et num2) de l’état mais ne modifie pas les données.
pragma solidity 0.8.10;contract A { // Declaring state variables uint num1 = 5; uint num2 = 10;
// View function to calculate product of 2 numbers function viewResult() public view returns(uint product){ // Expression that reads state product = num1 * num2;
}}
Sortir:
product = 50
Fonctions pures ?
Déclarer une fonction comme pure
empêche cette fonction de modifier ou d’interagir avec les données stockées sur la blockchain. Fonctions marquées comme pure
ni lire ni écrire dans la blockchain. Ils ne peuvent ni recevoir ni envoyer d’éther, ni utiliser les membres de msg
ou membres de block
et ne peut appeler que d’autres pure
les fonctions.
Si votre contrat contient une fonction qui ne lit pas ou ne modifie pas l’état, le compilateur signalera un avertissement et vous suggérera de spécifier la mutabilité de l’état. Cet avertissement peut être ignoré et le code sera quand même compilé. Cependant, il est recommandé de toujours le régler sur pure
.
L’exemple dans contrat B ci-dessous montre comment addNum La fonction ne lit ni les données ni n’écrit dans l’état.
pragma solidity 0.8.10;contract B { // Pure function that calculates sum of 2 numbers function addNum(uint num1, uint num2) public pure
returns(uint sum){ // Expression that computes data passed in as parameters
// and does not read or modify state sum = num1 + num2; }}
Sortir:
sum = 15
Pourquoi devriez-vous marquer vos fonctions comme vues ou pures ?
Optimisation du gaz : La consommation de gaz s’applique uniquement lorsqu’une transaction est déclenchée et les transactions sont déclenchées lorsque l’état est modifié. Fonctions marquées comme view
ou pure
ne modifient pas l’état, donc ne coûtent pas de gaz, sauf s’ils sont appelés à partir de contrats externes.
Autres modificateurs de mutabilité d’état de fonction
En plus de view
et pure
la mutabilité de l’état de la fonction peut également être payable
ou non payant.
Fonction Payable
Déclarer une fonction avec le payable
Le mot clé permet à la fonction d’envoyer et de recevoir de l’éther. Tenter d’envoyer ou de recevoir de l’éther via une fonction qui n’est pas marquée comme payable
entraînera une transaction rejetée.
Il est donc obligatoire de marquer une fonction comme payable
si votre contrat intelligent doit envoyer ou recevoir de l’éther via cette fonction.
le verser la fonction ci-dessous permet à d’autres contrats d’envoyer de l’éther à contrat C.
pragma solidity 0.8.10;contract C {
uint balance = 0;// Payable function that allows other contracts
// to send ether to this contract. function deposit () payable public{
balance += msg.value;
} }
Fonction non payante
Tandis que non-payable n’est pas un mot-clé dans la version actuelle de la solidité, c’est le modificateur de mutabilité d’état par défaut supposé lorsqu’une fonction n’est pas explicitement définie comme payable
. Non payant fonctions non définies explicitement comme view
ou pure
conviennent mieux aux fonctions qui lisent et modifient potentiellement des variables d’état. La limite majeure à non-payable fonctions est leur incapacité à recevoir ou à envoyer de l’éther.
pragma solidity 0.8.10;contract D { uint count = 0;// non-payable function that reads and modifies state.function increment() public returns(uint){
count += 1;
return count;
}}
le incrément fonction dans contrat D ci-dessus montre comment non-payable les fonctions lisent les données de l’état en accédant au compter variable déclarée. Il illustre également comment la fonction modifie potentiellement l’état en ajoutant 1 à la valeur de compter à chaque fois la fonction incrément est appelé.
Si vous avez trouvé cela utile, veuillez suivre, partager et montrer quelques ❤️ avec 👏.
Rejoignez Coinmonks Telegram Channel et Youtube Channel pour en savoir plus sur le trading et l’investissement cryptographiques