www.e4938.cn-老师你下面太紧了拔不出来,99re8这里有精品热视频免费,国产第一视频一区二区三区,青青草国产成人久久

<button id="60qo0"></button>

<strike id="60qo0"></strike>
<del id="60qo0"></del>
<fieldset id="60qo0"><menu id="60qo0"></menu></fieldset>
  • PHP也能實(shí)現(xiàn)區(qū)塊鏈?

    2018-08-07 17:02:31 大云網(wǎng)  點(diǎn)擊量: 評(píng)論 (0)
    什么是區(qū)塊鏈?官方的解釋是:區(qū)塊鏈?zhǔn)且粋€(gè)分布式記賬系統(tǒng),是藉用密碼學(xué)串接并保護(hù)其內(nèi)容的串連交易記錄(又稱區(qū)塊)。對(duì)于初學(xué)者來說太抽象了,所以接下來我們將會(huì)使用PHP來實(shí)現(xiàn)一個(gè)簡(jiǎn)易的區(qū)塊鏈來加深對(duì)區(qū)塊鏈的理解。

    引言

    什么是區(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ū)塊:

    <php

    class Block {

    public $prevHash;

    public $hash;

    public $timeStamp;

    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ì)算方法如下:

    <php

    class Block {

    ...

    public function setBlockHash() {

    $data = serialize($this);

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

    }

    }

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

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

    <php

    class Block {

    ...

    public function __construct($prevHash, $data) {

    $this->prevHash = $prevHash;

    $this->timeStamp = time();

    $this->data = $data;

    $this->setBlockHash();

    }

    }

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

    <?php

    class Block

    {

    ...

    public function getBlockHash()

    {

    return $this->hash;

    }

    }

    區(qū)塊鏈

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

    <?php

    include('block.php');

    class Blockchain

    {

    public $blocks = [];

    }

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

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

    }

    }

    因?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)建,代碼如下:

    <?php

    include('block.php');

    class Blockchain

    {

    ...

    public function __construct()

    {

    $this->blocks[] = new Block('', 'Genesis Block');

    }

    }

    創(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è)試一下我們的代碼吧:

    <?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(" ");

    }

    我們來運(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ì)不斷完善這些問題。

    大云網(wǎng)官方微信售電那點(diǎn)事兒

    責(zé)任編輯:售電衡衡

    免責(zé)聲明:本文僅代表作者個(gè)人觀點(diǎn),與本站無關(guān)。其原創(chuàng)性以及文中陳述文字和內(nèi)容未經(jīng)本站證實(shí),對(duì)本文以及其中全部或者部分內(nèi)容、文字的真實(shí)性、完整性、及時(shí)性本站不作任何保證或承諾,請(qǐng)讀者僅作參考,并請(qǐng)自行核實(shí)相關(guān)內(nèi)容。
    我要收藏
    個(gè)贊
    ?
    亚洲精品欧美精品日韩精品| 国产成人综合亚洲精品| se01国产短视频在线观看| 久久99精品国产麻豆不卡| 久久精品国产免费看久久精品| 亚洲乱色熟女一区二区三区麻豆| 国产精品久线在线观看| 国产日韩欧美一区二区三区乱码| 人妻精品无码专区| 国产免看一级a一片成人av|