请选择 进入手机版 | 继续访问电脑版
公众号

实现简单的PHP区块链demo

所在版块: 后端 2018-05-27 23:17 [复制链接] 查看: 389|回复: 0

本文原始地址:php区块链demo

随着现在比特币、以太坊等去中心化货币带起了区块链的发展,很多phper都不知从何如何入手。
今天让我们PHP也实现一下区块链的简单流程。
如有需要可加PHP交流群(320205320/180460365)。

我们新建一个文件test.php,把以下代码复制进去,保存。
只有一个类、4个方法。可直接运行。

  1. <?php
  2. /**
  3. * 简单的PHP区块链
  4. * @author Yoper
  5. * @PHP技术交流QQ群 370648191
  6. * @Email chen.yong.peng@foxmail.com
  7. * @wechat YoperMan
  8. */
  9. namespace common\library\block;
  10. /**
  11. * 区块结构
  12. */
  13. class block{
  14.     private $index;
  15.     private $timestamp;
  16.     private $data;
  17.     private $previous_hash;
  18.     private $random_str;
  19.     private $hash;
  20.     public function __construct($index,$timestamp,$data,$random_str,$previous_hash)
  21.     {
  22.         $this->index=$index;
  23.         $this->timestamp=$timestamp;
  24.         $this->data=$data;
  25.         $this->previous_hash=$previous_hash;
  26.         $this->random_str=$random_str;
  27.         $this->hash=$this->hash_block();
  28.     }
  29.     public function __get($name){
  30.         return $this->$name;
  31.     }
  32.     private function hash_block(){
  33.         $str=$this->index.$this->timestamp.$this->data.$this->random_str.$this->previous_hash;
  34.         return hash("sha256",$str);
  35.     }
  36. }
  37. /**
  38. * 创世区块
  39. * @return \common\library\block\block
  40. */
  41. function create_genesis_block(){
  42.     return new \common\library\block\block(0, time(),"第一个区块",0,0);
  43. }
  44. /**
  45. * 挖矿,生成下一个区块
  46. * 这应该是一个复杂的算法,但为了简单,我们这里挖到前1位是数字就挖矿成功。
  47. * @param \common\library\block\block $last_block_obj
  48. */
  49. function dig(\common\library\block\block $last_block_obj){
  50.     $random_str = $last_block_obj->hash.get_random();
  51.     $index=$last_block_obj->index+1;
  52.     $timestamp=time();
  53.     $data='I am block '.$index;
  54.     $block_obj = new \common\library\block\block($index,$timestamp,$data,$random_str,$last_block_obj->hash);
  55.    
  56.     //前一位不是数字
  57.     if(!is_numeric($block_obj->hash{0})){
  58.         return false;
  59.     }
  60.     //数数字,返回块
  61.     return $block_obj;
  62. }
  63. /**
  64. * 验证区块
  65. * 这也是一个复杂的过程,为了简单,我们这里直接返回正确
  66. * @param array $data
  67. */
  68. function verify(\common\library\block\block $last_block_obj){
  69.     return true;
  70. }
  71. /**
  72. * 生成随机字符串
  73. * @param int $len
  74. * @return string
  75. */
  76. function get_random($len=32){
  77.     $str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  78.     $key = "";
  79.     for($i=0;$i<$len;$i++)
  80.     {
  81.         $key.= $str{mt_rand(0,32)};//随机数
  82.     }
  83.     return $key;
  84. }


  85. header("Content-type:text/html;charset=utf-8");
  86. //生成第一个区块
  87. $blockchain=[\common\library\block\create_genesis_block()];
  88. //模拟生成其他区块,我们直接循环生成。实际中,还需要跟踪互联网上多台机器上链的变化,像比特币会有工作量证明等算法,达到条件了才生成区块等
  89. //我们的链是一个数组,实际生产中应该保存下来
  90. $previous_block = $blockchain[0];
  91. for($i=0;$i<=10;$i++){
  92.     if(!($new_block=dig($previous_block))){
  93.         continue;
  94.     }
  95.     $blockchain[]=$new_block;
  96.     $previous_block=$new_block;
  97.    
  98.     //告诉大家新增了一个区块
  99.     echo "区块已加入链中.新区块是 : {$new_block->index}<br/>";
  100.     echo "新区块哈希值是 : {$new_block->hash}<br/>";
  101.     print_r($new_block);
  102.     echo "<br/><br/>";
  103. }
复制代码
以上文件可以直接运行。运行结果如下:


完善之后,就可以发行自己的货币或者智能合约了。

完。

可加以下微信,拉你进微信区块链行业交流群,请发送验证信息"区块链"。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫描二维码关注零零糖公众号
一个萌萌哒的软件工程师每晚在你枕边唠嗑就问你怕不怕

QQ|Archiver|手机版|小黑屋|性零糖,你懂得 ( 粤ICP备15029177号 )

GMT+8, 2018-8-20 05:15 , Processed in 1.248424 second(s), 31 queries .

Powered by Yoper!

© 2003-2019 Yoper.

快速回复 返回列表