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

2022/1/4 17:10:14

本文主要是介绍51行代码实现简单的PHP区块链,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


  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. }



这篇关于51行代码实现简单的PHP区块链的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程