Fermer

février 21, 2020

Comment construire une blockchain de cryptomonnaie simple dans Node.js


À propos de l'auteur

Alfrick Opidi est un développeur Web expérimenté passionné par l'exploration de la façon dont les technologies émergentes peuvent être utilisées pour créer des produits performants, productifs et…
En savoir plus sur
Alfrick

Ce tutoriel montre comment créer une crypto-monnaie simple, appelée smashingCoin en utilisant les concepts de classes JavaScript et Node.js. Essayez-le – c'est plus simple que vous ne le pensez!

L'augmentation sans précédent des crypto-monnaies et leur technologie de blockchain sous-jacente ont pris le monde d'assaut – depuis les humbles débuts d'un concept académique il y a plus d'une décennie jusqu'à l'adoption croissante actuelle

La technologie blockchain reçoit beaucoup d'attention en raison de sa capacité à améliorer la sécurité dans des environnements sans confiance, à imposer la décentralisation et à rendre les processus efficaces.

Traditionnellement, Python a été le langage de programmation de facto pour le développement de la blockchain. Cependant, avec la prolifération de cette technologie étonnante, les options de développement ont également augmenté – et Node.js n'a pas été laissé pour compte.

Dans ce didacticiel, je vais parler de la façon de créer une chaîne de blocs de crypto-monnaie simple dans Node .js. Ce ne sera pas trop compliqué, mais juste suffisant pour vous aider à comprendre comment fonctionne une blockchain.

J'appellerai cette simple crypto-monnaie smashingCoin .

Si vous êtes un développeur JavaScript qui veut pour faire un saut dans le domaine en plein essor de la crypto-monnaie, cet article vous fournira les compétences nécessaires pour commencer. Ou, si vous êtes curieux de savoir comment les choses fonctionnent dans le monde des crypto-monnaies, ce tutoriel peut vous aider à répondre à certaines de vos questions.

Lecture recommandée : Comprendre l'intégrité des sous-ressources par Drew McLellan

Prérequis

Pour suivre ce didacticiel avec succès, vous devez disposer des éléments suivants:

  • Node.js installé sur votre machine. Vous pouvez le télécharger à partir de ici ;
  • Un éditeur de code, tel que Visual Studio Code, Sublime Text ou tout autre.

Commençons…

Qu'est-ce qu'une blockchain? [19659002] La blockchain est la technologie qui alimente les monnaies numériques, telles que Bitcoin et Ethereum. Il s'agit d'une technologie innovante de grand livre public distribué qui maintient une liste sans cesse croissante d'enregistrements, appelés blocs, qui sont connectés en toute sécurité à l'aide de la cryptographie.

Le terme blockchain a gagné son nom en raison de la manière dont il conserve les données de transaction, c'est-à-dire dans des blocs qui sont connectés les uns aux autres pour créer une chaîne . La taille de la blockchain augmente avec l'augmentation du nombre de transactions effectuées.

Toutes les données de transaction valides sont enregistrées dans le réseau de blockchain, qui est régi par des règles d'égal à égal stipulées par les participants. Par exemple, ces données peuvent contenir la "valeur" du bloc, comme dans les monnaies numériques, un enregistrement des transactions (comme lorsque les parties échangent des biens et des services), ou des privilèges de droits comme lorsque la chaîne enregistre des informations sur la propriété.

Outre les données de transaction, chaque bloc peut contenir son propre hachage cryptographique (un identifiant unique ou une empreinte numérique), sa propre valeur nonce (un nombre aléatoire arbitraire utilisé une fois dans les calculs cryptographiques), le hachage du bloc précédent et un horodatage du récent transactions authentifiées.

Étant donné que chaque nouveau bloc doit pointer vers le bloc précédent, si un bloc est incorporé dans la chaîne sans contenir le hachage droit du dernier bloc, il pourrait rendre la blockchain entière invalide. Cette propriété d'immuabilité est la clé de la sécurité des chaînes de blocs.

En outre, divers types de protocoles de consensus sont souvent appliqués pour maintenir l'authenticité de la chaîne de blocs. Le consensus garantit que tous les participants acceptent les transactions validées par le réseau.

Par exemple, un protocole de consensus couramment utilisé est une preuve de travail, qui vise à identifier un nombre qui trouve une solution à un problème mathématique compliqué après avoir terminé un certain nombre de

L'idée principale du travail de preuve est que tout participant au réseau de la chaîne de blocs devrait trouver ce nombre difficile à identifier mais facilement vérifiable. Par conséquent, cela décourage le spam et la falsification de la structure de la blockchain.

