Déployer et exécuter (partie 2)

Contrats déployés

Cette section de l’onglet Exécuter contient une liste de contrats déployés avec lesquels il est possible d’interagir grâce à l’interface utilisateur autogénérée du contrat déployé (également appelée udapp).

Le contrat déployé apparaît mais sous sa forme réduite.

Cliquez sur la flèche latérale pour l’ouvrir.

Vous verrez les fonctions dans le contrat. Les boutons des fonctions peuvent être de couleurs différentes.

  • Les fonctions qui sont des fonctions constantes ou pures dans Solidity ont un bouton bleu. Cliquer sur un bouton de ce type ne crée pas de nouvelle transaction. Le clic ne provoque donc pas de changement d’état - il ne fait que renvoyer une valeur stockée dans le contrat - il ne vous coûtera donc rien en frais de gaz.

  • Les fonctions qui changent l’état du contrat ET qui n’acceptent pas d’Ether sont appelées fonctions « non payables » et ont un bouton orange. Cliquer sur ces fonctions créera une transaction et coûtera donc du gaz.

  • Les fonctions qui ont des boutons rouges sont des fonctions « payables » dans Solidity. En cliquant sur l’une d’entre elles, vous créez une nouvelle transaction qui peut accepter une valeur. La valeur est placée dans le champ Valeur qui se trouve sous le champ Limite de gaz.

Voir plus d’informations sur Solidity modifiers dans la documentation de Solidity. .

Si une fonction nécessite des paramètres d’entrée, vous devez les introduire.

Saisie des paramètres

Saisie de paramètres dans la vue réduite

(saisie de tous les paramètres dans un seul champ de saisie)

  • La zone de saisie vous indique le type de chaque paramètre.

  • Les nombres et les adresses ne doivent pas être placés entre guillemets.

  • Les chaînes de caractères n’ont pas besoin d’être enveloppées.

  • Les paramètres sont séparés par des virgules.

Dans l’exemple ci-dessus, la fonction « delegate » a 3 paramètres.

Saisie de paramètres dans la vue élargie

En cliquant sur la flèche « bas », vous accédez au Gestionnaire multi-paramètres - où vous pouvez saisir les paramètres un par un. **C’est beaucoup moins déroutant !

Dans la vue développée, les chaînes n’ont pas besoin d’être enveloppées.

En cliquant sur l’icône du presse-papiers, vous encoderez les entrées et les copierez. Seul un ensemble valide d’entrées peut être encodé.

Ainsi, si vous avez fait une erreur et que vous avez mis un uint8 à la place d’une adresse, cliquer sur le presse-papiers ici vous donnera un message d’erreur.

Interactions de bas niveau

Les interactions de bas niveau sont utilisées pour envoyer des fonds ou des données d’appel ou des fonds et des données d’appel à un contrat par l’intermédiaire de la fonction receive() ou fallback(). En règle générale, vous n’avez besoin d’implémenter la fonction fallback que si vous suivez un modèle de mise à niveau ou de procuration.

La section des interactions de bas niveau se trouve sous les fonctions de chaque contrat déployé.

Veuillez noter ce qui suit :

  • Si vous exécutez un simple transfert d’Ether vers un contrat, vous devez avoir la fonction receive() dans votre contrat. Si votre contrat a été déployé et que vous souhaitez lui envoyer des fonds, vous devez saisir le montant d’Ether ou de Wei, etc. (voir A dans le graphique ci-dessous), puis saisir rien dans le champ calldata de Interactions de bas niveau (voir B dans le graphique) et cliquer sur le bouton Transact (voir C dans le graphique ci-dessous).

  • Si vous envoyez des données à votre contrat avec l’Ether, alors vous devez utiliser la fonction fallback() et l’avoir avec l’état de mutabilité de payable.

  • Si vous n’envoyez pas d’éther au contrat mais envoyez des données d’appel, vous devez utiliser la fonction fallback().

  • Si vous enfreignez les règles lors de l’utilisation des interactions de bas niveau, vous recevrez un avertissement.

Veuillez consulter les [solidity docs] (https://solidity.readthedocs.io/en/latest/contracts.html#receive-ether-function) pour plus de détails sur l’utilisation des fonctions fallback et receive.

Transmettre un tuple ou une structure à une fonction

Pour passer un tuple, vous devez mettre un tableau [].

De même, pour passer une structure en paramètre d’une fonction, il faut la mettre sous forme de tableau []. Notez également que la ligne pragma experimental ABIEncoderV2; doit être placée au début du fichier solidity.

Exemple de passage d’une structure imbriquée à une fonction

Considérez une structure imbriquée définie comme suit :

struct Garden {
    uint slugCount;  
    uint wormCount;
    Flower[] theFlowers;
}
struct Flower {
    uint flowerNum;
    string color;
}

Si une fonction a la signature fertilizer(Garden memory gardenPlot) alors la syntaxe correcte est :

[1,2,[[3,"Petunia"]]]

Pour poursuivre cet exemple, voici un exemple de contrat :

pragma solidity >=0.4.22 <0.7.0;
pragma experimental ABIEncoderV2;

contract Sunshine {
    struct Garden {
      uint slugCount;  
      uint wormCount;
      Flower[] theFlowers;
    }
    struct Flower {
        uint flowerNum;
        string color;
    }
      
    function fertilizer(Garden memory gardenPlot) public {
        uint a = gardenPlot.slugCount;
        uint b = gardenPlot.wormCount;
        Flower[] memory cFlowers = gardenPlot.theFlowers;
        uint d = gardenPlot.theFlowers[0].flowerNum;
        string memory e = gardenPlot.theFlowers[0].color;
    }
}

Après avoir compilé, déployé le contrat et ouvert l’instance déployée, nous pouvons ajouter les paramètres d’entrée suivants à la fonction nommée fertilizer :

[1,2,[[3,"Black-eyed Susan"],[4,"Pansy"]]]

La fonction fertilizer accepte un seul paramètre du type Garden. Le type Jardin est une struct. Les structures sont enveloppées dans des crochets carrés. À l’intérieur de Jardin se trouve un tableau qui est un tableau de structures nommé lesFleurs. Il y a un jeu de crochets pour le tableau et un autre pour la structure. D’où les doubles crochets.