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

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

Jun 13, 2020 pm 06:07 PM
php

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles