Fermer

juillet 12, 2018

Compiler, déployer, tester des jetons TNS –


Dans partie 2 de cette série de tutoriels sur la construction de DApps avec Ethereum, nous avons écrit le code du jeton TNS. Mais nous ne l'avons pas encore compilé, déployé, testé ou vérifié. Faisons tout cela dans cette partie afin que nous soyons prêts pour ce qui vient ensuite.

Compiler

À ce stade, nous avons un fichier contenant du code de Solidité. Mais pour que la machine virtuelle Ethereum la comprenne, nous devons la transformer en code machine. De plus, pour pouvoir communiquer avec une application Web, nous avons besoin d'une ABI (application binary interface), qui est une description lisible de façon universelle des fonctions qui existent dans un certain contrat intelligent – que ce soit un jeton ou quelque chose de plus complexe. Nous pouvons créer du code machine pour l'EVM et l'ABI en utilisant le compilateur de Truffle.

Dans le dossier du projet, lancez:

 compilation de truffes

Cette commande recherche dans le sous-dossier contracts les compile tous et place leur version compilée dans le sous-dossier build . Notez que si vous avez utilisé le flux de développement alternatif de la dernière partie, tous les contrats parents dont hérite notre contrat TNSToken seront également compilés un par un dans son propre fichier.

 Contrats compilés

N'hésitez pas à inspecter le contenu des fichiers JSON générés. Notre TNSToken devrait avoir plus de 10000 lignes de code JSON

Déploiement vers Ganache

Voyons maintenant si nous pouvons le déployer dans notre blockchain Ganache simulé. Si Ganache ne fonctionne pas déjà dans un onglet de votre terminal ou parmi les applications de votre système d'exploitation, exécutez-le avec:

 ganache-cli

Ou lancez l'application pour obtenir un écran comme celui-ci:

 Ganache UI

Puis, dans le dossier où nous venons de compiler les contrats, nous devons ajouter une migration. Créez le fichier migrations / 2_deploy_tnstoken.js . Si vous n'êtes pas familier avec les migrations dans l'écosystème Truffle, voir ce guide .

Mettons ce qui suit dans ce fichier:

 var Migrations = artefacts.require ("./ Migrations.sol ");
var TNSToken = artefacts.require ("./ TNSToken.sol");

module.exports = fonction (déployeur, réseau, comptes) {
  deployer.deploy (TNSToken, {from: accounts [0]});
}

Tout d'abord, la possibilité d'effectuer des migrations est importée en demandant Migrations.sol . Ceci est requis dans chaque migration. Ensuite, déployer un jeton signifie que nous devons importer son code Solidity, et nous le faisons en tirant TNSToken.sol le code que nous avons écrit dans la partie précédente. Enfin, c'est un cookie cutter migrant avec seulement la partie entre fonction (déployeur, réseau, comptes) { et le dernier } changeant.

Dans ce cas, nous disons au déployeur pour déployer le TNSToken et passer l'argument à partir de afin de définir le détenteur initial du jeton. L'adresse utilisée ici est une adresse aléatoire générée par Ganache, mais en utilisant le tableau accounts transmis automatiquement au déployeur, nous nous assurons que nous avons accès à la liste des comptes présents dans le noeud en cours d'exécution (que ce soit un Geth noeud vivant ou Ganache). Dans mon exemple particulier, l'adresse du compte [0] était 0xdFb659D556d926dd3585d0f18d4F8eD7939E8061 également visible dans la capture d'écran ci-dessus.

N'oublions pas non plus de configurer un environnement de développement dans truffle.js :

 module.exports = {
  réseaux: {
    développement: {
      hôte: "127.0.0.1",
      port: 7545,
      network_id: "*"
    }
  }
}

Note: prendre soin du port et de la propriété intellectuelle; le vôtre pourrait être différent!

Enfin, dans le dossier du projet, lancez truffle migrate . Vous devriez voir quelque chose comme ceci:

 Une migration réussie

Notez l'adresse Ethereum à côté de TNStoken : 0x3134bcded93e810e1025ee814e87eff252cff422 . C'est là que notre jeton a été déployé. Voyons maintenant en action.

Test du jeton

Les tests automatisés ne sont pas nécessaires dans ce cas. Les contrats Token sont hautement standardisés et testés au combat. Si nous avions utilisé certaines fonctionnalités qui dépassent la portée d'un jeton traditionnel, des tests automatisés auraient été utiles. Comme il est, cependant, le tester en l'envoyant vers et depuis les adresses est assez suffisant.

