zoukankan      html  css  js  c++  java
  • 51行代码实现简单的PHP区块链

    <?php
    /**
     * 简单的PHP区块链
     * @author Yoper
     * @PHP技术交流QQ群 370648191
     * @Email chen.yong.peng@foxmail.com
     * @wechat YoperMan
     */
    namespace commonlibrarylock;
    /**
     * 区块结构
     */
    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 commonlibrarylocklock
     */
    function create_genesis_block(){
        return new commonlibrarylocklock(0, time(),"第一个区块",0,0);
    }
    
    /**
     * 挖矿,生成下一个区块
     * 这应该是一个复杂的算法,但为了简单,我们这里挖到前1位是数字就挖矿成功。
     * @param commonlibrarylocklock $last_block_obj
     * @return bool|block
     */
    function dig(commonlibrarylocklock $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 commonlibrarylocklock($index,$timestamp,$data,$random_str,$last_block_obj->hash);
    
        //前一位不是数字
        if(!is_numeric($block_obj->hash{2})){
            return false;
        }
        //数数字,返回块
        return $block_obj;
    }
    
    /**
     * 验证区块
     * 这也是一个复杂的过程,为了简单,我们这里直接返回正确
     * @param array $data
     * @return bool
     */
    function verify(commonlibrarylocklock $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=[commonlibrarylockcreate_genesis_block()];
    print_r($blockchain);
    //模拟生成其他区块,我们直接循环生成。实际中,还需要跟踪互联网上多台机器上链的变化,像比特币会有工作量证明等算法,达到条件了才生成区块等
    //我们的链是一个数组,实际生产中应该保存下来
    $previous_block = $blockchain[0];
    for($i=0;$i<=1;$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区块链)[https://blog.csdn.net/chenyoper/article/details/79250889]

  • 相关阅读:
    【转载】SAP_ECC6.0_EHP4或SAP_ECC6.0_EHP5_基于Windows_Server_2008R2_和SQL_server_2008下的安装
    使用delphi 开发多层应用(二十四)KbmMW 的消息方式和创建WIB节点
    使用delphi 开发多层应用(二十三)KbmMW 的WIB
    实现KbmMw web server 支持https
    KbmMW 服务器架构简介
    Devexpress VCL Build v2014 vol 14.1.1 beta发布
    使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器
    KbmMW 4.50.00 测试版发布
    Basic4android v3.80 beta 发布
    KbmMW 认证管理器说明(转载)
  • 原文地址:https://www.cnblogs.com/brady-wang/p/13852166.html
Copyright © 2011-2022 走看看