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标准库 ...
随机推荐
- MySql 主从复制 mysql-proxy实现读写分离
1.安装和配置Docker 服务器版本阿里云CentOS7.4 docker版本18.06.0-ce docker安装步骤https://docs.docker.com/install/linux/d ...
- Codeforces 1154E - Two Teams - [线段树+链表]
题目链接:https://codeforces.com/contest/1154/problem/E 题意: $n$ 个人排成一排,第 $i$ 个人的能力值为 $a[i]$,$a[1 \sim n]$ ...
- mvc模式的理解
一开始总是觉得dao层和service层没有区别,甚至觉得service层根本就是多余的,service层就是把dao层的内容调用了一下,然后重写了一次,后来才理解到,dao层是数据链路层,是与数据库 ...
- day26:静态方法,类方法和反射
1,包内部不要去尝试应用使用相对导入,一定不会成功的,他不支持这个机制,包内导入时一定要用绝对导入 2,复习接口类,抽象类,Python中没有接口类,有抽象类,抽象类是通过abc模块中的metacla ...
- shell 脚本示例
#!/bin/sh #while true #do cd /mnt/vfw/third_meteor for sub in `ls` do cd /mnt/vfw/third_meteor/${sub ...
- Autofac之类型注册
本次主要学习一下Autofac中实现类型注册的几种方式,这里并不打算一开始就从基于接口开发的服务关联切入,而是先从一个简单的类型注册来学起,虽然实际开发中可能不会这么做,但是个人感觉从这里学起理解能能 ...
- c++ 第一次实验
实验内容: 2-28:实现一个简单的菜单程序,运行时显示“Menu:A(dd) D(elete) S(ort) Q(uit),Selete one:”提示用户输入.A表示增加,D表示删除, S表示排序 ...
- vue框架与koa2服务器实现跨域通信
首先我们在vue中引入axios, npm install axios --save 在需要用到的页面引入axios import axios from "axios"; 用axi ...
- 8、jeecg 笔记之 自定义word 模板导出(一)
1.前言 jeecg 中已经自带 word 的导出导出功能,其所使用的也是 easypoi,尽管所导出的 word 能满足大部分需求, 但总是有需要用到自定义 word导出模板,下文所用到的皆是 ea ...
- Golang 之协程详解
转自:https://www.cnblogs.com/liang1101/p/7285955.html 一.Golang 线程和协程的区别 备注:需要区分进程.线程(内核级线程).协程(用户级线程)三 ...