ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

51行代码实现简单的PHP区块链

2022-01-04 15:58:20  阅读:139  来源: 互联网

标签:index 区块 hash random 51 str PHP block



  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. if(!is_numeric($block_obj->hash{0})){

  57. return false;

  58. }

  59. //数数字,返回块

  60. return $block_obj;

  61. }

  62. /**

  63. * 验证区块

  64. * 这也是一个复杂的过程,为了简单,我们这里直接返回正确

  65. * @param array $data

  66. */

  67. function verify(\common\library\block\block $last_block_obj){

  68. return true;

  69. }

  70. /**

  71. * 生成随机字符串

  72. * @param int $len

  73. * @return string

  74. */

  75. function get_random($len=32){

  76. $str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

  77. $key = "";

  78. for($i=0;$i<$len;$i++)

  79. {

  80. $key.= $str{mt_rand(0,32)};//随机数

  81. }

  82. return $key;

  83. }

  84. header("Content-type:text/html;charset=utf-8");

  85. //生成第一个区块

  86. $blockchain=[\common\library\block\create_genesis_block()];

  87. //模拟生成其他区块,我们直接循环生成。实际中,还需要跟踪互联网上多台机器上链的变化,像比特币会有工作量证明等算法,达到条件了才生成区块等

  88. //我们的链是一个数组,实际生产中应该保存下来

  89. $previous_block = $blockchain[0];

  90. for($i=0;$i<=10;$i++){

  91. if(!($new_block=dig($previous_block))){

  92. continue;

  93. }

  94. $blockchain[]=$new_block;

  95. $previous_block=$new_block;

  96. //告诉大家新增了一个区块

  97. echo "区块已加入链中.新区块是 : {$new_block->index}<br/>";

  98. echo "新区块哈希值是 : {$new_block->hash}<br/>";

  99. print_r($new_block);

  100. echo "<br/><br/>";

  101. }

标签:index,区块,hash,random,51,str,PHP,block
来源: https://blog.csdn.net/lcldh/article/details/122304701

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有