exp2-构造简单区块链

参考

bilibili luotuo

基本构成区块+链

// 区块包含的内容如下
// data
// 之前区块的哈希值
// 自己的哈希值: 由存储在区块中的消息算出来的,data + 之前区块的哈希值
const sha256 = require('crypto-js/sha256')
class Block {
    
    
  constructor(data,previousHash){
    
    
    this.data = data
    this.previousHash = previousHash
    this.hash = this.computHash()
  }

  computHash(){
    
    
    return sha256(this.data + this.previousHash).toString()
  }
}

const block = new Block("转账十元","123")
console.log(block)

在这里插入图片描述

// 区块 的 链
// 注意需要生成祖先区块
class Chain {
    
    
  constructor(){
    
    
    this.chain = [this.bigBang()]
  }

  // 祖先区块
  bigBang(){
    
    
    const genesisBlock = new Block("我是祖先","")
    return genesisBlock
  }
}

const chainExp = new Chain()
console.log(chainExp)

在这里插入图片描述

添加新区块

添加新的区块,需要生成一个新的区块,并将它加入到链中。

  1. 生成区块
  2. 将区块加到链上
    1. 找到最近一个区块的哈希,作为这个新区块的previousHash
    2. 计算此区块的hash
// 区块 的 链
// 注意需要生成祖先区块
class Chain {
    
    
  constructor(){
    
    
    this.chain = [this.bigBang()]
  }

  // 祖先区块
  bigBang(){
    
    
    const genesisBlock = new Block("我是祖先","")
    return genesisBlock
  }
  // 找到最新一个区块
  getLatestBlock(){
    
    
    return this.chain[this.chain.length-1]
  }

  //添加区块到区块链上
  addBlockToChain(newBlock){
    
    
    // data
    // 找到最近一个block的hash
    // 这个hash就是新区块的previousHash
    newBlock.previousHash = this.getLatestBlock().hash;
    newBlock.hash = newBlock.computHash();
    this.chain.push(newBlock);
  }
}

//生成一个新的区块
const block1 = new Block("转账十元","")
chainExp.addBlockToChain(block1)
console.log(chainExp)

在这里插入图片描述

验证区块链

验证当前区块链是否合法

  1. 当前的数据是否被篡改
  2. 验证区块的previousHash是否等于previous区块的Hash
//验证这个当前的区块链是否合法
  // 当前的数据是否被篡改
  // 验证区块的previousHash是否等于previous区块的Hash
  validateChain(){
    
    
    if(this.chain.length === 1){
    
    
      if(this.chain[0].hash !== this.chain[0].computHash()){
    
    
        return false;
      }
      return true;
    }else{
    
    
      // 从第二个区块开始验证,this.chain[1]是第二个区块
      // 验证到最后一个区块
      for(let i = 1;i<=this.chain.length-1;i++){
    
    
        // 验证区块数据是否被篡改
        const blockToValidate = this.chain[i]
        if(blockToValidate.hash !== blockToValidate.computHash()){
    
    
          console.log("数据篡改")
          return false
        }
       // 验证前后区块的hash是否一致
        const previousBlok = this.chain[i-1]
        if(blockToValidate.previousHash !== previousBlok.computHash()){
    
    
          console.log("前后区块链接断裂")
          return false
        }
      }
      return true
    }
  }

const block2 = new Block("转账十个十元","")
chainExp.addBlockToChain(block2)
console.log(chainExp)
console.log(chainExp.validateChain())

在这里插入图片描述

数据篡改

// 篡改区块链数据
chainExp.chain[1].data = "转账100个十元"
console.log(chainExp)
console.log(chainExp.validateChain())

在这里插入图片描述

// 篡改区块链数据以及数据的hash
chainExp.chain[1].data = "转账100个十元"
chainExp.chain[1].hash = chainExp.chain[1].computHash()
console.log(chainExp)
console.log(chainExp.validateChain())

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39333120/article/details/109351876
今日推荐