www涩-www黄网站-www黄色-www黄色com-国产免费拍拍视频在线观看网站-国产免费怕怕免费视频观看

PHP也能實現區(qū)塊鏈?

2018-08-07 17:02:31 大云網  點擊量: 評論 (0)
什么是區(qū)塊鏈?官方的解釋是:區(qū)塊鏈是一個分布式記賬系統(tǒng),是藉用密碼學串接并保護其內容的串連交易記錄(又稱區(qū)塊)。對于初學者來說太抽象了,所以接下來我們將會使用PHP來實現一個簡易的區(qū)塊鏈來加深對區(qū)塊鏈的理解。

引言

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

但這個解釋對于初學者來說太抽象了,所以接下來我們將會使用PHP來實現一個簡易的區(qū)塊鏈來加深對區(qū)塊鏈的理解。

區(qū)塊

大家應該玩過成語接龍,規(guī)則是這樣:我先說一個成語“人上人海”,下一個玩家需要使用我說的成語的最后一個字作為下一個成語的開頭,就是說需要使用“海”這個字作為新成語的開頭,這時就可以接一個“海闊天空”。

而區(qū)塊鏈的形式有點像成語接龍,就是下一個區(qū)塊必須使用上一個區(qū)塊的Hash值作為憑據來生成下一個區(qū)塊。如下圖:

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

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

<php

class Block {

public $prevHash;

public $hash;

public $timeStamp;

public $data;

}

字段解釋prevHash

前一個區(qū)塊的Hash值hash當前區(qū)塊的Hash值timeStamp區(qū)塊生成的時間戳data區(qū)塊保存的數據

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

<php

class Block {

...

public function setBlockHash() {

$data = serialize($this);

$this->hash = hash('sha256', $data);

}

}

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

區(qū)塊對象的構造函數如下:

<php

class Block {

...

public function __construct($prevHash, $data) {

$this->prevHash = $prevHash;

$this->timeStamp = time();

$this->data = $data;

$this->setBlockHash();

}

}

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

<?php

class Block

{

...

public function getBlockHash()

{

return $this->hash;

}

}

區(qū)塊鏈

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

<?php

include('block.php');

class Blockchain

{

public $blocks = [];

}

區(qū)塊鏈對象內部使用了一個數組來保存所有的區(qū)塊,現階段我們還沒有使用到數據庫來保存區(qū)塊鏈,所以現在只需要把區(qū)塊鏈保存在內存即可。

向區(qū)塊鏈添加一個新的區(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);

}

}

因為生成新區(qū)塊必須包含前一個區(qū)塊的Hash值,所以在添加新區(qū)塊時需要獲取區(qū)塊鏈中最后一個區(qū)塊作為新區(qū)塊的前一個區(qū)塊,然后把前一個區(qū)塊的Hash包含到新區(qū)塊的區(qū)塊頭中。

可能聰明的讀者會發(fā)現,在區(qū)塊鏈剛創(chuàng)建時并沒有任何區(qū)塊,那么添加新區(qū)塊時拿哪個區(qū)塊作為前一個區(qū)塊呢?答案就是創(chuàng)世區(qū)塊。創(chuàng)世區(qū)塊不用包含前一個區(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ū)塊并不需要包含前一個區(qū)塊的Hash值,所以在創(chuàng)建創(chuàng)世區(qū)塊時把前一個區(qū)塊的Hash值設置為空。

OK!我們的簡易區(qū)塊鏈已經完成了,現在來測試一下我們的代碼吧:

<?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 ", $block->prevHash);

printf("Hash: %s ", $block->hash);

printf("Data: %s ", $block->data);

printf(" ");

}

我們來運行一下測試代碼,運行結果如下:

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

總結

本文只是實現了一個最簡易的區(qū)塊鏈,離完整的區(qū)塊鏈還有非常遠的距離。在我們現在的實現中存在很多不足,如:添加一個區(qū)塊的成本很低,沒有實現分布式,不能保存到本地磁盤(重啟機器數據就會丟失)等,接下來的教程將會不斷完善這些問題。

大云網官方微信售電那點事兒

責任編輯:售電衡衡

免責聲明:本文僅代表作者個人觀點,與本站無關。其原創(chuàng)性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,并請自行核實相關內容。
我要收藏
個贊
?
主站蜘蛛池模板: 精品三级在线观看 | 久久精品国产半推半就 | 美女一级ba大片免色野外 | 中文字幕日韩精品在线 | 中文字幕播放 | 免费一级a毛片在线播放 | 久草视频手机在线 | 中国国产一级毛片 | 一级片国产| 日韩欧美中文字幕一区二区三区 | 成年人在线观看免费 | 亚洲在线观看免费 | 国产女乱淫真高清免费视频 | 中文字幕在线成人免费看 | 成人性一级视频在线观看 | 欧美成人亚洲欧美成人 | 激情一区二区三区成人 | 久草在线视频在线观看 | 亚洲国产精品第一区二区三区 | 久久国内精品自在自线软件 | 色伊人国产高清在线 | 成人在线免费网站 | 一级一片免费视频播放 | 欧美日韩高清性色生活片 | 国产vs久久| 日本欧美一区二区三区高清 | 毛片视频网站在线观看 | 乱人伦中文视频在线观看免费 | 亚洲成人免费在线观看 | 手机精品在线 | 亚洲成人中文 | 亚洲 欧美 精品专区 极品 | 久久综合精品国产一区二区三区无 | 日韩欧美在| 国产成人精品曰本亚洲 | 国产一线视频在线观看高清 | 久草免费在线观看 | 国产精品不卡无毒在线观看 | 男人操女人逼逼视频 | 美女成人网 | 男女免费观看视频 |