php erstellt eine Blockchain (einschließlich Quellcode)
Wir werden zum Erstellen die Programmiersprache PHP verwenden Eine Blockchain, die Blockchain selbst ist ein sehr einfaches Konzept, es ist eine sehr einfache Datenstruktur, digitale Währungen sind sehr komplex, Blockchains jedoch nicht. Der Grund, warum sie komplex sind, ist der Konsensalgorithmus, der Mining-Mechanismus und alles, was darauf läuft. Aber die Blockchain selbst ist ziemlich einfach zu verstehen. Was müssen Sie wissen, bevor Sie wirklich verstehen, wie die Blockchain funktioniert? Was müssen Sie wissen, ist ein Hash? Wie funktionieren sie?
Ein Hash ist im Grunde eine digitale Signatur einer Art von Daten. Sie können beispielsweise einen Film aufnehmen, ihn hashen und eine digitale Signatur erhalten digitale Signatur; Sie können auch ein Wort nehmen und es hashen. Sie können beliebige Daten nehmen und es hashen, und Sie können einen Hash-Wert erhalten. Die Daten werden lediglich digital signiert.
Wie funktioniert dieser Hash eigentlich? Schauen wir genauer hin.
Wir werden die Blockchain in PHP erstellen, es wird sehr einfach sein, wenn Sie ein wenig Programmierkenntnisse haben, können Sie es auch in einer anderen Sprache tun, wenn Sie nichts wissen Was das Programmieren angeht, denke ich, dass man immer noch ein allgemeines Verständnis davon bekommen kann, wie es funktioniert, also lasst uns über Hashing sprechen.
<?php $list1 = ["a","b","c"]; $list2 = ["a","b","c"]; echo "list 1: ".md5(serialize($list1)); echo "<br/>list 2: ".md5(serialize($list2)); ?>
Wie Sie sehen können, haben wir zwei Listen, wir haben zwei Listen mit a, b, c, das sind die Daten, das ist die Zeichenfolge, die wir zu hashen versuchen, mal sehen, welche Art der digitalen Signatur erhalten wir aus den Listen 1 und 2.
Ausgabeergebnis:
list 1: ec10e0c7a344da191700ab4ace1a5e26 list 2: ec10e0c7a344da191700ab4ace1a5e26
Sie können sehen, dass diese beiden identisch sind, wenn wir diese beiden Hash-Strings oder digitalen Signaturen erhalten.
Wenn ich jetzt den Inhalt in Liste1 ändere, zum Beispiel:
<?php $list1 = ["aaa","b","c"]; //Changed $list2 = ["a","b","c"]; echo "list 1: ".md5(serialize($list1)); echo "<br/>list 2: ".md5(serialize($list2)); ?>
Jetzt führe ich Folgendes aus:
list 1: 97f4361000fdba1732a50f1771c9d830 list 2: ec10e0c7a344da191700ab4ace1a5e26
Sie können sehen, dass wir völlig anders werden Wenn ich also nur eine kleine Änderung vornehme, mich einfach in die Daten einmischte und versuchte, irgendetwas in dieser Liste zu ändern, erhalte ich eine völlig andere digitale Signatur, und das ist die Grundlage der Blockchain-Technologie, weil Blockchain ist eine Liste von Blöcken, im Grunde eine verknüpfte Liste von Blöcken, und jeder Block enthält die digitale Signatur des vorherigen Blocks und die digitale Signatur des nächsten Blocks basiert auf der digitalen Signatur des aktuellen Blocks, sodass sie immer miteinander verknüpft sind. Die nächste Signatur basiert auf der aktuellen Signatur und die aktuelle Signatur basiert auf der vorherigen Signatur. Wenn Sie also in der Vergangenheit etwas ändern, werden alle Signaturen beschädigt und sie sehen völlig anders aus.
So programmieren Sie
Beginnen wir tatsächlich mit dem Codieren unserer Blockchain. Als Erstes müssen wir über unsere Block-Klasse sprechen, in diesem Fall Unser Block wird sehr einfach sein, er wird nur drei Dinge enthalten, er wird die Liste der Transaktionen enthalten, die in diesem Block stattgefunden haben, er wird den vorherigen Hash oder die digitale Signatur des vorherigen Blocks enthalten, er wird auch den Hash selbst enthalten, dies Der Hash basiert auf der Transaktion und dem vorherigen Hash. Wenn also jemand etwas im vorherigen Block ändert, ändert sich die digitale Signatur des aktuellen Blocks und die digitale Signatur des nächsten Blocks.
Generieren Sie das leere PHP-Projekt mit Ihrer bevorzugten IDE neu. Ich verwende XAMPP in einer Localhost-Umgebung.
Erstellen Sie nun eine neue Datei block.php und fügen Sie darin den folgenden Codeausschnitt ein.
<?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; } } ?>
Erstellen Sie nun eine weitere Datei namens index.php und verwenden Sie die Klasse block.php, um einige Blöcke zu erstellen.
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(); ?>
Ausgabeergebnis:
Genesis Block: d9c559b57e148b19802d8e70555f0303 Block 1: 29e9e5a309aae81243fdf73112253c74 Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
Bitte beachten Sie, dass der aktuelle Hash auf dem vorherigen basiert Hash: Wenn Sie eine vorherige Transaktion ändern, sind alle Ihre digitalen Signaturen gültig. Wenn ich beispielsweise in genesisTransaction 11 in 12 geändert habe, wird eine völlig andere Ausgabe ausgegeben, etwa:
<?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(); ?>
Ausgabeergebnis:
Genesis Block: d9c559b57e148b19802d8e70555f0303 Block 1: 29e9e5a309aae81243fdf73112253c74 Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
你可以看到任何一个交易的变化,在一个块中的任何一个数据将传播和改变未来的区块链中所有的数字签名,这就是区块链的工作原理,因为如果我改变了什么,每个人都会看到我的数字签名完全不同于其他人,所以这意味着我在欺骗别人。就如同我告诉每个人,嘿,一个人给了我很多比特币,这里是区块链,请每个人确认下。每个人将查看它并说清楚,我们知道这个区块链无法确认这一点,因为我们有自己版本的区块链,数字签名会是完全不同,所以这不行。
我希望你能理解通过它们的数字签名将区块的哈希链接在一起的这一基本概念。在你的PHP中实现这个例子吧。
本文转自:https://blog.csdn.net/mongo_node/article/details/81700425
推荐教程:《php教程》
Das obige ist der detaillierte Inhalt vonPHP baut eine Blockchain auf (inkl. Quellcode). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!