Maison  >  Article  >  développement back-end  >  PHP construit une blockchain (y compris le code source)

PHP construit une blockchain (y compris le code source)

烟雨青岚
烟雨青岚original
2020-06-13 18:07:275249parcourir

PHP construit une blockchain (y compris le code source)

php construit une blockchain (y compris le code source)

Nous allons utiliser le langage de programmation PHP pour construire une blockchain, la blockchain elle-même est un concept très simple, c'est une structure de données très simple, les monnaies numériques sont très complexes, mais les blockchains ne le sont pas, la raison pour laquelle elles sont complexes est l'algorithme de consensus, le mécanisme d'extraction et leur exécution. mais la blockchain elle-même est assez facile à comprendre. Avant de vraiment comprendre comment fonctionne une blockchain, que devez-vous savoir ? Qu'est-ce qu'un hachage ? Comment fonctionnent-ils ?

Un hachage est essentiellement une signature numérique d'un certain type de données, par exemple vous pouvez prendre un film, vous pouvez le hacher et obtenir une signature numérique, vous pouvez prendre un e-mail, vous pouvez le hacher et obtenir un ; signature numérique ; Vous pouvez également prendre un mot et le hacher. Vous pouvez prendre n'importe quelle donnée et la hacher, et vous pouvez obtenir une valeur de hachage. Il signe simplement numériquement ces données.

Comment fonctionne réellement ce hachage ? Regardons de plus près.

Nous allons construire la blockchain en PHP, ce sera très simple, si vous connaissez un peu la programmation, vous pouvez aussi le faire dans un autre langage, si vous sans rien connaître à propos de la programmation, je pense que vous pouvez toujours avoir une compréhension générale de son fonctionnement, parlons donc du hachage.

<?php
    $list1 = ["a","b","c"];
    $list2 = ["a","b","c"];
    echo "list 1: ".md5(serialize($list1));
    echo "<br/>list 2: ".md5(serialize($list2));
?>

Comme vous pouvez le voir, nous avons deux listes, nous avons deux listes contenant a, b, c, voici les données, voici la chaîne que nous essayons de hacher, voyons quel type de signature numérique que nous obtenons des listes 1 et 2.

Résultat de sortie :

list 1: ec10e0c7a344da191700ab4ace1a5e26
list 2: ec10e0c7a344da191700ab4ace1a5e26

Vous pouvez voir que lorsque nous obtenons ces deux chaînes de hachage ou signatures numériques, ces deux-là sont identiques.

Si je change maintenant le contenu de la liste 1, par exemple :

<?php
    $list1 = ["aaa","b","c"]; //Changed
    $list2 = ["a","b","c"];
    echo "list 1: ".md5(serialize($list1));
    echo "<br/>list 2: ".md5(serialize($list2));
?>

Maintenant, je lance ceci :

list 1: 97f4361000fdba1732a50f1771c9d830
list 2: ec10e0c7a344da191700ab4ace1a5e26

Vous pouvez voir que nous devenons complètement différents signature numérique, donc si je fais juste une petite modification, je me contente de modifier les données et j'essaie de changer quoi que ce soit dans cette liste, j'obtiendrai une signature numérique complètement différente, et c'est la base de la technologie blockchain car La blockchain est une liste de blocs, essentiellement une liste chaînée de blocs et chaque bloc contient la signature numérique du bloc précédent et la signature numérique du bloc suivant est basée sur la signature numérique du bloc actuel, ils sont donc toujours liés ensemble, la signature suivante sera basée sur la signature actuelle et la signature actuelle est basée sur la signature précédente, donc si vous modifiez quelque chose dans le passé, vous briserez toutes les signatures et elles auront un aspect complètement différent.

Comment coder

