Home >Backend Development >PHP Tutorial >PHP builds a blockchain (including source code)
php builds a blockchain (including source code)
We are going to use the PHP programming language to build a blockchain , the blockchain itself is a very simple concept, it is a very simple data structure, digital currencies are very complex, but blockchains are not, the reason why they are complex is the consensus algorithm, mining mechanism and running on them Everything, but the blockchain itself is pretty easy to understand, what do you need to know before you really understand how the blockchain works, what do you need to know is a hash? How do they work?
A hash is basically a digital signature of some kind of data, for example you can take a movie, you can hash it and get a digital signature; you can take an email, you can hash it and get a digital signature ; You can also take a word and hash it. You can take any data and hash it, and you can get a hash value. It just digitally signs that data.
How does this hash actually work? Let’s take a closer look.
We will build the blockchain in PHP, it will be very simple, if you know a little programming, you can also do it in another language, if you Without knowing anything about programming, I think you can still get a general understanding of how it works, so let's talk about hashes.
<?php $list1 = ["a","b","c"]; $list2 = ["a","b","c"]; echo "list 1: ".md5(serialize($list1)); echo "<br/>list 2: ".md5(serialize($list2)); ?>
As you can see, we have two lists, we have two lists containing a, b, c, this is the data, this is the string we are trying to hash, let Let's see what kind of digital signature we get from lists 1 and 2.
Output result:
list 1: ec10e0c7a344da191700ab4ace1a5e26 list 2: ec10e0c7a344da191700ab4ace1a5e26
You can see that when we get these two hash strings or digital signatures, these two are the same.
If I now change the content in list1, for example:
<?php $list1 = ["aaa","b","c"]; //Changed $list2 = ["a","b","c"]; echo "list 1: ".md5(serialize($list1)); echo "<br/>list 2: ".md5(serialize($list2)); ?>
Now I run it:
list 1: 97f4361000fdba1732a50f1771c9d830 list 2: ec10e0c7a344da191700ab4ace1a5e26
You can see that we get Completely different digital signature, so if I just make a small modification, I just meddle with the data, and I try to change anything in this list, I'm going to get a completely different digital signature, and this is the basis of blockchain technology because Blockchain is a list of blocks, basically a linked list of blocks and each block holds the digital signature of the previous block and the digital signature of the next block is based on the digital signature of the current block so they are always Linked together, the next signature will be based on the current signature and the current signature is based on the previous signature, so if you change anything in the past, you will break all the signatures and they will look completely different.
How to Coding
Let’s actually get into coding our blockchain, the first thing we need to do is talk about our Block class, in In this case our block will be very simple, it will contain only three things, it will contain the list of transactions that occurred in this block, it will contain the previous hash or digital signature of the previous block, it will also contain The hash itself, this hash will be based on the transaction and the previous hash, so if anyone changes anything in the previous block, the digital signature of the current block will change, and change the digital signature of the next block.
Regenerate the empty PHP project using your favorite IDE, I use XAMPP in a localhost environment.
Now create a new file block.php and put the following code snippet in it.
<?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; } } ?>
Now create another file called index.php and use the block.php class to create some blocks.
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(); ?>
Output result:
Genesis Block: d9c559b57e148b19802d8e70555f0303 Block 1: 29e9e5a309aae81243fdf73112253c74 Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
Please see that the current hash will be based on the previous hash, If you change any previous transaction, all your digital signatures will be valid, for example, in genesisTransaction, I changed 11 to 12, it will output completely different, like:
<?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(); ?>
Output result:
Genesis Block: d9c559b57e148b19802d8e70555f0303 Block 1: 29e9e5a309aae81243fdf73112253c74 Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
你可以看到任何一个交易的变化,在一个块中的任何一个数据将传播和改变未来的区块链中所有的数字签名,这就是区块链的工作原理,因为如果我改变了什么,每个人都会看到我的数字签名完全不同于其他人,所以这意味着我在欺骗别人。就如同我告诉每个人,嘿,一个人给了我很多比特币,这里是区块链,请每个人确认下。每个人将查看它并说清楚,我们知道这个区块链无法确认这一点,因为我们有自己版本的区块链,数字签名会是完全不同,所以这不行。
我希望你能理解通过它们的数字签名将区块的哈希链接在一起的这一基本概念。在你的PHP中实现这个例子吧。
本文转自:https://blog.csdn.net/mongo_node/article/details/81700425
推荐教程:《php教程》
The above is the detailed content of PHP builds a blockchain (including source code). For more information, please follow other related articles on the PHP Chinese website!