zoukankan      html  css  js  c++  java
  • PHP之区域块链

    搭建一个最简单的区块链吧。代码简单易懂。

    <?php
    //区域块链
    //block 区块
    // chain 链

    //data 
    //之前区块的has值
    //自己的has值 : 他是由存储在区块链的信息算出来的 (data + 之前数据has)

    class Block {

        public $data; //传入数据
        private $previousMash; 
        
        public function __construct($data,$previousMash){

            $this->data = $data;
            $this->previousMash = $previousMash;
            $this->hash = $this->computerHash();
        }
        //行程has秘钥
        public function computerHash(){
            return hash('sha256',$this->data); 
        }

    }

    //区块-的-链
    //生成祖先
    class Chain{
        
        public function __construct(){
            $this->chain = [$this->bigBang()];
        }
        //生成祖先数据
        public function bigBang(){
           return  new Block('我是祖先','99999');
        }

        public function getLatestBlock(){
            return $this->chain[count($this->chain)-1];
        }

        //验证这个区域块链是否合法
        //当前数据是否被篡改
        //验证区块的previousHash 是否等于priviousHash
        
        public function validateChain(){
     
            if(count($this->chain) === 1){
                if($this->chain[0]->hash !== $this->chain[0]->computerHash()){
                    return false;
                }
                return true;
            }

            //this.chain[1] 第二个区块
            //我们第二个区域块开始验证
            //验证最后一个区块 count($this->chain)-1
            for($i = 1;$i<count($this->chain)-1;$i++){
                $blockToValidate = $this->chain[$i];
                //当前数据有没有被篡改    
                if($blockToValidate->hash !== $blockToValidate->computerHash()){
                    echo '数据篡改';
                    return false;
                }
                //当前验证区域块previousHash是否等于previous区域块的hash
                $previousBlock = $this->chain[$i-1];   
                if($blockToValidate->previousHash !== $previousBlock->hash){
                    echo '前后块链断裂';
                    return false;
                }            
            }
            return true;
        }

        //添加区块到区域块链上
        public function addBlockToChain($newBlock){
            //data
            //找到最后一个block的has
            //这个has就是新区域块链的priviousHash
            
            $newBlock->priveiousHash = $this->getLatestBlock()->hash; 
            $newBlock->hash = $newBlock->computerHash();
            array_push($this->chain,$newBlock);
        }
    }



    //生成块
    $Block =  new Block('转账十元123','123');

    // echo '<pre>';
    // print_r($Block);
    //生成链
    // $Chain = new Chain();
    // echo '<pre>';
    // print_r($Chain);
    $Block1 =  new Block('转账十元','123');
        
    // echo '<pre>';
    // print_r($Block);

    $Chain = new Chain();

    $Chain ->addBlockToChain($Block);
    $Chain ->addBlockToChain($Block1);
    echo '<pre>';
    print_r($Chain);

    // print_r($Chain -> validateChain());



    //尝试篡改数据
    $Chain->chain[1]->data = '我最好看';
    echo '<pre>';
    print_r($Chain);

    var_dump($Chain -> validateChain());
  • 相关阅读:
    [BZOJ 3282] Tree 【LCT】
    [BZOJ 2049] [Sdoi2008] Cave 洞穴勘测 【LCT】
    [BZOJ 1036] [ZJOI2008] 树的统计Count 【Link Cut Tree】
    [HDOJ
    Excel+DDT数据驱动实例
    jenkins+SVN配置
    [转]loadrunner:系统的平均并发用户数和并发数峰值如何估算
    loadrunner:Auto Correlate自动定位瓶颈
    loadrunner:判断是否服务器连接池瓶颈
    利用page_source抓取网页中的URL,进行链接测试
  • 原文地址:https://www.cnblogs.com/corvus/p/12006679.html
Copyright © 2011-2022 走看看