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

<?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. Nginx基础优化

    Nginx基础优化 1.隐藏nginx header版本号 1.1查看版本号 [root@Nginx ~]# curl -I http://www.yunwei.cn HTTP/1.1 200 OK ...

  2. ES模块的基本用法常见使用问题

    本文作者:高峰,360奇舞团前端工程师,W3C WoT工作组成员. ES6中引入了模块(Modules)的概念,相信大家都已经挺熟悉的了,在日常的工作中应该也都有使用. 本文会简单介绍一下ES模块的优 ...

  3. JavaWeb开发之一《Tomcat服务器的部署、安装及应用》

    搬以前写的博客[2014-12-10 21:43] 这几天做了一个Java的程序,然后先把他搭载到Web上,于是学习了基于Tomcat服务器的web开发,这里回顾一下Tomcat服务器的搭建过程. 1 ...

  4. express 路由能力

    demo var express=require("express"); var app=express(); app.get("/",function(req ...

  5. CF734E Anton and Tree

    \(\mathtt{CF734E}\) \(\mathcal{Description}\) 给一棵\(n(n\leq200000)\)个节点的树,每个点为黑色或白色,一次操作可以使一个相同颜色的连通块 ...

  6. jsp service bean

    //在jsp中使用后台service中方法需要在jsp页面引入service bean 1 <%@page import="com..entity.Users"%> & ...

  7. jsp EL运算符

    算术运算符 算术运算符 说明 示例 结果 + 加 ${1 + 1} 2 - 减 ${1 - 1} 0 * 乘 ${1 * 2} 2 /或div 除 ${3 / 2} 1.5 %或mod 取余 ${3 ...

  8. Linux - 退出vim界面

    参考: https://blog.csdn.net/achi010/article/details/72775721 https://www.cnblogs.com/dalaoban/p/938130 ...

  9. HIVE基本原理和基础

    读时模式:HIVE加载数据时不校验,查询数据时才校验,与数据库相反

  10. 【纪中集训】2019.07.11【NOIP提高组】模拟 B 组TJ

    Preface 今天的B组题确实比A组难多了... T1 Description 有一个长为\(n(n\in[1,2*10^5])\)的01串,有\(m(m\in[1,10^5])\)个限制\(a_i ...