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

<?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());

PHP之区域块链的更多相关文章

  1. Java--静态区域块

    public class Demo3_2 { static int i=1; static //静态区域块 { //该静态区域块只被执行一次 System.out.println("a&qu ...

  2. javascript实现数据结构: 串的块链存储表示

    和线性表的链式存储结构相类似,也可采用链式方式存储串值.由于串结构的特殊性--结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个 ...

  3. 区块链学习笔记:DAY05 如何使用公有云区块链服务

    这是最后一节课了,主要讲华为云在云区块链提供的服务,如何基于华为云BCS来构建应用 先来个简单的比喻: 1.有关BaaS的范围定义 包含物理主机.虚拟主机.容器服务.区块链.智能合约和服务 2.华为云 ...

  4. 阿里云区块链共创会:BaaS正式商业化 广邀合作伙伴共建生态

    摘要: 阿里云宣布区块链服务Hyperledger Fabric版正式商业化,并发布生态合作伙伴计划. 2019年3月29日,阿里云区块链于深圳召开正式商业化共创会,宣布区块链服务Hyperledge ...

  5. 技术沙龙|京东云区块链进校园-京东云&深圳大学线下沙龙分享回顾

    在刚刚结束的京东云&深圳大学技术沙龙活动中,多位京东云的技术大咖针对京东云BDS产品技术细节.开源计划,与深圳大学的同学和参会者进行了深入探讨,干货满满反响深刻,获得了在场同学与参会者的一致好 ...

  6. FUNMVP:5G技术对块链信任体系建设的影响

    01 区块链现阶段应用在于概念证明 12月10日,工信部向三大运营商正式发放了5G系统实验频率运用允许,这让区块链从业者开端思索5G技术与区块链分别的可能性.在互联网的基础上依据区块链的特性完成价值的 ...

  7. 破除区块链支付壁垒,NGK支付架构方案浮出水面

    什么叫做区块链支付?区块链支付系统与传统支付系统有哪些不同?简要地说,原来传统的支付系统是有一个类似于银行的中间平台存在的,用户们的支付交易第一时间是寄存在平台,由平台核实验证交易行为之后,方才放行交 ...

  8. 读取模式下cbc latch的事件模拟(热块竞争和热链竞争)-P62

    文章目录 1. 背景 2. 过程 2.1 热块竞争 2.1.1 版本11.2.0.1.0 2.1.1.1 session 1(sid:34) 2.1.1.2 session 2(sid:35) 2.1 ...

  9. [转]Oracle数据块体系的详细介绍

    数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小 ...

随机推荐

  1. Shell内置命令 eval

  2. slim.arg_scope()的使用

    [https://blog.csdn.net/u013921430 转载] slim是一种轻量级的tensorflow库,可以使模型的构建,训练,测试都变得更加简单.在slim库中对很多常用的函数进行 ...

  3. 互斥量mutex简介

    互斥量又称互斥锁.互斥量是一个可以处于两态之一的变量:解锁和加锁. 简介 编辑 如果不需要信号量的计数能力,有时可以使用信号量的一个简化版本,称为互斥量(mutex).互斥量仅仅适用于管理共享资源或一 ...

  4. mysql通过表空间来恢复或者传递数据

    mysql的备份工具通常有 mysqldump ,mysqlpump(5.7后新特性)等备份工具,这里我们可以尝试使用表空间进行传递 方式是:拷贝数据文件+拷贝表空间   对应innodb引擎就是 i ...

  5. css 垂直居中、水平居中

    在父元素.子元素未知的情况下居中有两种方法: 第一种方法: .partent{ display:flex; justify-content:center; align-items:center; } ...

  6. JS数组 Array

    1.创建数组 var array=new Array(); 2.添加数组 array.push("111"); array.push("111"); array ...

  7. read more阅读更多,文字超过三行字符后面添加省略号

    var text;$('.blog-item').each(function (i) {text = $(this).find('.blog-excerpt').html();if (text.len ...

  8. 远程仓库 GitHub

    远程仓库 这里介绍的远程仓库指的是 GitHub, 在这个网站,所有非私有的的代码,都可以被其他人查看,所以,一些机密或者重要的文件千万不要上传到这里面,如果需要可以购买付费版本或自己公司搭建埃及的远 ...

  9. 线段树区间合并优化dp——cf1197E(好)

    线段树优化dp的常见套路题,就是先按某个参数排序,然后按这个下标建立线段树,再去优化dp 本题由于要维护两个数据:最小值和对应的方案数,所以用线段树区间合并 /* dp[i]表示第i个套娃作为最内层的 ...

  10. 提高ASP.NET首页性能的方法

    1.js压缩文件,css压缩文件,引用的越少越好. 2.用 HTTP Module 控制页面的生命周期. 3.自定义生成动态页面的静态内容 . 4.页面用GZIP压缩. 5.OutputCache 编 ...