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

PHP也能實(shí)現(xiàn)區(qū)塊鏈?基礎(chǔ)結(jié)構(gòu)篇

開發(fā) 后端 區(qū)塊鏈
什么是區(qū)塊鏈?官方的解釋是:區(qū)塊鏈?zhǔn)且粋€(gè)分布式記賬系統(tǒng),是藉用密碼學(xué)串接并保護(hù)其內(nèi)容的串連交易記錄。每一個(gè)區(qū)塊包含了前一個(gè)區(qū)塊的加密散列、對(duì)應(yīng)的時(shí)間戳記以及交易數(shù)據(jù),這樣的設(shè)計(jì)使得區(qū)塊內(nèi)容具有難以被竄改的特性。接下來我們將會(huì)使用PHP來實(shí)現(xiàn)一個(gè)簡(jiǎn)易的區(qū)塊鏈來加深對(duì)區(qū)塊鏈的理解。

[[240304]]

引言

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

但這個(gè)解釋對(duì)于初學(xué)者來說太抽象了,所以接下來我們將會(huì)使用PHP來實(shí)現(xiàn)一個(gè)簡(jiǎn)易的區(qū)塊鏈來加深對(duì)區(qū)塊鏈的理解。

區(qū)塊

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

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

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

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

  1. <php  
  2. class Block {  
  3.     public $prevHash;  
  4.     public $hash;  
  5.     public $timeStamp 
  6.     public $data;  
字段 解釋
prevHash
前一個(gè)區(qū)塊的Hash值
hash 當(dāng)前區(qū)塊的Hash值
timeStamp 區(qū)塊生成的時(shí)間戳
data 區(qū)塊保存的數(shù)據(jù)

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

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

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

區(qū)塊對(duì)象的構(gòu)造函數(shù)如下: 

  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.  

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

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

區(qū)塊鏈

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

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

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

向區(qū)塊鏈添加一個(gè)新的區(qū)塊代碼如下: 

  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.  

因?yàn)樯尚聟^(qū)塊必須包含前一個(gè)區(qū)塊的Hash值,所以在添加新區(qū)塊時(shí)需要獲取區(qū)塊鏈中最后一個(gè)區(qū)塊作為新區(qū)塊的前一個(gè)區(qū)塊,然后把前一個(gè)區(qū)塊的Hash包含到新區(qū)塊的區(qū)塊頭中。

可能聰明的讀者會(huì)發(fā)現(xiàn),在區(qū)塊鏈剛創(chuàng)建時(shí)并沒有任何區(qū)塊,那么添加新區(qū)塊時(shí)拿哪個(gè)區(qū)塊作為前一個(gè)區(qū)塊呢?答案就是創(chuàng)世區(qū)塊。創(chuàng)世區(qū)塊不用包含前一個(gè)區(qū)塊的Hash值,而且隨著區(qū)塊鏈的創(chuàng)建被創(chuàng)建,代碼如下: 

  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.  

創(chuàng)世區(qū)塊并不需要包含前一個(gè)區(qū)塊的Hash值,所以在創(chuàng)建創(chuàng)世區(qū)塊時(shí)把前一個(gè)區(qū)塊的Hash值設(shè)置為空。

OK!我們的簡(jiǎn)易區(qū)塊鏈已經(jīng)完成了,現(xiàn)在來測(cè)試一下我們的代碼吧: 

  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.  

我們來運(yùn)行一下測(cè)試代碼,運(yùn)行結(jié)果如下:

很好,結(jié)果符合我們的預(yù)期。

總結(jié)

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

責(zé)任編輯:龐桂玉 來源: PHP技術(shù)大全
相關(guān)推薦

2022-10-26 08:42:28

2021-03-31 22:39:04

區(qū)塊鏈司法數(shù)字化

2021-05-10 15:09:47

區(qū)塊鏈互聯(lián)網(wǎng)金融

2018-08-16 21:52:40

區(qū)塊鏈比特幣薪資

2019-09-16 18:38:06

2018-10-23 10:55:07

2018-03-05 17:27:34

2018-09-06 14:33:15

區(qū)塊鏈互聯(lián)網(wǎng)京東

2020-09-16 18:05:21

區(qū)塊鏈加密貨幣去中心化

2021-06-25 22:14:51

區(qū)塊鏈智慧城市數(shù)據(jù)

2021-09-29 16:53:53

區(qū)塊鏈數(shù)據(jù)技術(shù)

2021-11-05 16:17:08

區(qū)塊鏈供應(yīng)鏈技術(shù)

2021-04-18 06:58:35

區(qū)塊鏈賬本結(jié)構(gòu)

2018-03-09 14:20:09

區(qū)塊鏈數(shù)字貨幣金融服務(wù)

2023-05-05 14:11:12

區(qū)塊鏈航空領(lǐng)域

2021-02-03 16:54:39

區(qū)塊鏈比特幣技術(shù)

2018-06-27 18:50:02

區(qū)塊鏈數(shù)字貨幣比特幣

2019-10-17 09:02:33

金融

2022-08-08 11:53:02

區(qū)塊鏈CIO

2018-12-21 12:25:08

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 天色综合网 | 色视频一区二区 | 99精品电影 | 夜夜骑综合 | 日日操av| 在线观看视频一区 | 91国自视频 | 免费一级欧美在线观看视频 | 日韩国产中文字幕 | 国产视频精品免费 | 免费看国产精品视频 | 国产亚洲欧美另类一区二区三区 | 国产高清在线观看 | 日韩成人免费视频 | 一区二区三区日本 | 亚洲男人的天堂网站 | 91视频官网 | 一区二区三区高清在线观看 | 欧美中文在线 | 欧美黄色绿像 | 亚洲欧美成人在线 | 国产第二页 | 91久久久久久久久 | 久久免费精品 | 国产精品国产精品国产专区不卡 | 亚洲视频免费在线 | 日本精品久久 | 亚洲三区在线观看 | 久久久精 | 久草网址 | 1级黄色大片 | 一级黄色片在线看 | 日日干夜夜操 | 国产亚洲一区二区精品 | 国产精品jizz在线观看老狼 | 国产精品毛片久久久久久 | 欧美激情视频一区二区三区免费 | 黄色免费三级 | 国产在线观看网站 | 黑人巨大精品欧美一区二区免费 | 欧美不卡一区二区三区 |