成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端 區塊鏈
什么是區塊鏈?官方的解釋是:區塊鏈是一個分布式記賬系統,是藉用密碼學串接并保護其內容的串連交易記錄。每一個區塊包含了前一個區塊的加密散列、對應的時間戳記以及交易數據,這樣的設計使得區塊內容具有難以被竄改的特性。接下來我們將會使用PHP來實現一個簡易的區塊鏈來加深對區塊鏈的理解。

[[240304]]

引言

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

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

區塊

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

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

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

下面我們使用PHP代碼來定義區塊: 

  1. <php  
  2. class Block {  
  3.     public $prevHash;  
  4.     public $hash;  
  5.     public $timeStamp 
  6.     public $data;  
字段 解釋
prevHash
前一個區塊的Hash值
hash 當前區塊的Hash值
timeStamp 區塊生成的時間戳
data 區塊保存的數據

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

  1. <php  
  2. class Block {  
  3.     ...  
  4.     public function setBlockHash() {  
  5.         $data = serialize($this);  
  6.         $this->hash = hash('sha256', $data);  
  7.     }  
  8.  

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

區塊對象的構造函數如下: 

  1. <php  
  2. class Block {  
  3.     ...  
  4.     public function __construct($prevHash, $data) {  
  5.         $this->prevHash = $prevHash;  
  6.         $this->timeStamp = time();  
  7.         $this->data = $data;  
  8.         $this->setBlockHash();  
  9.     }  
  10.  

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

  1. <?php  
  2. class Block  
  3.  
  4.     ...  
  5.     public function getBlockHash()  
  6.     {  
  7.         return $this->hash;  
  8.     }  

區塊鏈

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

  1. <?php  
  2. include('block.php');  
  3. class Blockchain  
  4.  
  5.     public $blocks = [];  
  6.  

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

向區塊鏈添加一個新的區塊代碼如下: 

  1. <?php  
  2. include('block.php'); 
  3. class Blockchain 
  4.  
  5.     ...  
  6.     public function addBlock($data)  
  7.     {  
  8.         $prevBlock = $this->blocks[count($this->blocks)-1];  
  9.         $this->blocks[] = new Block($prevBlock->getBlockHash(), $data);  
  10.     } 
  11.  

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

可能聰明的讀者會發現,在區塊鏈剛創建時并沒有任何區塊,那么添加新區塊時拿哪個區塊作為前一個區塊呢?答案就是創世區塊。創世區塊不用包含前一個區塊的Hash值,而且隨著區塊鏈的創建被創建,代碼如下: 

  1. <?php  
  2. include('block.php');  
  3. class Blockchain  
  4.  
  5.     ...  
  6.     public function __construct()  
  7.     {  
  8.         $this->blocks[] = new Block('''Genesis Block');  
  9.     }  
  10.  

創世區塊并不需要包含前一個區塊的Hash值,所以在創建創世區塊時把前一個區塊的Hash值設置為空。

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

  1. <?php  
  2. include('blockchain.php');  
  3. $bc = new Blockchain();  
  4.  
  5. $bc->addBlock('This is block1');  
  6. $bc->addBlock('This is block2');  
  7.  
  8. foreach ($bc->blocks as $block) {  
  9.     printf("PrevHash: %s\n", $block->prevHash);  
  10.     printf("Hash: %s\n", $block->hash);  
  11.     printf("Data: %s\n", $block->data);  
  12.     printf("\n");  
  13.  

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

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

總結

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

責任編輯:龐桂玉 來源: PHP技術大全
相關推薦

2022-10-26 08:42:28

2021-03-31 22:39:04

區塊鏈司法數字化

2021-05-10 15:09:47

區塊鏈互聯網金融

2019-09-16 18:38:06

2018-08-16 21:52:40

區塊鏈比特幣薪資

2018-10-23 10:55:07

2018-09-06 14:33:15

區塊鏈互聯網京東

2018-03-05 17:27:34

2020-09-16 18:05:21

區塊鏈加密貨幣去中心化

2021-06-25 22:14:51

區塊鏈智慧城市數據

2021-09-29 16:53:53

區塊鏈數據技術

2021-11-05 16:17:08

區塊鏈供應鏈技術

2021-04-18 06:58:35

區塊鏈賬本結構

2019-10-17 09:02:33

金融

2018-03-09 14:20:09

區塊鏈數字貨幣金融服務

2023-05-05 14:11:12

區塊鏈航空領域

2021-02-03 16:54:39

區塊鏈比特幣技術

2018-06-27 18:50:02

區塊鏈數字貨幣比特幣

2022-08-08 11:53:02

區塊鏈CIO

2018-12-21 12:25:08

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩在线精品 | 国产玖玖| 欧美激情国产精品 | 自拍偷拍中文字幕 | 国产在线播 | 国产在线观看不卡一区二区三区 | 91精品一区 | 亚洲伊人精品酒店 | 亚洲一区二区三区视频在线 | 在线观看www | 中文字幕亚洲区一区二 | 在线视频国产一区 | 欧美不卡视频 | 97精品超碰一区二区三区 | 一区二区三区在线电影 | 亚洲一区二区视频 | 国产精品久久国产精品久久 | 99精品99| 日韩第一夜 | 岛国午夜 | 久久久91精品国产一区二区三区 | 国产精品jizz在线观看老狼 | 精品视频一区二区三区在线观看 | 一区二区三区国产好 | 欧美激情一区二区三区 | 在线免费观看色 | 色呦呦在线 | 在线观看中文字幕一区二区 | 欧美日韩黄色一级片 | 欧美日韩精品一区二区 | 毛片视频观看 | 午夜av电影| 正在播放国产精品 | 综合一区 | 亚洲一区中文字幕在线观看 | 亚洲网站在线观看 | 亚洲综合大片69999 | 日本h片在线观看 | 欧美一级二级在线观看 | 天堂亚洲 | 日韩综合|