51行代码实现简单的PHP区块链
本文原始地址:php区块链demo
今年区块链特别火,我也很火啊。我火什么呢。前几年,公众平台出现,还得花时间去学去看,后来小程序出现,又得花时间精力去学去看。现在比特币、以太坊等去中心化货币带起了区块链的发展。还得学。
没办法,技术改变师姐。不,是改变世界。
前些天看到python写的50行代码实现的简单区块链。今天让我们PHP也实现一下区块链的简单流程。
phper或其他人如有需要可加PHP区块链交流群(370648191/201923866)。
只有一个类、4个方法。可直接运行。
---------------------
作者:chenYoper-陈永鹏
来源:CSDN
原文:https://blog.csdn.net/chenyoper/article/details/79250889
版权声明:本文为博主原创文章,转载请附上博文链接!
贴下代码:
<?php
/**
* 简单的PHP区块链
* @author Yoper
* @PHP技术交流QQ群 370648191
* @Email chen.yong.peng@foxmail.com
* @wechat YoperMan
*/
//namespace common\library\block;
/**
* 区块结构
*/
class block{
private $index;
private $timestamp;
private $data;
private $previous_hash;
private $random_str;
private $hash;
public function __construct($index,$timestamp,$data,$random_str,$previous_hash)
{
$this->index=$index;
$this->timestamp=$timestamp;
$this->data=$data;
$this->previous_hash=$previous_hash;
$this->random_str=$random_str;
$this->hash=$this->hash_block();
}
public function __get($name){
return $this->$name;
}
private function hash_block(){
$str=$this->index.$this->timestamp.$this->data.$this->random_str.$this->previous_hash;
return hash("sha256",$str);
}
}
/**
* 创世区块
* @return \common\library\block\block
*/
function create_genesis_block(){
return new block(0, time(),"第一个区块",0,0);
}
/**
* 挖矿,生成下一个区块
* 这应该是一个复杂的算法,但为了简单,我们这里挖到前1位是数字就挖矿成功。
* @param \common\library\block\block $last_block_obj
*/
function dig(\block $last_block_obj){
$random_str = $last_block_obj->hash.get_random();
$index=$last_block_obj->index+1;
$timestamp=time();
$data='I am block '.$index;
$block_obj = new block($index,$timestamp,$data,$random_str,$last_block_obj->hash);
//echo '<br>';
//var_dump($block_obj->hash{0});
//前一位不是数字
if(!is_numeric($block_obj->hash{0})){
return false;
}
//数数字,返回块
return $block_obj;
}
/**
* 验证区块
* 这也是一个复杂的过程,为了简单,我们这里直接返回正确
* @param array $data
*/
function verify(\block $last_block_obj){
return true;
}
/**
* 生成随机字符串
* @param int $len
* @return string
*/
function get_random($len=32){
$str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$key = "";
for($i=0;$i<$len;$i++)
{
$key.= $str{mt_rand(0,32)};//随机数
}
return $key;
}
header("Content-type:text/html;charset=utf-8");
//生成第一个区块
$blockchain=[create_genesis_block()];
//var_dump($blockchain);die;
//模拟生成其他区块,我们直接循环生成。实际中,还需要跟踪互联网上多台机器上链的变化,像比特币会有工作量证明等算法,达到条件了才生成区块等
//我们的链是一个数组,实际生产中应该保存下来
$previous_block = $blockchain[0];
for($i=0;$i<=10;$i++){
if(!($new_block=dig($previous_block))){
continue;
}
$blockchain[]=$new_block;
$previous_block=$new_block;
//告诉大家新增了一个区块
echo "区块已加入链中.新区块是 : {$new_block->index}<br/>";
echo "新区块哈希值是 : {$new_block->hash}<br/>";
print_r($new_block);
echo "<br/><br/>";
}
51行代码实现简单的PHP区块链的更多相关文章
- 只用120行Java代码写一个自己的区块链
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区 ...
- 只用200行Go代码写一个自己的区块链!
Coral Health · 大约23小时之前 · 220 次点击 · 预计阅读时间 7 分钟 · 不到1分钟之前 开始浏览 区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大 ...
- 只用120行Java代码写一个自己的区块链-3挖矿算法
在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...
- 只用200行Go代码写一个自己的区块链!(转)
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链 ...
- jquery轮播图详解,40行代码即可简单解决。
我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jq ...
- 只用120行Java代码写一个自己的区块链-2网络
已经看完第一章的内容了吗,欢迎回来. 上一章我们介绍了关于怎么去编写自己的区块链,完成哈希和新块的校验.但是它只是在一个终端(结点)上跑.我们怎么样来连接其他结点以及贡献新的块呢,怎么样广播到其他结点 ...
- 简化的鸿蒙WiFi接口,仅需几行代码,简单易用!
使用鸿蒙原始WiFI API接口进行编程,整个过程稍显繁琐,为此我们对鸿蒙原始WiFi API接口做了一层封装,形成了一套更简单易用的接口. 简化后的API接口 STA模式 // 连接WiFi热点,并 ...
- Python 70行代码实现简单算式计算器
描述:用户输入一系列算式字符串,程序返回计算结果. 要求:不使用eval.exec函数. 实现思路:找到当前字符串优先级最高的表达式,在算术运算中,()优先级最高,则取出算式最底层的(),再进行加减乘 ...
- 用Python写一个随机数字生成代码,5行代码超简单
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 第一步,安装 random 库 random库是使用随机数的Python标准库 ...
随机推荐
- 团队项目-课程MS需求分析心得
我们的课程管理项目需求讲道理其实应该是比较简单的,但是在经过几次和老师讨论过后,项目需求已经多得让人脑门疼,后来继续跟老师聊,老师嘴上说着减减减,但是每次讨论下来需求还是会变得更多,以致于个人已经不再 ...
- Java 非静态内部类中可以定义静态变量或方法吗?
如图: 这个问题的答案是不可以 由于内部类的实例化是由外部类实例化之后加载的,如果外部类还没有实例化,这时候调用内部类的静态成员,此时内部类还没有被加载,却要开始创建静态成员,这是矛盾的,所以java ...
- 几个bat文件(关于robot freamwork安装)
如果安装后 没有这几文件,或者在运行后 提示 文件缺少这个文件 , 就需要手动创建. 一般文件在 :C:\Python27\Scripts 这个目录下 1.pybot.bat文件: @echo o ...
- GenericServlet
Generic-汉语意思:类的adj GenericServlet是一个抽象类,它的源码很容易看懂,继承Servlet接口和ServletConfig接口 所有它里面有父接口里面的方法,所以它就是在S ...
- org.springframework.boot.web.server.WebServerException: Unable to create tempDir. java.io.tmpdir is set to C:\Users\ADMINI~1\AppData\Local\Temp\2\
问题原因:springboot创建临时文件找不到对应的目录 解决办法:1. 重新指定临时文件位置 java -Djava.io.tempdir=D:/tmpdir -jar -my_project. ...
- SharePoint 已在此服务器场中安装 ID 为 XXXXXXXXX 的功能。请使用强制属性显式地重新安装此功能。解决方法
图1: 图2: 解决方法: stsadm -o deploysolution -name ***.wsp -immediate -allowGacDeployment -url http://*** ...
- 问题记录 --Error parsing column 1 (Function_Num=10 - String)”
当C#查询数据库出现Error parsing column ## 的时候,首先去看看数据库里面该字段是什么类型,然后在看看你在创建model 的时候是什么类型,如果model的类型和数据库字段类型不 ...
- 友金所招聘Java工程师面试题
友金所是一家位于深圳南山科技园的P2P网贷公司,用友集团控股.该公司采用渐进式的问答面试,没有笔试题.比如面试者说熟悉多线程,面试官就问哪些方式解决并发:面试者说采用Synchronized或者Ree ...
- ubuntu 下dns一类的处理
如何关掉Ubuntu内置的dnsmasq服务 sudo vi /etc/NetworkManager/NetworkManager.conf找到dns=dnsmasq,在前面增加“#”,也就是把这句注 ...
- github仓库的初步使用
github是被戏称为男人们的朋友圈,在github里可以很方便的和同伴合作.以下是github初步建立的步骤.(由于我已经安装好了,所有没有插入图片,如果有未降到的问题先自行百度,如果我后续碰到有关 ...