php構建一個區塊鏈(含源碼)
我們要用PHP編程語言構建區塊鏈,區塊鏈本身就是一個非常簡單的概念,它是一個非常簡單的數據結構,數字貨幣是很復雜,但區塊鏈不是,它們復雜的原因是共識算法,挖礦機制和運行在他們之上的一切,但區塊鏈本身是很容易理解的,在你真正了解區塊鏈是如何工作的之前,你需要知道什么,你需要知道什么是哈希hash?它們是如何工作的?
哈希基本上是某種數據的數字簽名,例如可以拍一部電影,可以hash它并得到一個數字簽名;可以拿一封電子郵件,可以把它hash并得到一個數字簽名;還可以拿一個字,也可以hash它,你可以拿任何數據,然后hash它,你都可以得到一個hash值。它只是對該數據進行數字簽名。
這個hash哈希實際上是如何工作的?讓我們深入了解下。
我們將在PHP中構建區塊鏈,這將非常簡單,如果你懂一點兒編程,你也可以用另一種語言來做,如果你不懂編程,我想你仍然能夠大致理解它是如何工作的,所以讓我們來談談哈希hash。
<?php $list1 = ["a","b","c"]; $list2 = ["a","b","c"]; echo "list 1: ".md5(serialize($list1)); echo "<br/>list 2: ".md5(serialize($list2)); ?>
正如你所看到的,我們有兩個列表,我們有兩個包含a、b、c的列表,這是數據,這是我們試圖hash的字符串,讓我們看看我們從列表1和2中得到什么樣的數字簽名。
輸出結果:
list 1: ec10e0c7a344da191700ab4ace1a5e26 list 2: ec10e0c7a344da191700ab4ace1a5e26
你可以看到,當我們得到這兩個哈希字符串或數字簽名,這兩個是相同的。
如果我現在改變list1中的內容,例如:
<?php $list1 = ["aaa","b","c"]; //Changed $list2 = ["a","b","c"]; echo "list 1: ".md5(serialize($list1)); echo "<br/>list 2: ".md5(serialize($list2)); ?>
現在我在運行它:
list 1: 97f4361000fdba1732a50f1771c9d830 list 2: ec10e0c7a344da191700ab4ace1a5e26
你可以看到我們得到了完全不同的數字簽名,所以如果我只是做一個小的修改,我只是干預數據,我試圖改變這個列表中的任何東西,我將得到完全不同的數字簽名,這是區塊鏈技術的基礎,因為區塊鏈是一個塊的列表,基本上是一個由區塊組成的鏈表和每個塊保持前一個塊的數字簽名,并且下一個塊的數字簽名是基于當前塊的數字簽名,所以它們總是關聯在一起,下一個簽名將基于當前簽名而當前簽名是基于以前的簽名,所以如果你改變過去的任何東西,你會打破所有的簽名,他們將看起來完全不同。
如何編碼
讓我們實際進入我們的區塊鏈編碼,我們需要做的第一件事是談論我們的Block類,在這種情況下,我們的塊將非常簡單,它只包含三個東西,它將包含在該塊中發生的交易列表,它將包含先前的哈希或數字簽名的前一個塊,它也將包含哈希的本身,這個哈希將基于交易和以前的哈希,所以如果任何人改變任何東西在前一塊,數字簽名的當前塊將改變,并改變下一個塊的數字簽名。
使用你喜歡的IDE重新生成空的PHP項目,我在本地主機環境中使用XAMPP。
現在創建一個新的文件block.php,并在其中放入下面的代碼片段。
<?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; } } ?>
現在創建另一個名為index.php的文件,并使用block.php類來創建一些塊。
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(); ?>
輸出結果:
Genesis Block: d9c559b57e148b19802d8e70555f0303 Block 1: 29e9e5a309aae81243fdf73112253c74 Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
請看當前哈希將基于以前的哈希,如果你改變了任何先前的交易,你的所有數字簽名將生效,例如,在genesisTransaction中,我改變了11到12,它將輸出完全不同的,如:
<?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(); ?>
輸出結果:
Genesis Block: d9c559b57e148b19802d8e70555f0303 Block 1: 29e9e5a309aae81243fdf73112253c74 Block 2: fbff8f664f6b4069bf7288cb1b86cb3a
你可以看到任何一個交易的變化,在一個塊中的任何一個數據將傳播和改變未來的區塊鏈中所有的數字簽名,這就是區塊鏈的工作原理,因為如果我改變了什么,每個人都會看到我的數字簽名完全不同于其他人,所以這意味著我在欺騙別人。就如同我告訴每個人,嘿,一個人給了我很多比特幣,這里是區塊鏈,請每個人確認下。每個人將查看它并說清楚,我們知道這個區塊鏈無法確認這一點,因為我們有自己版本的區塊鏈,數字簽名會是完全不同,所以這不行。
我希望你能理解通過它們的數字簽名將區塊的哈希鏈接在一起的這一基本概念。在你的PHP中實現這個例子吧。
本文轉自:https://blog.csdn.net/mongo_node/article/details/81700425
推薦教程:《php教程》