Fermer

juillet 26, 2018

Lancement du StoryDao –


Dans partie 7 de cette série de didacticiels sur la construction de DApps avec Ethereum, nous avons montré comment construire l'interface de l'application, configurer et déployer l'interface utilisateur pour cette histoire sur laquelle nous travaillons. [19659002Ilesttempsdefaireunpeudedéploiementetd'écrirequelquesfonctionsfinales


Ceci est la huitième partie d'une série sur la construction d'applications décentralisées utilisant la chaîne de blocs Ethereum . Le projet que nous construisons s'appelle The Neverending Story. Le projet complet peut être trouvé à storydao.bitfalls.com . Son code complet est sur GitHub .

Voici un aperçu de toute la série:

  • Dans part 1 nous amorçons deux versions d'une blockchain locale pour le développement: Version de Ganache, et une version complète de PoA privée
  • Dans partie 2 nous construisons et déployons notre jeton TNS.
  • Dans partie 3 nous regardons comment compiler , déployer, tester et vérifier notre jeton TNS personnalisé, qui est compatible avec tous les échanges et peut être utilisé comme un jeton ERC20 régulier
  • Dans partie 4 nous faisons les premiers pas vers le développement d'un DAO Story.
  • Dans partie 5 nous traitons de l'ajout de contenu à l'histoire, en examinant comment ajouter la possibilité pour les participants d'acheter des jetons du DAO et d'ajouter des soumissions dans l'histoire.
  • Dans partie 6 nous prenons le DAO dans sa forme finale, en ajoutant le vote, la liste noire / unblacklisting, et la distribution de dividendes et Retrait, tout en ajoutant quelques fonctions auxiliaires pour faire bonne mesure
  • Dans part 7 nous montrons comment construire le front end de l'application, en configurant et en déployant l'interface utilisateur pour cette histoire que nous travaillons.
  • Dans cette dernière partie, nous examinons les dernières étapes du déploiement de l'application et de l'écriture de quelques fonctions finales

Suicide

Quelque chose pourrait aller très, très mal et l'ensemble DAO en quelque sorte détruit – soit à travers des hacks de mauvais code écrit à la hâte, ou à travers l'incapacité de faire de longues boucles à cause de trop de participants. (Trop d'électeurs sur une proposition pourraient aussi bien casser le système, nous n'avons vraiment mis aucune précaution en place pour cela!) Au cas où cela se produirait, il pourrait être utile d'avoir l'équivalent d'un «gros bouton rouge». Tout d'abord, améliorons notre StoryDao:

 function bigRedButton () onlyOwner external {
    actif = faux;
    retireToOwner ();
    token.unlockForAll ();
}

Ensuite, rendons possible de débloquer tous les jetons à la fois dans notre contrat Token:

 / **
@dev déverrouille les jetons de tous les utilisateurs qui ont déjà verrouillé des jetons pour eux
* /
function unlockForAll () public onlyOwner {
    uint256 len = touchedByLock.length;
    pour (uint256 i = 0; i <len; i ++) {
        verrouillé [touchedByLock[i]] = 0;
    }
}

Naturellement, nous devons ajouter cette nouvelle liste d'adresses dans le contrat:

 adresse [] touchedByLock;

Et nous devons mettre à jour notre fonction increaseLockedAmount pour ajouter des adresses à cette liste:

 / **
@dev _owner sera empêché d'envoyer _amount de jetons. N'importe quoi
au-delà de ce montant sera dépensable.
* /
function increaseLockedAmount (adresse _owner, uint256 _amount) public onlyOwner renvoie (uint256) {
    uint256 lockingAmount = verrouillé [_owner] .add (_amount);
    require (balanceOf (_owner)> = lockingAmount, "Le montant de verrouillage ne doit pas dépasser la balance");
    verrouillé [_owner] = lockingAmount;
    touchedByLock.push (_owner);
    Emit Locked (_owner, lockingAmount);
    return lockingAmount;
}

