php使用區塊鏈 PHP也能實現區塊鏈?

2021-10-22 21:15:46 字數 1757 閱讀 1980

什麼是區塊鏈?

官方的解釋是:區塊鏈是乙個分布式記賬系統,是藉用密碼學串接並保護其內容的串連交易記錄(又稱區塊)。

每乙個區塊包含了前乙個區塊的加密雜湊、對應的時間戳記以及交易資料(通常用默克爾樹演算法計算的雜湊值表示),這樣的設計使得區塊內容具有難以被篡改的特性。

用區塊鏈所串接的分布式賬本能讓兩方有效率地紀錄交易,且此交易可永久被查驗。

但這個解釋對於初學者來說太抽象了,所以接下來我們將會使用php來實現乙個簡易的區塊鏈來加深對區塊鏈的理解。

區塊下乙個玩家需要使用我說的成語的最後乙個字作為下乙個成語的開頭,就是說需要使用「海」這個字作為新成語的開頭,這時就可以接乙個「海闊天空」。

這樣做的好處是:從任意乙個區塊開始都可以通過前乙個區塊的hash值可以不斷的追溯整條區塊鏈,直到創世區塊(也就是區塊鏈的第乙個區塊)。

如果有人惡意攻擊,也必須更改整條區塊鏈的資料。

但是計算hash值是乙個耗時的操作,所以要更改整條區塊鏈的資料基本是不可能達到,這就保證了區塊鏈的安全性。

下面我們使用php**來定義區塊:

class block }

區塊鏈前面說了,區塊鏈就是按照一定的規則連線起來的區塊,連線的規則就是下乙個區塊的區塊頭中必須包含前乙個區塊的hash值。

我們編寫乙個區塊鏈物件來儲存整條區塊鏈,**如下:

include('block.php');

class blockchain

區塊鏈物件內部使用了乙個陣列來儲存所有的區塊,現階段我們還沒有使用到資料庫來儲存區塊鏈,所以現在只需要把區塊鏈儲存在記憶體即可。

向區塊鏈新增乙個新的區塊**如下:

include('block.php');

class blockchain

}因為生成新區塊必須包含前乙個區塊的hash值,所以在新增新區塊時需要獲取區塊鏈中最後乙個區塊作為新區塊的前乙個區塊,然後把前乙個區塊的hash包含到新區塊的區塊頭中。

可能聰明的讀者會發現,在區塊鏈剛建立時並沒有任何區塊,那麼新增新區塊時拿哪個區塊作為前乙個區塊呢?

答案就是創世區塊。

創世區塊不用包含前乙個區塊的hash值,而且隨著區塊鏈的建立被建立,**如下:

include('block.php');

class blockchain

}創世區塊並不需要包含前乙個區塊的hash值,所以在建立創世區塊時把前乙個區塊的hash值設定為空。

ok!我們的簡易區塊鏈已經完成了,現在來測試一下我們的**吧:

include('blockchain.php'); $bc = new blockchain(); $bc->addblock('this is block1'); $bc->addblock('this is block2');

foreach ($bc->blocks as $block)

我們來執行一下測試**,執行結果如下:

很好,結果符合我們的預期。

總結本文只是實現了乙個最簡易的區塊鏈,離完整的區塊鏈還有非常遠的距離。

在我們現在的實現中存在很多不足,如:新增乙個區塊的成本很低,沒有實現分布式,不能儲存到本地磁碟(重啟機器資料就會丟失)。

PHP也能實現區塊鏈?

什麼是區塊鏈?官方的解釋是 區塊鏈是乙個分布式記賬系統,是藉用密碼學串接並保護其內容的串連交易記錄 又稱區塊 每乙個區塊包含了前乙個區塊的加密雜湊 對應的時間戳記以及交易資料 通常用默克爾樹演算法計算的雜湊值表示 這樣的設計使得區塊內容具有難以被篡改的特性。用區塊鏈所串接的分布式賬本能讓兩方有效率地...

PHP也能實現區塊鏈?基礎結構篇

列旭松,唯品會資深工程師,曾任職於yy語音,熟識php c語言和go語言。10年php開發經驗,對php底層實現原理有較深理解。熱衷於開源事業,開源過多個php相關的擴充套件,流行的php原始碼加密擴充套件 php beast 作者。另外,本人對分布式快取系統 如redis memcached 有較...

PHP實現區塊鏈

簡單的php區塊鏈 namespace common library block 區塊結構 class block public function get name private function hash block 創世區塊 return common library block block ...