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

<?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. vue+Mint-ui实现登录注册

    创建一个组件:注册组件 (register/index.vue.script.js.style.scss,register/header) 注册路由 router/index.js { path: ' ...

  2. enovia PLM: add characteristic to both prototype and product

    Issue: add new mandatory attribute named LUX_HazardousMaterial to protoype and product, and export t ...

  3. windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭

    windows xp .net framework 4.0 HttpWebRequest 报The underlying connection was closed,基础连接已关闭,错误的解决方法 在 ...

  4. CFgym100020 Problem J. Uprtof

    题意:给你n个点m无向条边.每个点是黑色或者白色的.m条边第一条边边权为2^m,第二条边边权为2^(m-1)....... .在这个图上选择一些边连起来,使得满足:每个黑点连奇数条边,每个白点连偶数条 ...

  5. 【读书笔记】剑指offer

    导语 所有的编程练习都在牛客网OJ提交,链接: https://www.nowcoder.com/ta/coding-interviews 九章算法的 lintcode 也有这本书的题目.https: ...

  6. Vue开发复用组件的基本思想

    可复用组件的价值在于高复用性,它更能将一个项目往高内聚.低耦合的方向发展. 1.组件命名------按组件功能命名: 2.组件内容------明确组件需要实现什么样的功能: 3.组件体积------越 ...

  7. Dataphin支持哪些数据源

    业务数据存储是业务系统最基本的构成,构建数据中台,就是要将这些数据集中起来放到一个有更强算力的地方集中处理,所以对于数据集成的能力是构建数据中台最基本要求: 从存储的发展历程来看,由于不同的业务场景需 ...

  8. 完爆 Best Fit,看阿里如何优化 Sigma 在线调度策略节约亿级成本

    摘要:2018 年“双 11”的交易额又达到了一个历史新高度 2135 亿.相比十年前,我们的交易额增长了 360 多倍,而交易峰值增长了 1200 多倍.相对应的,系统数呈现爆发式增长.系统在支撑“ ...

  9. Android 在OnCreate()中获取控件高度与宽度

    试过在OnCreate()中获取控件高度与宽度的童鞋都知道,getWidth()与getHeight()方法返回是0,具体原因 看一下Activity的生命周期 就会明白. 上代码: 方法一: int ...

  10. 数学思维——cf351A

    把每个值的各种贡献算一下即可 /* ai的小数部分为xi,向下取整对答案贡献为xi 向上取整对答案的贡献是xi-1,如果这个数是0,那么对答案的贡献是xi,即如果0向上取整就可以免去-1 然后sum{ ...