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

2021-09-10 10:10:08 字數 2368 閱讀 8945

列旭松,唯品會資深工程師,曾任職於yy語音,熟識php、c語言和go語言。10年php開發經驗,對php底層實現原理有較深理解。熱衷於開源事業,開源過多個php相關的擴充套件,流行的php原始碼加密擴充套件(php-beast)作者。另外,本人對分布式快取系統(如redis、memcached)有較大的興趣,喜歡鑽研底層實現原理,《 php 核心技術與最佳實踐》一書的作者。

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

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

區塊大家應該玩過成語接龍,規則是這樣:我先說乙個成語「人上人海」,下乙個玩家需要使用我說的成語的最後乙個字作為下乙個成語的開頭,就是說需要使用「海」這個字作為新成語的開頭,這時就可以接乙個「海闊天空」。

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

字段

解釋prevhash

前乙個區塊的hash值

hash

當前區塊的hash值

timestamp

區塊生成的時間戳

data

區塊儲存的資料

prevhash、hash和timestamp這幾個欄位在區塊鏈中被稱為區塊頭,區塊的hash值使用sha-256演算法計算。計算方法如下:

hash = hash('sha256', $data);

}}

首先我們使用serialize函式把整個區塊序列化,然後使用hash函式計算區塊的hash值,並賦值給hash欄位。

區塊物件的建構函式如下:

prevhash = $prevhash;

$this->timestamp = time;

$this->data = $data;

$this->setblockhash;}}

另外我們提供乙個獲取區塊hash值的方法:

<?php 

class block

}

區塊鏈

<?php
include('block.php');

class blockchain

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

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

<?php 

include('block.php');

class blockchain

}

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

可能聰明的讀者會發現,在區塊鏈剛建立時並沒有任何區塊,那麼新增新區塊時拿哪個區塊作為前乙個區塊呢?答案就是創世區塊。創世區塊不用包含前乙個區塊的hash值,而且隨著區塊鏈的建立被建立,**如下:

<?php 

include('block.php');

class blockchain

}

創世區塊並不需要包含前乙個區塊的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)

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

總結本文只是實現了乙個最簡易的區塊鏈,離完整的區塊鏈還有非常遠的距離。在我們現在的實現中存在很多不足,如:新增乙個區塊的成本很低,沒有實現分布式,不能儲存到本地磁碟(重啟機器資料就會丟失)等,接下來的教程將會不斷完善這些問題。

PHP也能實現區塊鏈?

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

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

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

傳統資料庫也能實現區塊鏈儲存

本文節選自電子書 netkiller architect 手札 延伸閱讀 netkiller blockchain 手札 最近我區塊鏈技術非常火,區塊鏈優勢是去中心化,資料不可撰改,但你仔細想想自己需求,真的需要區塊鏈嗎?還是需要區塊鏈上的一些特性?例如資料不可撰改。區塊鏈並非能解決所有問題,雖然他...