Nous devrions aussi mettre à jour l'interface requise du jeton dans le contrat StoryDao pour inclure la signature de cette nouvelle fonction:

 // ...
    function getUnlockedAmount (adresse _owner) affiche les retours publics (uint256);
    function unlockForAll () public;
}

Avec le bloc d'histoire active que nous avons ajouté avant (incapacité d'exécuter certaines fonctions à moins que le drapeau actif de l'histoire ne soit vrai), cela devrait faire l'affaire. Personne d'autre ne sera capable de gaspiller de l'argent en l'envoyant au contrat, et les jetons de tout le monde seront débloqués.

Le propriétaire ne reçoit pas les éther soumis. Au lieu de cela, la fonction de retrait devient disponible pour que les gens puissent récupérer leur éther et que tout le monde s'en occupe

Maintenant, nos contrats sont enfin prêts pour le déploiement.

Il y a une fonction appelée selfdestruct qui permet de détruire un contrat. Il ressemble à ceci:

 selfdestruct (adresse);

L'appeler désactivera le contrat en question, supprimant son code de l'état blockchain et désactivant toutes les fonctions, tout en envoyant l'éther dans cette adresse à l'adresse fournie. Ce n'est pas une bonne idée dans notre cas: nous voulons toujours que les gens puissent retirer leur éther; nous ne voulons pas le leur enlever. De plus, tout éther envoyé directement à l'adresse d'un contrat suicidé sera perdu à jamais parce qu'il n'y a aucun moyen de le récupérer.

Déployer le contrat

Pour déployer complètement les contrats intelligents, nous devons faire le suivant:

  1. déployer vers mainnet
  2. envoyer des jetons à l'adresse StoryDAO
  3. transférer la propriété du contrat Token à StoryDao

Allons-y

Déploiement de Mainnet

Pour déployer sur mainnet, nous devons ajouter un nouveau réseau dans notre fichier truffle.js :

 mainnet: {
  fournisseur: function () {
    retourner nouveau WalletProvider (
      Wallet.fromPrivateKey (
        Buffer.from (PRIVKEY, "hex")), "https://mainnet.infura.io/"+INFURAKEY
    )
  },
  gasPrice: w3.utils.toWei ("20", "gwei"),
  network_id: "1",
},

Heureusement, c'est très simple. C'est pratiquement identique au déploiement de Rinkeby; nous avons juste besoin d'enlever le montant de gaz (laissez-le le calculer lui-même) et changer le prix du gaz. Nous devrions également changer l'ID de réseau à 1 puisqu'il s'agit de l'identifiant mainnet

Nous utilisons ceci comme ceci:

 truffle migrate --network mainnet

Il y a une mise en garde à noter ici. Si vous déployez sur un réseau sur lequel vous avez déjà été déployé (même si vous venez de déployer le token sur le mainnet et que vous souhaitez déployer le StoryDao plus tard), vous pouvez obtenir cette erreur:

 Tentative d'exécution d'une transaction qui appelle une fonction contrat mais l'adresse du destinataire XXX n'est pas une adresse de contrat

