PHP也能实现区块链?

 Gateio官网   2018-09-06 10:29   510 人阅读  0 条评论

引言

什么是区块链?官方的解释是:区块链是一个分布式记账系统,是藉用密码学串接并保护其内容的串连交易记录(又称区块)。每一个区块包含了前一个区块的加密散列、对应的时间戳记以及交易数据(通常用默克尔树算法计算的散列值表示),这样的设计使得区块内容具有难以被篡改的特性。用区块链所串接的分布式账本能让两方有效率地纪录交易,且此交易可永久被查验。

但这个解释对于初学者来说太抽象了,所以接下来我们将会使用PHP来实现一个简易的区块链来加深对区块链的理解。

 区块

大家应该玩过成语接龙,规则是这样:我先说一个成语“人山人海”,下一个玩家需要使用我说的成语的最后一个字作为下一个成语的开头,就是说需要使用“海”这个字作为新成语的开头,这时就可以接一个“海阔天空”。

 而区块链的形式有点像成语接龙,就是下一个区块必须使用上一个区块的Hash值作为凭据来生成下一个区块。如下图:

 

PHP也能实现区块链? BTC gate是哪个国家的 gate交易所靠谱吗 gate交易平台 gate怎么提现人民币 比特儿官网 gateio可靠吗 gate和火币哪个好 gateio官网最新APP下载 gateio怎么提现人民币 gateio平台正规吗 gate交易平台可靠吗 gate什么意思 gate官网下载 gate级 gateio在中国合法吗 比特儿官网 gateio下载 gateio下载需要填写推荐人 gateio下载后打不开 gateio下载了图标是黑的打不开 gateio下载至桌面 gateio下载苹果了打不开 gateio下载app218 gateio下载苹果 gateio下载app gateio下载 gateio gateio官网下载appv222版本下载 gateio官网下载app gateio官网下载app225 比特儿 gate io下载 gateio手机安卓版下载 比特儿交易平台app gateio交易平台登录 gateio交易平台官方app下载手机版 比特儿官网 gateio gateio怎么样 gateio安卓app gateio中文 gateio苹果 比特儿gateionews 比特儿gateioio下载 比特儿gateioio 比特儿gateio怎么样 比特儿gate 比特儿官网gateio 比特儿gateio下载 比特儿gateio gateio比特儿海外版 gate靠谱吗 gateio登录 Gate谈币  第1张

 

这样做的好处是:从任意一个区块开始都可以通过前一个区块的Hash值可以不断的追溯整条区块链,直到创世区块(也就是区块链的第一个区块)。如果有人恶意攻击,也必须更改整条区块链的数据。但是计算Hash值是一个耗时的操作,所以要更改整条区块链的数据基本是不可能达到,这就保证了区块链的安全性。

 

下面我们使用PHP代码来定义区块:

 

<phpclass Block {
    public $prevHash;
    public $hash;
    public $timeStamp;
    public $data;
}

 

字段解释
prevHash前一个区块的Hash值
hash当前区块的Hash值
timeStamp区块生成的时间戳
data区块保存的数据

 

prevHash、hash和timeStamp这几个字段在区块链中被称为区块头,区块的Hash值使用SHA-256算法计算。计算方法如下:

 

 
<phpclass Block {
    ...
    public function setBlockHash() {
        $data = serialize($this);
        $this->hash = hash('sha256', $data);
    }
}

 

首先我们使用serialize()函数把整个区块序列化,然后使用hash()函数计算区块的Hash值,并赋值给hash字段。

 

区块对象的构造函数如下:

 

<phpclass Block {
    ...
    public function __construct($prevHash, $data) {
        $this->prevHash = $prevHash;
        $this->timeStamp = time();
        $this->data = $data;
        $this->setBlockHash();
    }
}

 

另外我们提供一个获取区块Hash值的方法:

 

<?phpclass Block{
    ...
    public function getBlockHash()    {
        return $this->hash;
    }
}

 