Dans le cas de la plupart des crypto-monnaies, l'ajout d'un nouveau bloc à la blockchain nécessite de résoudre une équation mathématique complexe, qui augmente en difficulté avec le temps à mesure que la blockchain grandit. Par conséquent, toute personne qui prouve qu'elle a fait du travail en résolvant ce problème est compensée par une monnaie numérique, dans un processus appelé «extraction».

Comment créer un bloc

Maintenant, après avoir introduit la blockchain la technologie et son fonctionnement, voyons comment appliquer les concepts à la création d'un bloc. Comme mentionné précédemment, les blocs sont ce qui est lié entre eux pour former une blockchain.

Pour créer la monnaie smashingCoin j'utiliserai les classes JavaScript qui ont été introduites dans ES6.

Prêt?

Saluons les mains…

Voici le code de la classe CryptoBlock :

 const SHA256 = require ('crypto-js / sha256');
classe CryptoBlock {
    constructeur (index, horodatage, données, PreviousHash = "") {
     this.index = index;
     this.timestamp = timestamp;
     this.data = données;
     this.precedingHash = PreviousHash;
     this.hash = this.computeHash ();
    }
    computeHash () {
        retourner SHA256 (this.index + this.precedingHash + this.timestamp + JSON.stringify (this.data)). toString ();
    }
}

Comme vous pouvez le voir dans le code ci-dessus, j'ai créé la classe CryptoBlock et y ai ajouté la méthode constructor () – tout comme cela se fait dans n'importe quelle autre classe JavaScript. Ensuite, pour initialiser ses propriétés, j'ai affecté les paramètres suivants à la méthode du constructeur :

index C'est un nombre unique qui suit la position de chaque bloc dans toute la chaîne de blocs.
horodatage Il conserve un enregistrement de l'heure de survenance de chaque transaction terminée.
données Il fournit des données sur les transactions terminées, telles que les détails de l'expéditeur, les détails du destinataire et la quantité traitée.
precedentHash [19659036] Il pointe vers le hachage du bloc précédent dans la blockchain, quelque chose d'important pour maintenir l'intégrité de la blockchain.

De plus, j'ai utilisé la méthode computeHash pour calculer le hachage du bloc en fonction de ses propriétés , comme indiqué dans les données ci-dessus.

Comme vous pouvez le voir, j'ai importé la bibliothèque JavaScript crypto-js et utilisé son module crypto-js / sha256 pour calculer le hachage de chaque bloc. Étant donné que le module renvoie un objet numérique, j'ai utilisé la méthode toString () pour le convertir en chaîne.

Pour ajouter la bibliothèque crypto-js à votre projet, accédez au terminal et exécutez la commande suivante pour l'installer en utilisant npm :

 npm install --save crypto-js

Après avoir exécuté la commande ci-dessus, le répertoire des modules de noeud, qui contient la bibliothèque et d'autres fichiers essentiels, sera ajouté au dossier de votre projet.

Comment créer une chaîne de blocs

Comme expliqué précédemment, la technologie de la chaîne de blocs est basé sur le concept que tous les blocs sont enchaînés les uns aux autres. Créons donc une classe CryptoBlockchain qui sera chargée de gérer les opérations de toute la chaîne. C'est là que le caoutchouc va rencontrer la route.

La classe CryptoBlockchain maintiendra les opérations de la blockchain en utilisant des méthodes d'assistance qui accomplissent différentes tâches, telles que la création de nouveaux blocs et leur ajout à la chaîne .

Voici le code de la classe CryptoBlockchain :

 classe CryptoBlockchain {
    constructeur(){
        this.blockchain = [this.startGenesisBlock()];
    }
    startGenesisBlock () {
        retourner un nouveau CryptoBlock (0, "01/01/2020", "Bloc initial dans la chaîne", "0");
    }
    getLatestBlock () {
        renvoyer this.blockchain [this.blockchain.length - 1];
    }
    addNewBlock (newBlock) {
        newBlock.precedingHash = this.obtainLatestBlock (). hash;
        newBlock.hash = newBlock.computeHash ();
        this.blockchain.push (newBlock);
    }
}

Permettez-moi de parler des rôles de chacune des méthodes d'assistance qui constituent la classe CryptoBlockchain .

1. Constructor Method

Cette méthode instancie la blockchain. À l'intérieur du constructeur, j'ai créé la propriété blockchain qui fait référence à un tableau de blocs. Notez que je lui ai transmis la méthode startGenesisBlock () qui crée le bloc initial de la chaîne.

2. Création du bloc Genesis

Dans une chaîne de blocs, le bloc Genesis fait référence au tout premier bloc créé sur le réseau. Chaque fois qu'un bloc est intégré au reste de la chaîne, il doit référencer le bloc précédent.

