让前端飞前端区块链

前端与区块链

2019-03-04  本文已影响29人  Adoins

前言

区块链作为近几年十分热门的互联网技术,作为一个合格的程序猿应当不忘初心,保持对技术的热情去了解去学习。并且 Node.js 可以用来开发区块链,solidity开发智能合约,其也是类JavaScript 的语言,因此区块链还是十分适合前端工程师了解学习的。

区块链是什么

区块链(block chain)字面意思是包含信息的区块链接一起组成的信息链条, 本质是分布式、不可篡改、信息透明化的、昂贵的、缓慢的数据库。

其发展分为三个部分:

有以下特性:

区块链黑话科普

村庄小例子,理解记账、挖矿、共识等机制

  1. 村庄 1.0
    采用中心记账,有专门的账房先生,记账转账等都由账房先生处理,即本中心式,效率高;缺点是如果账房生病,则系统崩溃,而且账房先生可以随意篡改数据,比如之前你转账给老王100块,他可以改为0,你也没办法为自己证明确实已经转账了。
  2. 村庄 2.0
    中本聪提出了点对点记账的方式,即人人都能记账,每人有一个账本,账本的每一页记录着交易信息,账本哈希值(用来唯一标示账本处理信息),时间,以及上一页的哈希。村民的每一次转账都得用自己家的大喇叭通知全村庄(即p2p广播)。
    特点: 有人生病或者出去旅游别人找到不到他没关系,找村庄里任何一个人同步一下账本即可;但是记账比较麻烦,因此设置了手续费,而且为了鼓励记账,产生了挖矿以及矿工奖励的概念;挖矿就是用算数学题的方式(只能暴力破解),通过挖矿所用的时间等标识工作量

数字货币

区块链前景展望

基于区块链的特性的各种脑洞大开的应用

区块链现在最广泛的应用

区块链场景

具体应用领域

学习区块链的辅助工具

迷你区块链 iblockchain,这是github上的一个开源项目,可以帮助理解区块链,有以下主要功能:

blockchain.png

区块长什么样

想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。


区块.png
  1. 区块链上的一个区块:

    • Index:是哪一个区块(创世块的索引是0)?
    • Hash:区块是否有效?
    • Previous Hash:前一个区块是否有效?
    • Timestamp:什么时候添加的区块?
    • Data:什么信息存储在区块上?
    • Nonce:在找到有效区块之前,我们进行了多少次迭代?
  2. 创世区块:
    每一个区块链都是从 创世区块(Genesis Block)开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。

  3. 当一个新的区块被开采时会发生什么?
    让我们挖出我们的第一个区块。在命令行中输入mine freeCodeCamp。
    区块链查看链上最新的区块来获取index和previous hash。在这个案例下创世块是最新的区块。

    • Index:0+1=1
    • Previous Hash:0000018035a828da0…
    • Timestamp:区块被添加的时间
    • Data:freeCodeCamp
    • Hash:???
    • Nonce:???
  4. Hash是如何计算的?
    哈希值是唯一标识数据的固定长度的数值。Hash是通过将Index、Previous Hash、Timestamp、Data和Nonce作为输入值来计算的。CryptoJS.SHA256(index+previousHash+timestamp+data+nonce)
    SHA256算法将会依据这些输入计算出一个唯一Hash值。同样的输入总是会返回同样的结果。你是否注意到区块Hash中的四个前导0?
    四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度

  isValidNewBlock (newBlock, previousBlock) {
    const newBlockHash = this.calculateHashForBlock(newBlock)
    if (previousBlock.index + 1 !== newBlock.index) {
      console.log('[错误]: 新区快index不对')

      return false
    } else if (previousBlock.hash !== newBlock.previousHash) {
      console.log(`[错误]: 第${newBlock.index}个区块的previousHash不对`)

      return false
    } else if (newBlockHash !== newBlock.hash) {
      console.log(`[错误]: 第 ${newBlock.index}个区块hash不对,算出的是${newBlockHash} 区块里本来的hash是${newBlock.hash} 看来数据被篡改了`)

      return false
    } else if (newBlockHash.slice(0, this.difficulty) !== '0'.repeat(this.difficulty)) {
      return false
    } else if (!this.isValidTrans(newBlock.data)) {
      console.log('[错误]: 交易不合法')
      return false
    } else {
      return true
    }
  }
  1. Nonce是什么?
    Nonce是用来查找一个有效Hash的次数。
generateNewBlock () {
    const nextIndex = this.blockchain.length
    const previousHash = this.getLastBlock().hash

    let data = this.data
    let timestamp = new Date().getTime()
    let nonce = 0
    let hash = this.calculateHash(nextIndex, previousHash, timestamp, data, nonce)
    while (hash.slice(0, this.difficulty) !== '0'.repeat(this.difficulty)) {
      nonce = nonce + 1
      timestamp = new Date().getTime()
      hash = this.calculateHash(nextIndex, previousHash, timestamp, data, nonce)
    }
    return {
      index: nextIndex,
      previousHash,
      timestamp,
      nonce,
      hash,
      data: this.data

    }
  }

Nonce迭代到直到Hash有效。在我们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。随着难度的增加,可能的有效Hash数量就会减少。伴随着有效Hash的减少,我们需要更强的算力来查找有效Hash。挖矿是写入数据,是昂贵的操作,需要设置一定的难度,Nonce则是难度系数的体现。

  1. 为什么这么重要?
    这些机制非常重要,它们使区块链不可变。如果我们有这么一个区块链“A->B->C”,而且有一个人想要改变区块A上的数据。那么会发生什么呢?
    • 区块A上的数据改变了。
    • 区块A的hash改变了,因为数据被用来计算hash。
    • 区块A失效了,因为它的hash不再有4个前导0。
    • 区块B的hash改变了,因为区块A的hash被用来计算区块B的hash。
    • 区块B失效了,因为它的hash不再有4个前导0。
    • 区块B的hash改变了,因为区块C的hash被用来计算区块B的hash。
    • 区块C失效了,因为它的hash不再有4个前导0。

改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。

区块链思维导图

总结一下用 Node.js 开发区块链的思路


Node.js 开发区块链思维导图

智能合约开发DAPP

目前区块链更广泛的应用是它的二代技术,强类型语言solidity开发智能合约,truffle框架自动化部署编译合约代码,web3引入合约到前端代码中,再结合前端技术展示页面,根据合约制定的规则响应用户的操作,就可以做去中西化的应用DAPP,比如众筹、宠物领养等等。

众筹.png 宠物领养.png
DAPP中,用户写入数据(比如添加众筹课程、领养宠物等)是需要支付比特币的,这时就需要用到 chrome 插件 metamask 比特币钱包,具体如何安装插件以及开发DAPP,truffle官网中有详细demo教程,就不一一赘述了: DAPP宠物领养开发教程。以下是开发 DAPP 的思维导图:
DAPP 开发思维导图

总结

“志存高远,脚踏实地。是前端,但不止于前端”,学无止境,大伙共勉。文章到此结束,由于水平和经验有限,如有纰漏或建议,欢迎留言。如果觉得不错,欢迎关注海致星图,谢谢您的阅读。


海致星图公众号

参考文章:
1. 写给前端的区块链开发入门指南
2. 前端技术和区块链技术的结合点在哪里

上一篇下一篇

猜你喜欢

热点阅读