Ouvrez une interface utilisateur de portefeuille comme MyEtherWallet et dans le menu en haut à droite sélectionnez un réseau personnalisé. Dans la boîte de dialogue, entrez les informations qui vous sont fournies par votre blockchain privée – Ganache ou une blockchain PoA réelle, celle que vous utilisez selon la partie 1 de cette série de tutoriels. Dans mon exemple, c'est 127.0.0.1 pour l'adresse, et 7545 pour le port

 Configuration du réseau dans MEW

Ouvrir le portefeuille que vous définissez comme valeur à partir de dans le script de déploiement. Si vous utilisez Ganache, vous verrez sa clé privée imprimée à l'écran dans l'interface utilisateur de Ganache ou la sortie ganache dans le terminal.

 La clé privée est accessible dans l'interface utilisateur Ganache

Enfin, MEW doit être informé que ce jeton existe. Nous faisons cela en ajoutant un jeton personnalisé.

 Ajout d'un jeton personnalisé dans MEW

Immédiatement après avoir ajouté le jeton, vous remarquerez que le compte a maintenant un solde de 100 millions d'entre eux , et qu'il est capable de les envoyer dans le menu de sélection de la liste déroulante des devises. Essayons d'en envoyer à une autre adresse

 Envoyer des jetons

 Transaction en cours de préparation

 Jetons reçus

Go en avant et renvoyer ceux maintenant pour obtenir le compte original de nouveau à 100 millions de nouveau. Nous nous sommes assurés que la fonctionnalité de base de notre jeton fonctionne comme prévu.

Déploiement sur un réseau en direct

Ce test ne serait pas un jeton réel sans le déployer également sur un réseau en direct. N'utilisons pas le mainnet, mais un testnet comme Rinkeby

Dans truffle.js ajoutons un nouveau réseau – rinkeby – pour que notre fichier ressemble à ceci:

 require ('dotenv'). config ();
const WalletProvider = require ("truffle-wallet-provider");
const Wallet = require ('ethereumjs-wallet');
const Web3 = require ("web3");
const w3 = nouveau Web3 ();

const PRIVKEY = process.env ["PRIVKEY"];
const INFURAKEY = process.env ["INFURAKEY"];

module.exports = {
  réseaux: {
    développement: {
      hôte: "127.0.0.1",
      port: 7545,
      network_id: "*"
    },
    Rinkeby: {
      fournisseur: function () {
        retourner nouveau WalletProvider (
          Wallet.fromPrivateKey (
            Buffer.from (PRIVKEY, "hex")), "https://rinkeby.infura.io/"+INFURAKEY

        )
      },
      gaz: 4600000,
      gasPrice: w3.utils.toWei ("50", "gwei"),
      network_id: "3",
    },
  }
}

Yikes! Qu'est-ce que tout cela est maintenant?

Traitons-le ligne par ligne.

Les premières lignes importent des modules de nœuds pour que nous puissions utiliser les fonctions ci-dessous. Si vous obtenez un message de module manquant pour l'un d'entre eux, juste en cours d'exécution npm install web3-wallet-fournisseur truffle-wallet-fournisseur web3 dotenv --save devrait réparer les choses.

Ensuite, nous chargeons le privé clé du porte-monnaie à partir de laquelle nous exécutons le contrat (donc le portefeuille qui recevra les 100 millions de jetons, nous ne pouvons pas utiliser la valeur de ici) d'un .env à la racine du dossier du projet. Si ce n'est pas le cas, créez-le. Ce même fichier dispose également d'une clé d'accès Infura.io, un site Web qui héberge des nœuds Ethereum et permet aux applications de s'y connecter afin que les développeurs n'aient pas besoin d'exécuter des nœuds Ethereum complets sur leurs ordinateurs.

.env Le fichier est caché par défaut et peut être ignoré dans .gitignore donc il n'y a aucun danger que votre clé privée fuie – une précaution très importante! Voici ce que le fichier contient:

 PRIVKEY = "YOUR_PRIVATE_KEY";
INFURAKEY = "VOTRE_INFURA_ACCESS_KEY";

Vous pouvez obtenir votre clé Infura par en vous inscrivant ici . La clé privée peut facilement être obtenue si vous venez d'installer Metamask passez à Rinkeby, et allez à Exporter la clé privée. Toute méthode va fonctionner, alors choisissez ce que vous voulez. Vous pouvez également utiliser la clé privée de Ganache. Une seule clé privée déverrouille le même portefeuille sur tous les réseaux Ethereum – testnet, rinkeby, mainnet, vous le nommez.

Retour à notre fichier de configuration. Nous avons une nouvelle entrée réseau : Rinkeby . C'est le nom du testnet Ethereum que nous allons déployer et le code à l'intérieur du fournisseur est en fait une pâte de copie de cookie-cutter disant à Truffle "attrape ma clé privée, l'écrase en hexadécimal, la transforme en un portefeuille débloqué, puis parle »

