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.
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:
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:
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
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.
Enfin, MEW doit être informé que ce jeton existe. Nous faisons cela en ajoutant un jeton personnalisé.
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
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:
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
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é.
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