Cela arrive parce que Truffle se souvient où il a déployé des contrats déjà déployés afin de pouvoir les réutiliser dans les migrations suivantes, évitant ainsi le besoin de redéploiement. Mais si votre réseau a redémarré (c'est-à-dire Ganache) ou que vous avez effectué des modifications incompatibles, il se peut que l'adresse qu'il a enregistrée ne contienne plus ce code, donc il se plaindra. Vous pouvez contourner ce problème en réinitialisant les migrations:

 truffle migrate --network mainnet --reset

Envoyer des jetons à l'adresse StoryDao

Récupérer l'adresse du jeton et l'adresse du StoryDao depuis le processus de déploiement

 Adresses from Deployment

Ensuite, il suffit d'utiliser MEW comme décrit précédemment pour envoyer les jetons.

 Jetons d'envoi

 Génération et confirmation d'une transaction

Si vous obtenez des erreurs Hors Gaz, augmentez simplement la limite de gaz. Rappelez-vous: le reste du gaz inutilisé est toujours remboursé, donc il n'y a aucune crainte de perdre plus d'argent que vos coûts de transaction (l'envoi des jetons devrait être inférieur à 40000 gaz.)

Transférer la propriété de jeton à StoryDao

propriété, nous devons appeler la fonction transferOwnership sur le jeton. Chargons le jeton dans MEW. Dans l'écran Contracts nous entrons l'adresse et l'ABI du contrat (récupérez-le dans le dossier / build ). En cliquant sur Access nous pourrons accéder aux fonctions de ce contrat dans un menu à partir duquel nous sélectionnerons transferOwnership .

 Transfert de propriété

Astuce: il suffit de n'inclure que l'ABI des fonctions que vous souhaitez appeler: il ne s'agit pas de l'intégralité de l'ABI du jeton! Vous pourriez simplement inclure l'ABI de la fonction transferOwnership et ce serait bien!

Nous sélectionnons alors le nouveau propriétaire (l'adresse du déployé StoryDao) et débloquons le portefeuille du propriétaire actuel (le même portefeuille que nous

 Déverrouillage et écriture

Après avoir écrit cette modification, nous pouvons inspecter la fonction de lecture seule propriétaire dans le contrat de jetons (même menu que transferOwnership ).

 Changement de propriétaire

Pour être sûr que l'adresse de StoryDao possède réellement les jetons, nous pouvons sélectionner la fonction balanceOf et entrer dans le StoryDao adresse dans le champ _owner puis cliquez sur Lire :

 StoryDao a des jetons

En effet, 100 millions de jetons sont dans l'adresse StoryDao. [19659025] Conseil: nous aurions pu faire l'envoi de jeton et le transfert de propriété dans le cadre de l'étape de déploiement. Essayez de comprendre comment dans un environnement de test

Vérification

Conformément à la partie 3 de cette série, il nous serait très utile de vérifier les contrats du DAO et du Token sur Etherscan. Cette coche verte peut aller loin.

Suivez les instructions de cette partie pour faire vérifier vos contrats. Notez que, lors de l'étape de vérification, vous devrez maintenant marquer l'optimiseur comme actif, puisque nous optimisons notre code pour un déploiement moins cher!

Déploiement sur le Web

Pour déployer l'interface Web de StoryDao, suivez les instructions du monde du développement web "régulier". Puisque, dans ce cas, tout le code est statique, vous pouvez même l'héberger sur des pages GitHub ou quelque chose de similaire.

Lisez à propos de certaines options ici et ici . Une fois la page mise en place, configurez l'interface utilisateur pour utiliser les adresses des contrats obtenus lors de l'étape de migration. Sinon, enregistrez les noms ENS pour le jeton et le StoryDao, et vous pouvez garder l'interface Web statique et fixe, en codant en dur les adresses, puis changer uniquement l'adresse Ethereum pointant vers ces noms.

Conclusion

Ceci conclut le tutoriel DAO. Nous espérons que cela vous a aidé à reconnaître les complexités du développement de la Solidité, mais nous espérons aussi qu'il a rendu certaines choses plus claires et vous a rendu plus curieux.

Comme toujours, la meilleure façon d'apprendre est de le faire. Expérimentez, faites des erreurs, redémarrez et reconstruisez. Le développement de Blockchain de ce type est en forte demande, et il devient de plus en plus populaire, donc vous avez l'opportunité d'entrer au rez-de-chaussée.

Bonne chance!

P.S. Si vous avez aimé ce tutoriel, n'hésitez pas à envoyer un ping à l'auteur sur Twitter . Si vous avez des plaintes, des suggestions, des idées, etc., envoyez-les dans le dépôt sur GitHub!






Source link