Commençons réellement par coder notre blockchain, la première chose que nous devons faire est de parler de notre classe Block, dans ce cas notre bloc sera très simple, il ne contiendra que trois choses, il contiendra la liste des transactions survenues dans ce bloc, il contiendra le hachage précédent ou la signature numérique du bloc précédent, il contiendra également le hachage lui-même, ce Le hachage sera basé sur la transaction et le hachage précédent, donc si quelqu'un modifie quelque chose dans le bloc précédent, la signature numérique du bloc actuel changera et changera la signature numérique du bloc suivant.

Régénérez le projet PHP vide en utilisant votre IDE préféré, j'utilise XAMPP sur un environnement localhost.

Créez maintenant un nouveau fichier block.php et insérez-y l'extrait de code suivant.

<?php
    class Block{
              private $previousHash;
              private $transactions=[];
              private $blockHash;
              function __construct($previousHash,$transactions){
                             $this->previousHash = $previousHash;
                             $this->transactions = $transactions;
                             $contents = [md5(serialize($transactions)),$previousHash];
                             $this->blockHash = md5(serialize($contents));
              }
              function getPreviousHash(){
                             return $this->previousHash;
              }
              function getTransactions(){
                             return $this->transactions;
              }
              function getBlockHash(){
                             return $this->blockHash;
              }
    }
?>

Créez maintenant un autre fichier appelé index.php et utilisez la classe block.php pour créer des blocs.

index.php

<?php
    include("block.php");
    $genesisTransaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $genenisBlock = new Block(0, $genesisTransaction);
    $block1Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block1 = new Block($genenisBlock->getBlockHash(), $block1Transaction);
    $block2Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block2 = new Block($block1->getBlockHash(), $block2Transaction);
    echo "Genesis Block: ".$genenisBlock->getBlockHash();
    echo "<br/>Block 1: ".$block1->getBlockHash();
    echo "<br/>Block 2: ".$block2->getBlockHash();
?>

Résultat de sortie :

Genesis Block: d9c559b57e148b19802d8e70555f0303
Block 1: 29e9e5a309aae81243fdf73112253c74
Block 2: fbff8f664f6b4069bf7288cb1b86cb3a

Veuillez voir que le hachage actuel sera basé sur le précédent hachage, Si vous modifiez une transaction précédente, toutes vos signatures numériques seront valides, par exemple, dans GenesisTransaction, j'ai changé 11 en 12, le résultat sera complètement différent, comme :

<?php
    include("block.php"); 
    $genesisTransaction = ["a sends 12 bitcoins to b","b sends 44 bitcoins to c"]; //changed 11 to 12
    $genenisBlock = new Block(0, $genesisTransaction);
    $block1Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block1 = new Block($genenisBlock->getBlockHash(), $block1Transaction);
    $block2Transaction = ["a sends 11 bitcoins to b","b sends 44 bitcoins to c"];
    $block2 = new Block($block1->getBlockHash(), $block2Transaction);
    echo "Genesis Block: ".$genenisBlock->getBlockHash();
    echo "<br/>Block 1: ".$block1->getBlockHash();
    echo "<br/>Block 2: ".$block2->getBlockHash();
?>

Résultat de sortie :

Genesis Block: d9c559b57e148b19802d8e70555f0303
Block 1: 29e9e5a309aae81243fdf73112253c74
Block 2: fbff8f664f6b4069bf7288cb1b86cb3a

你可以看到任何一个交易的变化,在一个块中的任何一个数据将传播和改变未来的区块链中所有的数字签名,这就是区块链的工作原理,因为如果我改变了什么,每个人都会看到我的数字签名完全不同于其他人,所以这意味着我在欺骗别人。就如同我告诉每个人,嘿,一个人给了我很多比特币,这里是区块链,请每个人确认下。每个人将查看它并说清楚,我们知道这个区块链无法确认这一点,因为我们有自己版本的区块链,数字签名会是完全不同,所以这不行。

我希望你能理解通过它们的数字签名将区块的哈希链接在一起的这一基本概念。在你的PHP中实现这个例子吧。

本文转自:https://blog.csdn.net/mongo_node/article/details/81700425

推荐教程:《php教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn