PHP也能實現區塊鏈?

2021-09-04 12:28:45 字數 1971 閱讀 8509

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

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

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

這樣做的好處是:從任意乙個區塊開始都可以通過前乙個區塊的hash值可以不斷的追溯整條區塊鏈,直到創世區塊(也就是區塊鏈的第乙個區塊)。如果有人惡意攻擊,也必須更改整條區塊鏈的資料。但是計算hash值是乙個耗時的操作,所以要更改整條區塊鏈的資料基本是不可能達到,這就保證了區塊鏈的安全性。

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

class block
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也能實現區塊鏈?基礎結構篇

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

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

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