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

<?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. 在并发Java应用程序中检测可见性错误

    了解什么是可见性错误,为什么会发生,以及如何在并发Java应用程序中查找难以捉摸的可见性错误.这些问题你可能也遇到过,当在优锐课学习了一段时间后,我对这些问题有了一定见解,写下这篇文章和大家分享. 检 ...

  2. 关于_getattr_方法的一些理解

    在学习rest framework的过程中,rest framework的request是经过重构的,但是如果调用重构对象request中的属性,如果属性不存在会调用原request对象中的属性,它使 ...

  3. nodejs 进阶:图片裁剪

    demo 图片: 效果: var fs = require('fs'); var gm = require('gm'); gm("./不饿.jpg").crop(100,100,2 ...

  4. 纯前端html导出pdf--分页+不分页--html2canvas+jsPDF

    前言 最近在项目中,有一个导出pdf功能,需要纯前端来实现,调研了多种pdf导出方式,最终决定使用html2canvas+jsPDF来实现需求. 本文就简单介绍一下html2canvas+jsPDF导 ...

  5. leetcood学习笔记-13

    错误记录 class Solution: def romanToInt(self, s: str) -> int: d = {'I':1,'V':5,'X':10,'L':50,'C':100, ...

  6. Attribute 实现Aop

    1.先定义一个 拦截属性 AopAttribute using System; using System.Collections.Generic; using System.Linq; using S ...

  7. Android中的surfaceHolder.lockCanvas(null)返回为null详解

    对于新手学习SurfaceView的时候获取lockCanvas的时候总是返回null的问题很是纠结 canvas = surfaceHolder.lockCanvas(new Rect(0, 0, ...

  8. LINIX上Nginx的从零安装

    源码编译方式: #一般系统中已经装了了make和g++,无须再装 安装make: yum -y install autoconf automake make 安装g++: yum -y install ...

  9. JAVA学习之Java程序开发初次体验

    Java环境搭建算完成了,那么接下来写个Java程序走一个 开发Java程序的简单流程 1.将Java代码编写到扩展名为.java的文件中2.通过javac命令对该Java文件进行编译(生成class ...

  10. VMware Pro v14.1.1 官方版本及激活密钥

    热门虚拟机软件VMware Workstation Pro现已更新至14.1.1,14.0主要更新了诸多客户机操作系统版本,此外全面兼容Wind10创建者更新.12.0之后属于大型更新,专门为Win1 ...