源码地址: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,运行一下,结果如下:
文章来源:https://www.toymoban.com/news/detail-799409.html
OK,成功运行。 文章来源地址https://www.toymoban.com/news/detail-799409.html
到了这里,关于PHP从零实现区块链(网页版一)基本原型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!