本文原始地址: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区块链的更多相关文章

  1. 只用120行Java代码写一个自己的区块链

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Java 语言来实现一个简单的区块链,用不到 120 行代码来揭示区 ...

  2. 只用200行Go代码写一个自己的区块链!

    Coral Health · 大约23小时之前 · 220 次点击 · 预计阅读时间 7 分钟 · 不到1分钟之前 开始浏览 区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大 ...

  3. 只用120行Java代码写一个自己的区块链-3挖矿算法

    在本系列前两篇文章中,我们向大家展示了如何通过精炼的Java代码实现一个简单的区块链.包括生成块,验证块数据,广播通信等等,这一篇让我们聚焦在如何实现 PoW算法. 大家都无不惊呼比特币.以太坊及其他 ...

  4. 只用200行Go代码写一个自己的区块链!(转)

    区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链 ...

  5. jquery轮播图详解,40行代码即可简单解决。

    我在两个月以前没有接触过html,css,jquery,javascript.今天我却在这里分享一篇技术贴,可能在技术大牛面前我的文章漏洞百出,也请斧正. 可以看出来,无论是div+css布局还是jq ...

  6. 只用120行Java代码写一个自己的区块链-2网络

    已经看完第一章的内容了吗,欢迎回来. 上一章我们介绍了关于怎么去编写自己的区块链,完成哈希和新块的校验.但是它只是在一个终端(结点)上跑.我们怎么样来连接其他结点以及贡献新的块呢,怎么样广播到其他结点 ...

  7. 简化的鸿蒙WiFi接口,仅需几行代码,简单易用!

    使用鸿蒙原始WiFI API接口进行编程,整个过程稍显繁琐,为此我们对鸿蒙原始WiFi API接口做了一层封装,形成了一套更简单易用的接口. 简化后的API接口 STA模式 // 连接WiFi热点,并 ...

  8. Python 70行代码实现简单算式计算器

    描述:用户输入一系列算式字符串,程序返回计算结果. 要求:不使用eval.exec函数. 实现思路:找到当前字符串优先级最高的表达式,在算术运算中,()优先级最高,则取出算式最底层的(),再进行加减乘 ...

  9. 用Python写一个随机数字生成代码,5行代码超简单

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 第一步,安装 random 库 random库是使用随机数的Python标准库 ...

随机推荐

  1. char

    1 char是多少位的 2 java用的是什么方式表示字符 3 Unicode是用多少位表示的 1的答案是16位的,2的答案是Unicode,3的答案是16位 值得注意的是,2的答案并不是utf-8 ...

  2. ASP.NET Core 集成测试中结合 WebApplicationFactory 使用 SQLite 内存数据库

    SQLite 内存数据库(in-memory database)的连接字符串是  Data Source=:memory: ,它的特点是数据库连接一关闭,数据库就会被删除.而使用  services. ...

  3. ubus socket always in connecting status

    When we try to transplant ubus to uclinux, ubusd can't run but "ubus list" will hang up. 1 ...

  4. 2. Scala变量

    2.1 变量是程序的基本组成单位 举一个简单的例子 object boke_demo01 { def main(args: Array[String]): Unit = { var a: Int = ...

  5. flask读书笔记

    学习flask的一个很好的网站:http://www.pythondoc.com/flask-mega-tutorial/helloworld.html ======================= ...

  6. SecureCRT连接linux步骤

    SecureCRT连接linux步骤  做个笔记,以免隔段时间后忘了 LINUX系统一般都是用来作服务器使用,而且都是通过命令行来操作,为了操作方便我们都会使用第三方软件来远程操作.CRT就是比较常用 ...

  7. const成员函数用法

    详见博客,该博客讲解得很详细,为节省时间就--

  8. 2018-2019-2 20165336《网络攻防技术》Exp5 MSF基础应用

    2018-2019-2 20165336<网络攻防技术>Exp5 MSF基础应用 一.攻击实例 主动攻击的实践 ms08_067(成功) payload/generic/shell_rev ...

  9. 获取本机IP地址的方法

    public class Test { public static void main(String[] strings) { try { InetAddress candidateAddress = ...

  10. Fiddler忽略捕捉大文件流

    Fiddler是款非常不错的抓包软件,可以方便的捕捉各种软件发起的HTTP请求,甚至可以在发送给服务器前或响应给应用前修改数据.但是在使用时发现,在开启Fiddler时,在浏览器中下载文件时不会马上弹 ...