mer. Août 4th, 2021
    Smart Contracts, Free TON

    L’auteur de l’article est Rouslan Dorofeev. Source — Habr.

    Avant de commencer à écrire notre token, et après le système de contrat intelligent, examinons rapidement les éléments importants des contrats intelligents pour Free TON.

    Dans l’article précédent Hello Word un contrat intelligent pour Free TON, nous avons examiné la phase initiale de travail avec les contrats intelligents Free TON et HelloWorld.

    La structure de cet article:

    1. Les types de nombres int et uint, fonctions pures et event (événements): création d’une calculatrice sur la blockchain;
    2. Structures et tableaux: contrats intelligents en tant que base de données;
    3. Tables de hachage: mapping;
    4. Clés publiques et require.

    Dans le code ci-dessous, au début des fonctions, il y aura un appel à tvm.accept(); car nous envisageons des options éducatives pour les contrats intelligents.

    Calculatrice

    Vous pouvez déclarer une variable avec un type numérique en utilisant int (entier signé) et uint (entier non signé). Vous pouvez écrire le nombre de bits pour le nombre dans le suffixe du type numérique spécifié, par exemple: int8, int16, uint128. Les types int et uint sont les mêmes que int256 et uint256. Nous effectuons des opérations arithmétiques sur des nombres dans un contrat intelligent.

    Maintenant, écrivons un contrat intelligent avec une calculatrice. Il a une fonction calc, qui prend 3 paramètres uint: 2 numéros d’opérande et un nombre indiquant le numéro de l’opération sur les opérandes passés aux fonctions. Notre fonction calc a un modificateur pure, ce qui signifie que cette fonction n’utilise pas de données de contrat intelligent, mais effectue ses opérations uniquement avec ce qui lui est passé dans les arguments. Dans le cas où un numéro d’opération inconnu est passé à une fonction, nous générons un événement qui informe l’application externe qui appelle notre contrat intelligent que quelque chose s’est produit.

    Les événements (event) dans les contrats intelligents sont utilisés assez souvent, cela nous a été utile afin d’informer des informations supplémentaires que le résultat 0 retourné par la fonction n’est pas un résultat, mais une erreur liée au fait qu’un nombre inconnu de l’opérateur arithmétique a été passé.

    Structures et tableaux

    Ce que nous déclarons au début d’un contrat intelligent (généralement) en dehors de la portée de la fonction fait référence à la zone de mémoire associée au contrat intelligent. Et comme le contrat intelligent est finalement téléchargé sur la blockchain, les données du contrat intelligent sont stockées dans la blockchain comme dans une base de données. Écrivons un contrat intelligent simple pour stocker des données dans la blockchain.

    La structure User dans notre contrat est utilisée pour stocker des informations sur l’utilisateur et contient 2 champs de données de type uint: poids et équilibre de l’utilisateur. Puisque nous voulons stocker des données non pas sur un, mais sur de nombreux utilisateurs, après avoir déclaré la structure, nous avons déclaré un tableau de structures de ce type. Nous pouvons maintenant ajouter des utilisateurs à notre tableau en utilisant push, et puis, après avoir calculé le nouvel ID utilisateur à partir de l’index du tableau, nous le renvoyons dans l’événement NewUser.

    Faites attention à l’aspect du retour des valeurs par la fonction GetUser: dans ce cas, nous déclarons des variables dans les returns, auxquels nous attribuons des valeurs dans le corps de la fonction. Notez que nous avons changé le modificateur pure en celui de view.

    Tables de hachage: mapping

    Ci-dessus, nous avons examiné des tableaux dans lesquels la clé de la valeur (User) est l’index (ou ordinal, à partir de zéro) de l’élément qu’ils contiennent. Un autre type de collection d’objets est le mapping. On peut y stocker des séquences d’éléments d’un type donné, comme dans le cas des tableaux, mais contrairement aux tableaux, les clés de ces valeurs ne sont pas de simples indices numériques, mais des valeurs d’un autre type donné. Cela vous permet de rechercher des éléments dans la réflexion par chaîne, adresse, clé publique et autres valeurs.

    Ajoutons ce mapping à notre exemple légèrement repensé:

    Clés publiques et require

    L’appel d’une fonction de contrat intelligent est similaire à l’envoi d’un message: nous envoyons un objet contenant le nom de la fonction appelée et ses paramètres, si nécessaire, à l’adresse du compte avec le contrat intelligent. De plus, des données supplémentaires peuvent être incluses dans le message: une clé publique, une signature, une valeur (value) de transfert des jetons TON Crystal vers le compte appelé. Parlons de la clé publique.

    Vous pouvez obtenir la valeur de la clé publique du compte qui a envoyé le message à notre contrat intelligent en appelant la fonction API msg.pubkey(). Dans la fonction NewToken(), nous avons effectué l’affectation accounts[tokens.length-1] = msg.pubkey();, dans laquelle pour chaque ID de jeton nouvellement créé, la clé publique du compte qui a créé ce jeton est placée dans le mappage accounts, et nous utilisons l’identifiant comme clé de ce jeton, qui est calculé après le réapprovisionnement du tableau de jetons. Ensuite, dans SetTokenInfo(), où nous pouvons définir le nom et le symbole de notre jeton, nous définissons une exigence, uniquement lorsqu’elle est remplie, l’appel de fonction peut continuer. Nous prenons la clé publique de l’expéditeur par la valeur tid, trouvons la clé publique définie à la création dans l’affichage accounts, comparons. Ce n’est que s’ils sont égaux que nous pouvons définir ou modifier le nom et le symbole du jeton.

    7
    0