区块链

前面说了,区块链就是按照一定的规则连接起来的区块,连接的规则就是下一个区块的区块头中必须包含前一个区块的Hash值。我们编写一个区块链对象来保存整条区块链,代码如下:

 

<?phpinclude('block.php');class Blockchain{
    public $blocks = [];
}

 

区块链对象内部使用了一个数组来保存所有的区块,现阶段我们还没有使用到数据库来保存区块链,所以现在只需要把区块链保存在内存即可。

向区块链添加一个新的区块代码如下:

 

<?phpinclude('block.php');class Blockchain{
    ...
    public function addBlock($data)    {
        $prevBlock = $this->blocks[count($this->blocks)-1];
        $this->blocks[] = new Block($prevBlock->getBlockHash(), $data);
    }
}

 

因为生成新区块必须包含前一个区块的Hash值,所以在添加新区块时需要获取区块链中最后一个区块作为新区块的前一个区块,然后把前一个区块的Hash包含到新区块的区块头中。

可能聪明的读者会发现,在区块链刚创建时并没有任何区块,那么添加新区块时拿哪个区块作为前一个区块呢?答案就是创世区块。创世区块不用包含前一个区块的Hash值,而且随着区块链的创建被创建,代码如下:

 

<?phpinclude('block.php');class Blockchain{
    ...
    public function __construct()    {
        $this->blocks[] = new Block('', 'Genesis Block');
    }
}

 

创世区块并不需要包含前一个区块的Hash值,所以在创建创世区块时把前一个区块的Hash值设置为空。

OK!我们的简易区块链已经完成了,现在来测试一下我们的代码吧:

 

<?phpinclude('blockchain.php');

$bc = new Blockchain();

$bc->addBlock('This is block1');
$bc->addBlock('This is block2');foreach ($bc->blocks as $block) {
    printf("PrevHash: %s\n", $block->prevHash);
    printf("Hash: %s\n", $block->hash);
    printf("Data: %s\n", $block->data);
    printf("\n");
}

 

我们来运行一下测试代码,运行结果如下:

 

PHP也能实现区块链? BTC gate是哪个国家的 gate交易所靠谱吗 gate交易平台 gate怎么提现人民币 比特儿官网 gateio可靠吗 gate和火币哪个好 gateio官网最新APP下载 gateio怎么提现人民币 gateio平台正规吗 gate交易平台可靠吗 gate什么意思 gate官网下载 gate级 gateio在中国合法吗 比特儿官网 gateio下载 gateio下载需要填写推荐人 gateio下载后打不开 gateio下载了图标是黑的打不开 gateio下载至桌面 gateio下载苹果了打不开 gateio下载app218 gateio下载苹果 gateio下载app gateio下载 gateio gateio官网下载appv222版本下载 gateio官网下载app gateio官网下载app225 比特儿 gate io下载 gateio手机安卓版下载 比特儿交易平台app gateio交易平台登录 gateio交易平台官方app下载手机版 比特儿官网 gateio gateio怎么样 gateio安卓app gateio中文 gateio苹果 比特儿gateionews 比特儿gateioio下载 比特儿gateioio 比特儿gateio怎么样 比特儿gate 比特儿官网gateio 比特儿gateio下载 比特儿gateio gateio比特儿海外版 gate靠谱吗 gateio登录 Gate谈币  第2张

 

很好,结果符合我们的预期。

 

总结

本文只是实现了一个最简易的区块链,离完整的区块链还有非常远的距离。在我们现在的实现中存在很多不足,如:添加一个区块的成本很低,没有实现分布式,不能保存到本地磁盘(重启机器数据就会丢失)。


本文地址:http://www.hxt66.com/gate/126.html
版权声明:本文为原创文章,版权归 Gateio官网 所有,欢迎分享本文,转载请保留出处!

 发表评论


表情

还没有留言,还不快点抢沙发?