美文网首页
用JS手写一个区块链

用JS手写一个区块链

作者: 月_关 | 来源:发表于2020-01-11 09:59 被阅读0次

     区块链是由一个所有人能够访问的区块构成的公共数据库。这好像没有什么特别的,不过它们有个有意思的特性:它们是无法变的。要是1个区块被插入到区块链中,除非让剩下的另外区块失效,不然这是不会再被更改的。

    区块链是由千千万万的区块连接在一起的。链上的区块根据某一方法容许人们检验到是不是有人控制了以前的一切区块。

    那么人们怎样保证数据的完整性呢?每一区块都含有1个基于其内容计算出来的hash。同时也涵盖了前1个区块的hash。

    class Block { // 创建区块类

      constructor(index, timestamp, data, previousHash = '') {

        this.index = index

        this.previousHash = previousHash

        this.timestamp = timestamp

        this.data = data

        this.hash = this.calculateHash()

      }

      calculateHash () { // 根据内容计算哈希

        return sha256(this.index + this.previousHash + this.timestamp + JSON.stringify(this.data)).toString()

      }

    }

    class Blockchain { // 创造一个链,现在我们可以在Blockchain类中将区块链接起来了

      constructor() {

        this.chain = [this.createGenesisBlock()]

      }

      createGenesisBlock () {

        var time = '11/01/2020'

        return new Block(0, time, 'Genesis block', '0')

      }

      /**

      * 返回我们区块链上最新的区块。

      */

      getLatestBlock () {

        return this.chain[this.chain.length - 1]

      }

      /**

      * 负责将新的区块添加到我们的链上。

      * 为此,我们将前一个区块的hash添加到我们新的区块中。这样我们就可以保持整个链的完整性。

      * 因为只要我们变更了最新区块的内容,我们就需要重新计算它的hash。

      * 当计算完成后,我将把这个区块推进链里(一个数组)。

      */

      addBlock (newBlock) {

        newBlock.previousHash = this.getLatestBlock().hash

        newBlock.hash = newBlock.calculateHash()

        this.chain.push(newBlock)

      }

      /**

      * 验证区块的有效性

      * 它会遍历所有的区块来检查每个区块的hash是否正确。

      * 它会通过比较previousHash来检查每个区块是否指向正确的上一个区块。

      * 如果一切都没有问题它会返回true否则会返回false

      */

      isChainValid () {

        for (var i = 1; i < this.chain.length; i++) {

          var currentBlock = this.chain[i]

          var previousBlock = this.chain[i - 1]

          if (currentBlock.hash !== currentBlock.calculateHash()) {

            return false

          }

          if (currentBlock.previousHash !== previousBlock.hash) {

            return false

          }

        }

        return true

      }

    }

    // 使用区块链

    var savjeeCoin = new Blockchain()

    savjeeCoin.addBlock(new Block(1, '11/01/2020', { amount: 4 }))

    savjeeCoin.addBlock(new Block(2, '11/01/2020', { amount: 8 }))

    // 区块链是不可变的。一旦添加,区块就不可能再变更了。让我们试一下!

    // 检查是否有效(将会返回true)

    console.log('Blockchain valid?' + savjeeCoin.isChainValid())

    // 现在尝试操作变更数据

    savjeeCoin.chain[1].data = { amount: 100 }

    // 再次检查是否有效 (将会返回false

    console.log('Blockchain valid?' + savjeeCoin.isChainValid())

    // 其实区块链的原理并不复杂,这个小例子证明了区块链的工作原理。

    相关文章

      网友评论

          本文标题:用JS手写一个区块链

          本文链接:https://www.haomeiwen.com/subject/ayyvactx.html