php 区块链算法_PHP也能实现区块链?
原标题:PHP也能实现区块链?
区块链兄弟社区,区块链技术专业问答先行者,中国区块链技术爱好者聚集地
作者:列旭松
来源: 高可用架构
原文链接:http://t.cn/RgjsJ1i
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
本文约3000字+,阅读(观看)需要19分钟
作者简介:列旭松,唯品会资深工程师,曾任职于YY语音,熟识PHP、C语言和Go语言。10年PHP开发经验,对PHP底层实现原理有较深理解。热衷于开源事业,开源过多个PHP相关的扩展,流行的PHP源码加密扩展(PHP-Beast)作者。另外,本人对分布式缓存系统(如Redis、Memcached)有较大的兴趣,喜欢钻研底层实现原理,《 PHP 核心技术与最佳实践》一书的作者。
引言
什么是区块链?官方的解释是:区块链是一个分布式记账系统,是藉用密码学串接并保护其内容的串连交易记录(又称区块)。每一个区块包含了前一个区块的加密散列、对应的时间戳记以及交易数据(通常用默克尔树算法计算的散列值表示),这样的设计使得区块内容具有难以被窜改的特性。用区块链所串接的分布式账本能让两方有效率地纪录交易,且此交易可永久被查验。
但这个解释对于初学者来说太抽象了,所以接下来我们将会使用PHP来实现一个简易的区块链来加深对区块链的理解。
区块
大家应该玩过成语接龙,规则是这样:我先说一个成语“人上人海”,下一个玩家需要使用我说的成语的最后一个字作为下一个成语的开头,就是说需要使用“海”这个字作为新成语的开头,这时就可以接一个“海阔天空”。
而区块链的形式有点像成语接龙,就是下一个区块必须使用上一个区块的Hash值作为凭据来生成下一个区块。如下图:
这样做的好处是:从任意一个区块开始都可以通过前一个区块的Hash值可以不断的追溯整条区块链,直到创世区块(也就是区块链的第一个区块)。如果有人恶意攻击,也必须更改整条区块链的数据。但是计算Hash值是一个耗时的操作,所以要更改整条区块链的数据基本是不可能达到,这就保证了区块链的安全性。
下面我们使用PHP代码来定义区块:
class Block {
public $prevHash;
public $hash;
public $timeStamp;
public $data;
}
字段解释prevHash
前一个区块的Hash值hash当前区块的Hash值timeStamp区块生成的时间戳data区块保存的数据
prevHash、hash和timeStamp这几个字段在区块链中被称为区块头,区块的Hash值使用SHA-256算法计算。计算方法如下:
class Block {
...
public function setBlockHash() {
$data = serialize($this);
$this->hash = hash('sha256', $data);
}
}
首先我们使用serialize()函数把整个区块序列化,然后使用hash()函数计算区块的Hash值,并赋值给hash字段。
区块对象的构造函数如下:
class Block {
...
public function __construct($prevHash, $data) {
$this->prevHash = $prevHash;
$this->timeStamp = time();
$this->data = $data;
$this->setBlockHash();
}
}
另外我们提供一个获取区块Hash值的方法:
class Block
{
...
public function getBlockHash()
{
return $this->hash;
}
}
区块链
前面说了,区块链就是按照一定的规则连接起来的区块,连接的规则就是下一个区块的区块头中必须包含前一个区块的Hash值。我们编写一个区块链对象来保存整条区块链,代码如下:
include('block.php');
class Blockchain
{
public $blocks = [];
}
区块链对象内部使用了一个数组来保存所有的区块,现阶段我们还没有使用到数据库来保存区块链,所以现在只需要把区块链保存在内存即可。
向区块链添加一个新的区块代码如下:
include('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值,而且随着区块链的创建被创建,代码如下:
include('block.php');
class Blockchain
{
...
public function __construct()
{
$this->blocks[] = new Block('', 'Genesis Block');
}
}
创世区块并不需要包含前一个区块的Hash值,所以在创建创世区块时把前一个区块的Hash值设置为空。
OK!我们的简易区块链已经完成了,现在来测试一下我们的代码吧:
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(" ");
}
我们来运行一下测试代码,运行结果如下:
很好,结果符合我们的预期。
总结
本文只是实现了一个最简易的区块链,离完整的区块链还有非常远的距离。在我们现在的实现中存在很多不足,如:添加一个区块的成本很低,没有实现分布式,不能保存到本地磁盘(重启机器数据就会丢失)等,接下来的教程将会不断完善这些问题。
文章发布只为分享区块链技术内容,版权归原作者所有,观点仅代表作者本人,绝不代表区块链兄弟赞同其观点或证实其描述。返回搜狐,查看更多
责任编辑:
php 区块链算法_PHP也能实现区块链?相关推荐
- php 区块链算法_PHP采用Laravel实现区块链DEMO
前言 最近由于比特币的暴涨,导致背后的区块链技术被人给当作热点拿出来.我也不例外的对区块链技术进行了分析.至于比特币,我个人是没有过多的关注.这点见仁见智吧. 我参考了各种区块链技术的介绍以及科普,总 ...
- php 区块链算法_PHP区块链(完整可运行,入门级)
[实例简介]可以发行自己的货币 [实例截图] [核心代码] class block{ private $index; private $timestamp; private $data; privat ...
- php 区块链算法_PoW/BFT等5种主流区块链共识算法的开源代码实现
共识算法是实现自主产权区块链的必不可少的关键环节,本文列出社区中相对成熟的区块链共识算法开源实现,包括BFT共识.Raft共识.Paxos共识.PoW共识等,可供希望开发自主产权区块链的团队参考学习. ...
- 区块链 01(简化后的区块包括父区块哈希值、数据、时间戳、哈希值这四个字段,区块的哈希值由父区块哈希值、数据、时间戳、3个字段拼接通过 哈希算法计算而成)
"""区块包括区块头和区块体两个部分.区块头由版本.父区块哈希值.数据.Merkle根.时间戳.目标难度. #Nonce值组成:区块体实际上可以包含任何内容,在比特币中包 ...
- 视频教程-区块链算法—共识算法-区块链
区块链算法-共识算法 工科硕士,持有高校计算机教师资格证书,从事计算机科学少儿分级体系课程的教研与教学工作,先后开设计算思维.Scratch.Python等少儿编程课等. Gardener ¥498. ...
- MIT教授提出可扩展的新共识算法Algorand,彻底消除区块链分叉的可能性
如果公有区块链要想获得成功--无论是被用作货币,智能合约还是其他某些东西--它就需要一种能够扩展的共识算法. 尽管开发者正在竞相开发一种这样的系统,不过最近一位杰出学者的设计可能会成为这场长期探索中取 ...
- 基于实用拜占庭共识算法(PBFT)的区块链模型的评估
摘要 近年来,区块链成为了互联网金融领域的研宄热点.作为一种分布式的账本技术,区块链具有去中心化,不可篡改,安全可信等诸多优势,但同时面临耗能过高,吞吐量低等问题.共识算法作为区块链的核心,决定了区块 ...
- 区块链中哈希算法c语言代码,解析区块链中的核心技术哈希(Hash)算法
原标题:解析区块链中的核心技术哈希(Hash)算法 作者:崔利民 区块链是分布式数据存储.点对点传输.共识机制.加密算法等计算机技术的新型应用模式.区块链的关键技术组成主要为:P2P网络协议.共识机制 ...
- 区块链技术指2.1 区块链技术
摘要 区块链基础 区块链是随着比特币等数字加密货币的日益普及而逐渐兴起的一种全新技术,它提供了一种去中心化的.无需信任积累的信用建立范式,目前已经引起金融行业.科研机构.政府部门和投资公司的高度重视与 ...
最新文章
- ajax nginx 转发 sessionid_Nginx+Apache实现动静分离 - 孙天飞
- C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数
- 如何让梯形变成平行四边形_开放的课堂 创新的天地——平行四边形的面积教学片段与反思...
- 在POM 4中,dependency中还引入了scope可以使用5个值
- 在鼠标点击的位置 ,添加一个div ,类似手表右键菜单
- python怎么制作简单图_Python简单的制作图片验证码实例
- 成都双流计算机大专学校,成都双流有哪些好的职业学校?
- PS 在线 圆角 矩形 图片 裁剪 生成
- JavaScript中阻止事件冒泡的浏览器兼容
- 卡数字怀念的东西:魔方
- PDF签名系列(2):PDF的签名值到底存在哪里?
- 2021款途锐噪音测试软件,试驾2021款大众途锐:这才是原汁原味的德国沃尔夫斯堡的味道...
- 如何用计算机把数字12变成21,2015年12月计算机二级office考试题及答案
- R语言 线性模型 逐步回归
- FOJ 1021 飞船赛
- 一个UDEC用于采矿或地下开挖工程的示例
- 在PHP中implement什么意思,详解php中的implements 使用
- iMacros Chrome 插件
- Android Activity自动重启的问题
- AutoCAD VBA 离散高程点应用