Si nous regardons les tendances des dernières années, nous avons tout le temps entendu parler de la blockchain, mais pas beaucoup des détails.
Nous savons tous que les crypto-monnaies telles que Bitcoin, Ethereum, Dogecoin, Matic et autres reposent sur la technologie blockchain. La blockchain a mené les événements importants qui ont révolutionné de nombreuses industries en 2021 et ouvert la voie à de nouvelles réalisations.
La blockchain est un moyen de stocker des données d'une manière difficile ou impossible à modifier, pirater ou escroquer. Il s'agit d'un registre numérique de transactions qui sont dupliquées et réparties sur l'ensemble du réseau de systèmes informatiques de la blockchain.
C'est la technologie de base de données révolutionnaire qui alimente pratiquement toutes les crypto-monnaies. La blockchain rend incroyablement difficile le piratage ou la fraude du système en diffusant des copies identiques d'une base de données sur l'ensemble d'un réseau.
Bien que Bitcoin soit désormais l'utilisation la plus importante de la blockchain, la technologie peut servir une très grande variété d'applications.
Les crypto-monnaies et les blockchains ont été de plus en plus populaires ces dernières années, et cette tendance devrait se poursuivre.
Nous allons créer une blockchain simple avec JavaScript dans ce tutoriel. Il vous fournira une compréhension de base du fonctionnement d'une blockchain.
Appelons-le MelodyCoin et passons directement à l'action !
Création d'un bloc
Pour commencer, nous allons créer un nouveau fichier JavaScript dans lequel nous placerons tout notre code.
Appelons-le main.js et commençons par une description de l'apparence d'une blockchain et de blocs.
Créez une classe Block et attribuez-lui une fonction Object() { [code natif] } pour commencer.
Vous devez donner une date, et le hash du bloc précédent lors de la création d'un nouveau bloc :
Voici les définitions pour chaque propriété :
- L'horodatage indique quand le blocage a été effectué. Vous pouvez utiliser le format de votre choix (dans ce cas, un horodatage UNIX).
- Toute forme de données que vous souhaitez connecter à ce bloc peut être incluse dans le paramètre data. Si vous souhaitez créer une crypto-monnaie, vous pouvez conserver ici les données de transaction telles que l'expéditeur/destinataire et le montant d'argent transféré.
- Le previousHash est une chaîne qui contient le hachage du bloc précédent. C'est ce qui générera la chaîne de blocs, qui sera essentielle pour assurer l'intégrité de notre blockchain plus tard.
Création de hachages
Chaque bloc est lié au bloc précédent (donc la propriété previousHash). Autrement dit, chaque bloc nécessite un hachage. Un hachage est similaire à une empreinte digitale. Il est distinct pour chaque bloc.
Le hachage d'un bloc peut être calculé en faisant passer tout son contenu par une fonction de hachage.
Alors, commençons par implémenter une fonction qui calcule le hachage du bloc courant.
Ainsi, sous la classe Block, nous définissons la fonction calculateHash :
Cependant, le hachage SHA256 n'est pas pris en charge par JavaScript et doit être obtenu à partir d'une bibliothèque externe.
Crypto-js est un package fantastique qui inclut des implémentations sécurisées de plusieurs algorithmes de hachage.
Ensuite, nous pouvons l'importer dans notre code main.js.
Maintenant que nous avons notre fonction calculateHash(), utilisons-la dans notre fonction Block :
Après avoir décrit à quoi ressemble un Block, nous pouvons définir à quoi devrait ressembler une Blockchain. Créons donc une nouvelle classe.
Dans ce scénario, la blockchain est un objet très simple qui a une chaîne de propriétés. Il s'agit d'un tableau contenant tous les blocs de la chaîne.
Avant de pouvoir ajouter des blocs, nous devons d'abord créer ce que l'on appelle un "bloc de genèse". C'est le premier bloc de la chaîne, et il est unique en ce sens qu'il ne peut pointer vers un bloc précédent (c'est le premier !).
Donc, pour construire le bloc genesis, je vais ajouter une fonction à notre classe nommée createGenesisBlock(). Retour dans la fonction Object() { [native code] } de notre classe Blockchain.
Nous pouvons désormais inclure le bloc genesis chaque fois que nous construisons une nouvelle instance Blockchain :
Méthodes Blockchain
Maintenant, ajoutons des méthodes à notre classe Blockchain qui nous permettront de faire des choses comme ajouter de nouveaux blocs et récupérer le bloc le plus récent.
La fonction getLatestBlock est la plus basique. Il renvoie simplement le dernier membre du tableau de chaînes :
La technique addBlock est un peu plus complexe.
Avant de pouvoir ajouter un nouveau bloc à notre chaîne, nous devons d'abord définir correctement le champ previousHash de ce bloc.
Il doit être défini sur le hachage du bloc le plus récemment ajouté à notre chaîne. Nous devons également calculer le hachage du nouveau bloc :
Essais
Voyons comment notre MelodyCoin est sorti.
Créez une instance de blockchain pour y parvenir. Ajoutons quelques blocs supplémentaires :
Nous y avons créé deux nouveaux blocs. Jetons un coup d'œil à ce à quoi ressemble actuellement notre blockchain.
MelodyCoin sera stringifié et formaté avec quatre espaces :
Vérifier l'intégrité de la Blockchain
Les blockchains sont fantastiques car une fois qu'un bloc a été ajouté, il ne peut pas être modifié sans invalider le reste de la chaîne.
Cependant, il n'y a aucune méthode pour moi pour vérifier l'intégrité de notre blockchain avec cette implémentation.
Introduisons une fonction isChainValid dans notre blockchain. Si la chaîne est légitime, elle renverra true ; sinon, il retournera false :
Intégrité des tests
Nous pouvons maintenant mettre à l'épreuve l'intégrité de notre blockchain. Si nous l'exécutons maintenant, cela confirmera que notre chaîne est authentique.
Essayons maintenant de falsifier notre blockchain. Modifions le bloc 2 et écrasons son contenu (supposons que nous avons transféré 100 pièces au lieu de quatre).
Lorsque nous exécutons cela, nous pouvons voir que le logiciel reconnaît nos efforts pour altérer la chaîne.
Cependant, vous pouvez croire qu'il existe une autre méthode pour que je m'en mêle. J'ai modifié le contenu du bloc mais je n'ai pas recalculé le hachage. Vous pouvez donc essayer d'être intelligent et recalculer le hachage de ce même bloc.
C'est tout ce qu'il y avait dans notre petite configuration de blockchain ! Cela nous permet d'ajouter de nouveaux blocs et de détecter la falsification des données au sein de la chaîne.
Il y a deux problèmes avec notre petite blockchain que nous devons résoudre :
- Les ordinateurs modernes sont extrêmement rapides et peuvent ajouter des milliers de blocs à notre chaîne en quelques secondes. Nous ne voulons évidemment pas que quiconque spamme notre blockchain.
- Notre blockchain est toujours vulnérable à la falsification. Vous pouvez mettre à jour le contenu d'un bloc, puis simplement recalculer les hachages (et les hachages précédents) pour tous les blocs suivants. Même si vous jouez avec, vous vous retrouverez avec une chaîne légitime.
Pour répondre à ces préoccupations, les blockchains utilisent une technique connue sous le nom de « preuve de travail ». Vous devez démontrer que vous avez utilisé une quantité importante de ressources de calcul pour créer un bloc à l'aide de cette approche. Cela s'appelle aussi santé respiratoire exploitation minière.
La preuve de travail nécessite que le hachage d'un bloc commence par un nombre spécifique de zéros. Mais comment savoir si votre hash respecte cette règle ?
Le contenu d'un bloc détermine son hachage. On obtient donc toujours le même hash, à condition de ne pas modifier le contenu.
Chaque bloc doit avoir une valeur nonce ajoutée comme solution. Il s'agit essentiellement de données aléatoires que nous pouvons mettre à jour jusqu'à ce que le hachage de notre bloc commence par suffisamment de zéros. Parce que vous ne pouvez pas modifier la sortie d'une fonction de hachage, vous devez tester de nombreuses combinaisons différentes et espérer le meilleur.
Introduire l'exploitation minière à la Blockchain
Commençons par inclure un nonce dans notre classe Block. Le nonce est la valeur unique dans notre bloc que nous pouvons modifier pour avoir un impact sur le hachage du bloc.
Nous ne sommes pas en mesure de modifier l'horodatage ou les données.
Ensuite, écrivons une fonction mineBlock() qui effectuera l'extraction réelle d'un bloc. Cette fonction recevra la difficulté nécessaire en tant que paramètre et continuera à s'exécuter jusqu'à ce que le hachage de notre bloc commence par suffisamment de zéros.
Je viens de créer une boucle while de base qui s'exécuterait jusqu'à ce que notre hachage commence par suffisamment de zéros. Nous utilisons la difficulté pour déterminer combien de zéros sont nécessaires. Avec une difficulté de 5, notre hachage doit commencer par 5 zéros.
Lorsque notre hachage ne contient pas assez de zéros, nous augmentons le nonce de un et recalculons le hachage. Et si on trouve un hash qui correspond à la difficulté, on le connecte à la console.
Il nous reste encore une chose à faire. Nous ne prenons pas vraiment en compte la variable nonce dans notre méthode calculateHash, alors la voici :
Classe Blockchain
Mettons cette nouvelle approche à l'épreuve dans notre classe blockchain et voyons comment cela se passe.
Pour commencer, je vais définir la difficulté de notre blockchain dans la fonction Object(). Nous le définissons ici puisque nous pouvons l'utiliser quelque part plus tard.
La fonction addBlock doit alors être modifiée de manière à extraire le bloc avant de l'ajouter à notre chaîne.
Utiliser la Blockchain
Maintenant, utilisons notre nouvelle blockchain avec l'algorithme de preuve de travail. Ici, ajoutez quelques instructions console.log.
Lorsque nous exécutons ce code, nous pouvons observer que le processus de minage n'est plus particulièrement rapide.
Il faut un certain temps à l'algorithme pour générer des blocs avec des hachages commençant par trois zéros (tel que configuré par la difficulté).
C'était donc la fin de notre configuration de base de la blockchain.
Nous pouvons réguler la rapidité avec laquelle de nouveaux blocs sont ajoutés à notre blockchain grâce au mécanisme de preuve de travail.
C'est la fonctionnalité de sécurité la plus importante sur les blockchains. Et maintenant que vous comprenez comment cela fonctionne, créez le vôtre !
Soyez sympa! Laissez un commentaire