您好,登錄后才能下訂單哦!
PHP中怎么實現區塊鏈,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
什么是區塊鏈?官方的解釋是:區塊鏈是一個分布式記賬系統,是藉用密碼學串接并保護其內容的串連交易記錄(又稱區塊)。每一個區塊包含了前一個區塊的加密散列、對應的時間戳記以及交易數據(通常用默克爾樹算法計算的散列值表示),這樣的設計使得區塊內容具有難以被篡改的特性。用區塊鏈所串接的分布式賬本能讓兩方有效率地紀錄交易,且此交易可永久被查驗。
大家應該玩過成語接龍,規則是這樣:我先說一個成語“人山人海”,下一個玩家需要使用我說的成語的最后一個字作為下一個成語的開頭,就是說需要使用“海”這個字作為新成語的開頭,這時就可以接一個“海闊天空”。
而區塊鏈的形式有點像成語接龍,就是下一個區塊必須使用上一個區塊的Hash值作為憑據來生成下一個區塊。如下圖:
這樣做的好處是:從任意一個區塊開始都可以通過前一個區塊的Hash值可以不斷的追溯整條區塊鏈,直到創世區塊(也就是區塊鏈的第一個區塊)。如果有人惡意攻擊,也必須更改整條區塊鏈的數據。但是計算Hash值是一個耗時的操作,所以要更改整條區塊鏈的數據基本是不可能達到,這就保證了區塊鏈的安全性。
下面我們使用PHP代碼來定義區塊:
class Block { public $prevHash; public $hash; public $timeStamp; public $data; }
prevHash:前一個區塊的Hash值
hash:當前區塊的Hash值
timeStamp:區塊生成的時間戳
data:區塊保存的數據
prevHash、hash和timeStamp這幾個字段在區塊鏈中被稱為區塊頭,區塊的Hash值使用SHA-256算法計算。計算方法如下:
<php class Block { ... public function setBlockHash() { $data = serialize($this); $this->hash = hash('sha256', $data); } }
首先我們使用serialize()函數把整個區塊序列化,然后使用hash()函數計算區塊的Hash值,并賦值給hash字段。
<php class Block { ... public function __construct($prevHash, $data) { $this->prevHash = $prevHash; $this->timeStamp = time(); $this->data = $data; $this->setBlockHash(); } }
另外我們提供一個獲取區塊Hash值的方法:
<?php class Block { ... public function getBlockHash() { return $this->hash; } }
前面說了,區塊鏈就是按照一定的規則連接起來的區塊,連接的規則就是下一個區塊的區塊頭中必須包含前一個區塊的Hash值。我們編寫一個區塊鏈對象來保存整條區塊鏈,代碼如下:
<?php include('block.php'); class Blockchain { public $blocks = []; }
區塊鏈對象內部使用了一個數組來保存所有的區塊,現階段我們還沒有使用到數據庫來保存區塊鏈,所以現在只需要把區塊鏈保存在內存即可。
向區塊鏈添加一個新的區塊代碼如下:
<?php include('block.php'); class Blockchain { ... public function addBlock($data) { $prevBlock = $this->blocks[count($this->blocks)-1]; $this->blocks[] = new Block($prevBlock->getBlockHash(), $data); } }
因為生成新區塊必須包含前一個區塊的Hash值,所以在添加新區塊時需要獲取區塊鏈中最后一個區塊作為新區塊的前一個區塊,然后把前一個區塊的Hash包含到新區塊的區塊頭中。
可能聰明的讀者會發現,在區塊鏈剛創建時并沒有任何區塊,那么添加新區塊時拿哪個區塊作為前一個區塊呢?答案就是創世區塊。創世區塊不用包含前一個區塊的Hash值,而且隨著區塊鏈的創建被創建,代碼如下:
<?php include('block.php'); class Blockchain { ... public function __construct() { $this->blocks[] = new Block('', 'Genesis Block'); } }
創世區塊并不需要包含前一個區塊的Hash值,所以在創建創世區塊時把前一個區塊的Hash值設置為空。
OK!我們的簡易區塊鏈已經完成了,現在來測試一下我們的代碼吧:
<?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"); }
關于PHP中怎么實現區塊鏈問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。