参考
基本构成区块+链
// 区块包含的内容如下
// 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)
添加新区块
添加新的区块,需要生成一个新的区块,并将它加入到链中。
- 生成区块
- 将区块加到链上
- 找到最近一个区块的哈希,作为这个新区块的previousHash
- 计算此区块的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)
验证区块链
验证当前区块链是否合法
- 当前的数据是否被篡改
- 验证区块的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())