Inversement, dans le cas de ce bloc initial, il n'a pas de bloc précédent sur lequel pointer. Par conséquent, un bloc de genèse est généralement codé en dur dans la chaîne de blocs. De cette façon, les blocs suivants peuvent être créés dessus. Il a généralement un index de 0.

J'ai utilisé la méthode startGenesisBlock () pour créer le bloc genesis. Notez que je l'ai créé à l'aide de la classe CryptoBlock et que j'ai passé l'index horodatage données et précédant Hash paramètres.

3. Obtention du dernier bloc

L'obtention du dernier bloc dans la chaîne de blocs aide à garantir que le hachage du bloc actuel pointe vers le hachage du bloc précédent - préservant ainsi l'intégrité de la chaîne.

J'ai utilisé le getLatestBlock () méthode pour le récupérer.

4. Ajout de nouveaux blocs

J'ai utilisé la méthode addNewBlock () pour ajouter un nouveau bloc à la chaîne. Pour ce faire, j'ai défini le hachage précédent du nouveau bloc comme étant égal au hachage du dernier bloc de la chaîne - garantissant ainsi que la chaîne est inviolable.

Étant donné que les propriétés du nouveau bloc sont modifiées à chaque nouveau calcul, il est important de calculer à nouveau son hachage cryptographique. Après avoir mis à jour son hachage, le nouveau bloc est poussé dans le tableau de la blockchain.

En réalité, ajouter un nouveau bloc à une blockchain n'est pas si facile à cause des nombreuses vérifications qui ont été placées. Néanmoins, pour cette simple crypto-monnaie, il suffit de montrer comment fonctionne réellement une blockchain.

Test de la blockchain

Maintenant, testons notre blockchain simple et voyons si cela fonctionne.

Voici le code:

 laissez smashingCoin = new CryptoBlockchain ();
smashingCoin.addNewBlock (nouveau CryptoBlock (1, "01/06/2020", {expéditeur: "Iris Ljesnjanin", destinataire: "Cosima Mielke", quantité: 50}));
smashingCoin.addNewBlock (nouveau CryptoBlock (2, "01/07/2020", {expéditeur: "Vitaly Friedman", destinataire: "Ricardo Gimenes", quantité: 100}));
console.log (JSON.stringify (smashingCoin, null, 4));

Comme vous pouvez le voir dans le code ci-dessus, j'ai créé une nouvelle instance de la classe CryptoBlockchain et l'ai nommée smashingCoin . Ensuite, j'ai ajouté deux blocs dans la blockchain en utilisant des valeurs arbitraires. Dans le paramètre data j'ai utilisé un objet et ajouté les détails de l'expéditeur, les détails du destinataire et la quantité traitée.

Si j'exécute le code sur le terminal, voici la sortie que j'obtiens:

 Comment une blockchain ressemble à sous le capot
Test pour voir si notre blockchain fonctionne. ( Grand aperçu )

Voilà à quoi ressemble le smashingCoin !
Il s'agit d'un objet qui contient la propriété blockchain qui est un tableau contenant tous les blocs de la chaîne. Comme vous pouvez le voir dans l'image ci-dessus, chaque bloc fait référence au hachage du bloc précédent. Par exemple, le deuxième bloc fait référence au hachage du premier bloc.
Après avoir testé et vu que notre blockchain fonctionne, ajoutons quelques fonctionnalités supplémentaires pour améliorer les fonctionnalités du smashingCoin .

Comment vérifier l'intégrité de la blockchain

Comme mentionné précédemment, une caractéristique clé d'une blockchain est qu'une fois qu'un bloc a été ajouté à la chaîne, il ne peut pas être modifié sans invalider l'intégrité du reste de la chaîne.

Par conséquent, pour vérifier l'intégrité de la blockchain, j'ajouterai checkChainValidity ( ) méthode à la classe CryptoBlockchain .

Les hachages sont essentiels pour garantir la validité et la sécurité d'une blockchain car tout changement dans le contenu d'un bloc entraînera la production d'un hachage entièrement nouveau

En tant que telle, la méthode checkChainValidity () utilisera les instructions if pour vérifier si le hachage de chaque bloc a été falsifié. À partir du premier bloc créé, il bouclera sur toute la chaîne de blocs et vérifiera sa validité. Notez que puisque le bloc de genèse a été codé en dur, il ne sera pas vérifié.

De plus, la méthode vérifiera si les hachages de chacun des deux blocs consécutifs pointent l'un vers l'autre. Si l'intégrité de la blockchain n'a pas été compromise, elle retourne vrai; sinon, en cas d'anomalie, elle retourne false.

