/ blockchain.js
blockchain.js
1 const Block = require("./block"); 2 const cryptoHash = require("./crypto-hash"); 3 4 class Blockchain { 5 constructor() { 6 this.chain = [Block.genesis()]; 7 } 8 9 addBlock({ data }) { 10 const newBlock = Block.mineBlock({ 11 lastBlock: this.chain[this.chain.length - 1], 12 data, 13 }); 14 15 this.chain.push(newBlock); 16 } 17 18 replaceChain(chain) { 19 if (chain.length <= this.chain.length) { 20 console.error("The incoming chain must be longer"); 21 return; 22 } 23 24 if (!Blockchain.isValidChain(chain)) { 25 console.error("The incoming chain must be valid"); 26 return; 27 } 28 29 console.log("replacing chain with", chain); 30 this.chain = chain; 31 } 32 33 static isValidChain(chain) { 34 if (JSON.stringify(chain[0]) !== JSON.stringify(Block.genesis())) { 35 return false; 36 } 37 38 for (let i = 1; i < chain.length; i++) { 39 const { timestamp, lastHash, hash, nonce, difficulty, data } = chain[i]; 40 41 const actualLastHash = chain[i - 1].hash; 42 const lastDifficulty = chain[i - 1].difficulty; 43 44 if (lastHash !== actualLastHash) return false; 45 46 const validatedHash = cryptoHash( 47 timestamp, 48 lastHash, 49 data, 50 nonce, 51 data, 52 difficulty 53 ); 54 55 if (validatedHash !== hash) return false; 56 if (Math.abs(lastDifficulty - difficulty) > 1) return false; 57 } 58 59 return true; 60 } 61 } 62 63 module.exports = Blockchain;