/ 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;