溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中怎么實(shí)現(xiàn)區(qū)塊鏈

發(fā)布時(shí)間:2021-06-29 17:18:07 來(lái)源:億速云 閱讀:294 作者:Leah 欄目:互聯(lián)網(wǎng)科技

PHP中怎么實(shí)現(xiàn)區(qū)塊鏈,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

引言

什么是區(qū)塊鏈?官方的解釋是:區(qū)塊鏈?zhǔn)且粋€(gè)分布式記賬系統(tǒng),是藉用密碼學(xué)串接并保護(hù)其內(nèi)容的串連交易記錄(又稱區(qū)塊)。每一個(gè)區(qū)塊包含了前一個(gè)區(qū)塊的加密散列、對(duì)應(yīng)的時(shí)間戳記以及交易數(shù)據(jù)(通常用默克爾樹算法計(jì)算的散列值表示),這樣的設(shè)計(jì)使得區(qū)塊內(nèi)容具有難以被篡改的特性。用區(qū)塊鏈所串接的分布式賬本能讓兩方有效率地紀(jì)錄交易,且此交易可永久被查驗(yàn)。

區(qū)塊

大家應(yīng)該玩過(guò)成語(yǔ)接龍,規(guī)則是這樣:我先說(shuō)一個(gè)成語(yǔ)“人山人?!?,下一個(gè)玩家需要使用我說(shuō)的成語(yǔ)的最后一個(gè)字作為下一個(gè)成語(yǔ)的開頭,就是說(shuō)需要使用“海”這個(gè)字作為新成語(yǔ)的開頭,這時(shí)就可以接一個(gè)“海闊天空”。

而區(qū)塊鏈的形式有點(diǎn)像成語(yǔ)接龍,就是下一個(gè)區(qū)塊必須使用上一個(gè)區(qū)塊的Hash值作為憑據(jù)來(lái)生成下一個(gè)區(qū)塊。如下圖:

PHP中怎么實(shí)現(xiàn)區(qū)塊鏈

這樣做的好處是:從任意一個(gè)區(qū)塊開始都可以通過(guò)前一個(gè)區(qū)塊的Hash值可以不斷的追溯整條區(qū)塊鏈,直到創(chuàng)世區(qū)塊(也就是區(qū)塊鏈的第一個(gè)區(qū)塊)。如果有人惡意攻擊,也必須更改整條區(qū)塊鏈的數(shù)據(jù)。但是計(jì)算Hash值是一個(gè)耗時(shí)的操作,所以要更改整條區(qū)塊鏈的數(shù)據(jù)基本是不可能達(dá)到,這就保證了區(qū)塊鏈的安全性。

下面我們使用PHP代碼來(lái)定義區(qū)塊:

class Block {
    public $prevHash;
    public $hash;
    public $timeStamp;
    public $data;
}
  • prevHash:前一個(gè)區(qū)塊的Hash值

  • hash:當(dāng)前區(qū)塊的Hash值

  • timeStamp:區(qū)塊生成的時(shí)間戳

  • data:區(qū)塊保存的數(shù)據(jù)

prevHash、hash和timeStamp這幾個(gè)字段在區(qū)塊鏈中被稱為區(qū)塊頭,區(qū)塊的Hash值使用SHA-256算法計(jì)算。計(jì)算方法如下:

<php
class Block {
    ...
    public function setBlockHash() {
        $data = serialize($this);
        $this->hash = hash('sha256', $data);
    }
}

首先我們使用serialize()函數(shù)把整個(gè)區(qū)塊序列化,然后使用hash()函數(shù)計(jì)算區(qū)塊的Hash值,并賦值給hash字段。

區(qū)塊對(duì)象的構(gòu)造函數(shù)如下:
<php
class Block {
    ...
    public function __construct($prevHash, $data) {
        $this->prevHash = $prevHash;
        $this->timeStamp = time();
        $this->data = $data;
        $this->setBlockHash();
    }
}

另外我們提供一個(gè)獲取區(qū)塊Hash值的方法:

<?php

class Block
{
    ...
    public function getBlockHash()
    {
        return $this->hash;
    }
}

區(qū)塊鏈

前面說(shuō)了,區(qū)塊鏈就是按照一定的規(guī)則連接起來(lái)的區(qū)塊,連接的規(guī)則就是下一個(gè)區(qū)塊的區(qū)塊頭中必須包含前一個(gè)區(qū)塊的Hash值。我們編寫一個(gè)區(qū)塊鏈對(duì)象來(lái)保存整條區(qū)塊鏈,代碼如下:

<?php

include('block.php');

class Blockchain
{
    public $blocks = [];
}

區(qū)塊鏈對(duì)象內(nèi)部使用了一個(gè)數(shù)組來(lái)保存所有的區(qū)塊,現(xiàn)階段我們還沒(méi)有使用到數(shù)據(jù)庫(kù)來(lái)保存區(qū)塊鏈,所以現(xiàn)在只需要把區(qū)塊鏈保存在內(nèi)存即可。

向區(qū)塊鏈添加一個(gè)新的區(qū)塊代碼如下:

<?php

include('block.php');

class Blockchain
{
    ...
    public function addBlock($data)
    {
        $prevBlock = $this->blocks[count($this->blocks)-1];
        $this->blocks[] = new Block($prevBlock->getBlockHash(), $data);
    }
}

因?yàn)樯尚聟^(qū)塊必須包含前一個(gè)區(qū)塊的Hash值,所以在添加新區(qū)塊時(shí)需要獲取區(qū)塊鏈中最后一個(gè)區(qū)塊作為新區(qū)塊的前一個(gè)區(qū)塊,然后把前一個(gè)區(qū)塊的Hash包含到新區(qū)塊的區(qū)塊頭中。

可能聰明的讀者會(huì)發(fā)現(xiàn),在區(qū)塊鏈剛創(chuàng)建時(shí)并沒(méi)有任何區(qū)塊,那么添加新區(qū)塊時(shí)拿哪個(gè)區(qū)塊作為前一個(gè)區(qū)塊呢?答案就是創(chuàng)世區(qū)塊。創(chuàng)世區(qū)塊不用包含前一個(gè)區(qū)塊的Hash值,而且隨著區(qū)塊鏈的創(chuàng)建被創(chuàng)建,代碼如下:

<?php

include('block.php');

class Blockchain
{
    ...
    public function __construct()
    {
        $this->blocks[] = new Block('', 'Genesis Block');
    }
}

創(chuàng)世區(qū)塊并不需要包含前一個(gè)區(qū)塊的Hash值,所以在創(chuàng)建創(chuàng)世區(qū)塊時(shí)把前一個(gè)區(qū)塊的Hash值設(shè)置為空。

OK!我們的簡(jiǎn)易區(qū)塊鏈已經(jīng)完成了,現(xiàn)在來(lái)測(cè)試一下我們的代碼吧:

<?php

include('blockchain.php');

$bc = new Blockchain();

$bc->addBlock('This is block1');
$bc->addBlock('This is block2');

foreach ($bc->blocks as $block) {
    printf("PrevHash: %s\n", $block->prevHash);
    printf("Hash: %s\n", $block->hash);
    printf("Data: %s\n", $block->data);
    printf("\n");
}

關(guān)于PHP中怎么實(shí)現(xiàn)區(qū)塊鏈問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI