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标准库 ...
随机推荐
- 校园服务nabcd需求分析
我们的团队是敲啥都队 口号是敲啥都队敲啥都对 1.你的创意解决了用户的什么需求?(N) 我们校园服务1主要为了节省学生所浪费的没必要的时间.当你还是大一新生的时候,你是否对大学的规划一无所知,你是否迷 ...
- sql进阶
--1.变量的声明和赋值 declare @Start DateTime, @End DateTime set @Start = '1999-9-9' set @End = '2000-1-1' ...
- 单机单网卡最大 tcp 长连接数是 65535 吗
在Linux里,如果是作为客户端或者负载均衡器的节点连接多个服务器,在connect()服务器之前, 调用bind()先绑定IP地址(通常是在多网卡的场景),即使使用bind(IP, port=0), ...
- Opencv-Python No module named 'cv2.cv2'
关于 No module named 'cv2.cv2'等其他一些问题,一般都是版本不兼容的问题,重装即可. pip uninstall opencv-python 然后 pip install op ...
- 连接oracle数据库
一.连接oracle数据库 一.windows环境 oracle windows客户端下载地址:http://www.oracle.com/technetwork/topics/winx64soft- ...
- supervisor无法监听uwsgi
➜ ~ sudo supervisorctl data_config FATAL Exited too quickly (process log may have details) data_conf ...
- ORA-00600: 内部错误代码, 参数: [kcm_headroom_warn_1], [], [], [], [], [], [], [], [], [], [], []
SQL*Plus: Release 11.2.0.4.0 Production on 星期三 1月 1 08:53:48 2003 Copyright (c) 1982, 2013, Oracle. ...
- localforage调用setItem时出现DOMException错误的解决方法
今天使用localforage时出现下面的错误: Uncaught (in promise) DOMException transaction.onabort.transaction.onerror ...
- javascript中 for-in和 for-of的区别
其中for-of是ES6新增的迭代语法 在MDN上的解释: for...in语句以任意顺序遍历一个对象的可枚举属性.对于每个不同的属性,语句都会被执行.for...of语句在可迭代对象(包括 Arra ...
- OpenGL——外部读档+异常报错
从外部读取shader文件: 先添加Shader类: 再创建vertexSource.txt和fragmentSource.txt两个文件: 如图填入shader: 在shader.h宣告: 在sha ...