Voici le code:

 checkChainValidity () {
        for (let i = 1; i 

Comment ajouter une preuve de travail

Comme mentionné précédemment, la preuve de travail est le concept appliqué pour augmenter la difficulté entraînée par l'extraction ou l'ajout de nouveaux blocs à la blockchain.

Dans Dans le cas de smashingCoin je vais utiliser un algorithme simple qui dissuade les gens de générer facilement de nouveaux blocs ou de spammer la blockchain.

Donc, dans la classe CryptoBlock je vais ajoutez une autre méthode appelée proofOfWork (). Essentiellement, cet algorithme simple identifie un nombre, passé en tant que propriété de difficulté de sorte que le hachage de chaque bloc contient des zéros de début qui correspondent à ce niveau de difficulté .

Le fait de s'assurer que le hachage de chaque bloc commence par le nombre de zéros défini dans le niveau de difficulté nécessite beaucoup de puissance de calcul. Plus le niveau de difficulté est élevé, plus le temps qu'il faut pour extraire de nouveaux blocs.

De plus, je vais ajouter une valeur aléatoire nonce pour chaque bloc haché de telle sorte que, lors du ré-hachage, les restrictions de niveau de difficulté peuvent toujours être respectées.

Voici le code:

 proofOfWork (difficulté) {
      while (this.hash.substring (0, difficulté)! == Array (difficulté + 1) .join ("0")) {
          this.nonce ++;
          this.hash = this.computeHash ();
      }
  }

Et, voici la méthode computeHash () mise à jour avec la variable nonce incluse:

 computeHash () {
        retourner SHA256 (this.index + this.precedingHash + this.timestamp + JSON.stringify (this.data) + this.nonce) .toString ();
    }

De plus, pour implémenter le mécanisme de preuve de travail dans la génération de nouveaux blocs, je l'inclurai dans la méthode addNewBlock () :

 addNewBlock (newBlock) {
      newBlock.precedingHash = this.obtainLatestBlock (). hash;
      //newBlock.hash = newBlock.computeHash ();
      newBlock.proofOfWork (this.difficulty);
      this.blockchain.push (newBlock);
  }

Conclusion

Voici le code complet pour construire la crypto-monnaie smashingCoin à l'aide de Node.js:

 const SHA256 = require ("crypto-js / sha256");
classe CryptoBlock {
  constructeur (index, horodatage, données, PreviousHash = "") {
    this.index = index;
    this.timestamp = timestamp;
    this.data = données;
    this.precedingHash = PreviousHash;
    this.hash = this.computeHash ();
    this.nonce = 0;
  }

  computeHash () {
    retourner SHA256 (
      this.index +
        this.precedingHash +
        this.timestamp +
        JSON.stringify (this.data) +
        this.nonce
    ) .toString ();
  }

  proofOfWork (difficulté) {
    tandis que (
      this.hash.substring (0, difficulté)! == Array (difficulté + 1) .join ("0")
    ) {
      this.nonce ++;
      this.hash = this.computeHash ();
    }
  }
}

class CryptoBlockchain {
  constructeur () {
    this.blockchain = [this.startGenesisBlock()];
    this.difficulty = 4;
  }
  startGenesisBlock () {
    retourner un nouveau CryptoBlock (0, "01/01/2020", "Bloc initial dans la chaîne", "0");
  }

  getLatestBlock () {
    renvoyer this.blockchain [this.blockchain.length - 1];
  }
  addNewBlock (newBlock) {
    newBlock.precedingHash = this.obtainLatestBlock (). hash;
    //newBlock.hash = newBlock.computeHash ();
    newBlock.proofOfWork (this.difficulty);
    this.blockchain.push (newBlock);
  }

  checkChainValidity () {
    for (let i = 1; i 

Si j'exécute le code sur le terminal, voici la sortie que j'obtiens:

 Sortie de création d'une simple crypto-monnaie dans Node.js
Enfin, notre smashingCoin crypto-monnaie! ( Grand aperçu )

Comme vous pouvez le voir sur l'image ci-dessus, les hachages commencent maintenant par quatre zéros, ce qui correspond au niveau de difficulté défini dans le mécanisme de preuve de travail.

Conclusion

Ça y est! Voilà comment vous pouvez créer une blockchain de crypto-monnaie simple en utilisant Node.js.

Bien sûr, la crypto-monnaie smashingCoin est loin d'être terminée. En fait, si vous publiez sans apporter d'autres améliorations, il est peu probable qu'il réponde aux demandes actuelles du marché pour une monnaie numérique sécurisée, fiable et intuitive - ce qui fait de vous le seul à l'utiliser!

Néanmoins, j'espère que ce didacticiel vous a fourni quelques éléments de base compétences pour vous mouiller les pieds dans le monde passionnant des cryptos.

Si vous Pour tout commentaire ou question, veuillez les publier ci-dessous.

Autres ressources

 Éditorial fracassant (dm, il)




Source link