溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php構建區塊鏈的方法

發布時間:2020-06-15 14:11:53 來源:億速云 閱讀:223 作者:小新 欄目:編程語言

今天小編給大家分享的是php構建區塊鏈的方法,相信很多人都不太了解,為了讓大家更加了解,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。

區塊鏈

區塊鏈(Blockchain)是借由密碼學串接并保護內容的串連交易記錄(又稱區塊),是分布式數據存儲、點對點傳輸、共識機制、加密算法等計算機技術的新型應用模式。

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

我們要用PHP編程語言構建區塊鏈,區塊鏈本身就是一個非常簡單的概念,它是一個非常簡單的數據結構,數字貨幣是很復雜,但區塊鏈不是,它們復雜的原因是共識算法,挖礦機制和運行在他們之上的一切,但區塊鏈本身是很容易理解的,在你真正了解區塊鏈是如何工作的之前,你需要知道什么,你需要知道什么是哈希hash?它們是如何工作的?

哈?;旧鲜悄撤N數據的數字簽名,例如可以拍一部電影,可以hash它并得到一個數字簽名;可以拿一封電子郵件,可以把它hash并得到一個數字簽名;還可以拿一個字,也可以hash它,你可以拿任何數據,然后hash它,你都可以得到一個hash值。它只是對該數據進行數字簽名。

php構建區塊鏈的方法

這個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中實現這個例子吧。

以上就是php構建區塊鏈的方法的簡略介紹,當然詳細使用上面的不同還得要大家自己使用過才領會。如果想了解更多,歡迎關注億速云行業資訊頻道哦!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女