Enfin, nous définissons la limite de gaz que nous voulons consacrer à l'exécution de ce contrat (4,6 millions suffisent, ce qui peut être modifié si nécessaire), combien coûtera le gaz (50 Gwei est en réalité assez cher mais l'Ether avec lequel nous jouons est simulé donc ça n'a pas d'importance) et l'ID du réseau est réglé sur 4 parce que c'est ainsi que le testnet Rinkeby est étiqueté . Il y a encore une chose à faire. Le fichier de migration que nous avons écrit précédemment cible une adresse à partir de mais l'adresse de Rinkeby est différente. Cela signifie-t-il que nous devons changer le script de déploiement en fonction du réseau? Bien sûr que non! Modifions le fichier 2_deploy_tnstoken.js pour qu'il ressemble à ceci:

 var Migrations = artefacts.require ("./ Migrations.sol");
var TNSToken = artefacts.require ("./ TNSToken.sol");

module.exports = fonction (déployeur, réseau, comptes) {
  if (network == "développement") {
    deployer.deploy (TNSToken, {from: accounts [0});
  } autre {
    deployer.deploy (TNSToken);
  }
}

Comme vous pouvez le voir, les scripts de déploiement sont de simples JavaScript et le second paramètre donné au déployeur est toujours le nom du réseau – ce que nous pouvons utiliser pour les différencier.

Si nous essayons d'exécuter la migration maintenant avec truffle migrate --network rinkeby il échouera si l'adresse que nous avons utilisée est nouvelle:

 Une migration défaillante

C'est parce que l'adresse n'a pas d'éther à dépenser déployer le contrat. C'est facile à résoudre, cependant. Dirigez-vous vers le Robinet Rinkeby et demandez-en un peu. C'est gratuit

 Demander Rinkeby test ether

Maintenant, relancez la migration et le contrat de jeton sera déployé en direct sur le réseau Rinkeby. Il peut être testé comme dans le cas d'utilisation Ganache ci-dessus. Tout devrait fonctionner exactement de la même manière, seulement maintenant vous pouvez aussi le tester avec vos amis et collègues. Progress

Bonus: Vérification et ENS

Pour les points de confiance supplémentaires, il est recommandé de vérifier le jeton sur Etherscan et de lui enregistrer un domaine ENS

Vérification

Vérification signifie soumission de la source code du jeton à Etherscan afin qu'il puisse le comparer à ce qui est déployé sur le réseau, le vérifiant ainsi en tant que backdoor-free. Ceci est fait sur l'onglet Code de l'adresse du jeton. Puisque notre token utilise un code tiers et que ceux-ci ne peuvent pas être facilement tirés dans la fenêtre de code dans l'écran Verify nous devons aplanir notre contrat. Pour cela, nous utiliserons un outil appelé truffle-flattener :

 npm install --global truffle-flattener

Cet outil copiera toutes les dépendances et le code source du jeton dans un seul fichier. Nous pouvons l'exécuter comme ceci:

 truffle-flattener contracts / TNSToken.sol >> ./contracts/TNSTokenFlat.sol

Un nouveau fichier doit maintenant être présent dans le dossier contracts pratiquement identique à notre code source mais avec le code de dépendance collé dedans (donc SafeMath.sol par exemple, sera collé en haut du fichier).

Collez le contenu de ce nouveau fichier dans la fenêtre de code de l'écran Verify définissez le compilateur à la version que vous obtenez en exécutant truffle version et réglez Optimisation à Non . Cliquez sur Vérifier et Publier et une fois le processus terminé, l'écran d'adresse de votre jeton aura de nouveaux onglets: Lire le contrat et Rédiger le contrat et l'onglet Code aura une coche verte, indiquant que le code a été vérifié. Cela vous donne des points de confiance supplémentaires avec la communauté.

 Le jeton est maintenant marqué comme approuvé

ENS

L'ENS est le système de noms Ethereum. Il est utilisé pour donner aux adresses Ethereum des noms lisibles par les humains afin que vous n'ayez pas à vous souvenir des chaînes 0xmumbojumbo et que vous puissiez vous souvenir d'adresses comme bitfalls.eth . Vous pouvez même enregistrer des sous-domaines comme token.bitfalls.eth . Le processus d'enregistrement d'un domaine ENS n'est pas simple et cela prend du temps, donc si vous voulez le faire, je vous recommande de lire ce guide et de suivre les instructions ici . ] Conclusion

Dans cette partie, nous avons compilé et déployé un jeton personnalisé. Ce jeton est compatible avec tous les échanges et peut être utilisé comme un jeton ERC20 régulier






Source link