PHP从零实现区块链(网页版一)基本原型

本文详细介绍了如何使用PHP从零开始实现一个简单的区块链原型,包括搭建环境、编写block和BlockChain类,以及创建和添加区块的过程。通过实例展示了如何在app.php中使用这些类并查看结果。
摘要由CSDN通过智能技术生成

源码地址:PHP从零实现区块链(一)基本原型 - 简书

本例只是从网页版实现一下原理,源码非本人所写,只是将原帖的源码更改了一下,变成网页版。

因为只是通过php来了解一下区块链的基本原理,我就不搭建php的控制台实现了。

学习前的准备:

搭建php运行环境,这个我推荐用phpstudy,一键安装,一键启动,很省事。

安装好后,我们启动apache服务器,然后点配置,确定网站的根目录如下:

然后我们在根目录www文件夹下,新建一个index.php,输入如下代码:

<?php
echo phpinfo();
?>

保存,然后打开浏览器,输入localhost,如果出现以下页面:

则表明安装成功,php运行正常。

2.第一步成功后,我们接下来安装vscode,方便写代码。当然你如果愿意用记事本写,也可以跳过这步,安装vscode就不介绍了,就跟正常安装软件一样。

网页版实现:

接着我们用vscode打开www文件夹。

1.新建block.php文件,输入如下代码保存:

<?php

class Block
{
    /**
     * 当前时间戳,也就是区块创建的时间
     * @var int $timestamp
     */
    public $timestamp;

    /**
     * 区块存储的信息,也就是交易
     * @var string $data
     */
    public $data;

    /**
     * 前一个块的哈希,即父哈希
     * @var string $prevBlockHash
     */
    public $prevBlockHash;

    /**
     * 当前块的哈希 
     * @var string $hash
     */
    public $hash;

    public function __construct(string $data, string $prevBlockHash)
    {
        $this->prevBlockHash = $prevBlockHash;
        $this->data = $data;
        $this->timestamp = time();
        $this->hash = $this->setHash();
    }

    public function setHash(): string
    {
        return hash('sha256', implode('', [$this->timestamp, $this->prevBlockHash, $this->data]));
    }
}

解释:上面创建了一个block类,里面的构造函数:

    public function __construct(string $data, string $prevBlockHash)

需要传入两个参数,块数据data,和上一个块的哈希值prevBlockHash,这两个数据之后都传给了block对应的变量。

但是块里创建了四个变量,还有两个timestamp和hash,没被赋值。

那么timestamp是块创建时间,这个直接用time()赋值就可以了。

而hash是当前块的哈希,这个是动态计算的,所以得块前面三个变量有值了,然后才能获得。

所以后面通过调用setHash获得了哈希。(sethash的功能是将前三个变量数据合在一起,然后进行哈希运算,返回哈希值)

这样的话,我们new book("填此区块数据","填入此区块上一个区块的哈希")就能创建一个块,把两个参数填好,然后块里面就都有数据了。

2.新建BlockChain.php文件,输入如下代码保存:

<?php
require_once 'block.php';
class BlockChain
{
    /**
     * @var Block[] $blocks
     */
    public $blocks;

    public function __construct(Block $block)
    {
        $this->blocks[] = $block;
    }

    // 加入一个块到区块链中
    public function addBlock(string $data)
    {
        $prevBlock = $this->blocks[count($this->blocks) - 1];
        $newBlock = new Block($data, $prevBlock->hash);
        $this->blocks[] = $newBlock;
    }
    // 初始化创世区块
    public static function NewGenesisBlock()
    {
        $block = new Block('Genesis Block', '');

        return new BlockChain($block);
    }
}

注意,因为在blockchain.php里面使用了block.php块里的类,所以开头我们得加上

require_once 'block.php';

引入一下,不然识别不到。

解释:BlockChain是用来管理block类的,它的里面有个block数组变量,用来存储块。

然后还有一个NewGenesisBlock用来创建创世块,因为第一个块里面不存在前一个块哈希值,所以

得有这个函数用来创建第一个块做引子。

在NewGenesisBlock里有个 return new BlockChain(),所以BlockChain的构造函数是配合 

NewGenesisBlock来使用的。

那么运行了newGenesisBlock()函数后,结果就是创建了一个BlockChain对象,并且里面的block数组已经有了一个值block[0]就是创世块。

然后剩下的,通过addBlock来添加块就行了,它是怎么加的呢?

块数据data是需要你传进去的,然后它的上一个哈希值,只要访问BlockChain对象里的block数组最后一位就可以获得。这样我们就有了data和prevBlockHash。

有了这两个,直接调用block类的构造函数new block(data,prevBlockHash)就能创造出区块了。

然后把这个块追加到block[]数组里去就可以了。

3.新建app.php文件,输入如下代码:

<?php
require_once 'BlockChain.php';

$bc = BlockChain::NewGenesisBlock();
$bc->addBlock('i am 2 block');
$bc->addBlock('i am 3 block');

foreach ($bc->blocks as $block){
    print_r($block);
    echo('<hr>');
 }

同样有require_once 'BlockChain.php';App.php使用了BlockChain类。

完成后WWW文件夹下最终如下:

那么我们在浏览器输入http://localhost/app.php,运行一下,结果如下:

OK,成功运行。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bczheng1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值