首頁 >後端開發 >php教程 >php建構一個區塊鏈(含源碼)

php建構一個區塊鏈(含源碼)

烟雨青岚
烟雨青岚原創
2020-06-13 18:07:275409瀏覽

php建構一個區塊鏈(含源碼)

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教程

以上是php建構一個區塊鏈(含源碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn