前言
区块链作为近几年十分热门的互联网技术,作为一个合格的程序猿应当不忘初心,保持对技术的热情去了解去学习。并且 Node.js 可以用来开发区块链,solidity开发智能合约,其也是类JavaScript 的语言,因此区块链还是十分适合前端工程师了解学习的。
一、区块链是什么
区块链(block chain)字面意思是包含信息的区块链接一起组成的信息链条, 本质是分布式、不可篡改、信息透明化的、昂贵的、缓慢的数据库。
其发展分为三个部分:
- 区块链 1.0 比特币白皮书
- 区块链 2.0 以太坊 (智能合约)
- 区块链 3.0 超级账本fabric 、联盟链
有以下特性:
- 分布式数据库
- 缓慢的,更新区块链数据需要时间(因此不能做实时性应用)
- 不可篡改
- 去中心化 透明
- 自带价值传递,即不需要通过银行、支付宝等第三方媒介进行交易
1、区块链黑话科普
- 本质就是分布式数据库,数据不可篡改(或者说篡改难度非常大,改了一条链上一个区块的内容就必须同时更改这条链上其他所有区块的内容)
- 比特币造就了区块链,但是不是等于的关系
2、村庄小例子,理解记账、挖矿、共识等机制
- 村庄 1.0 采用中心记账,有专门的账房先生,记账转账等都由账房先生处理,即本中心式,效率高;缺点是如果账房生病,则系统崩溃,而且账房先生可以随意篡改数据,比如之前你转账给老王100块,他可以改为0,你也没办法为自己证明确实已经转账了。
- 村庄 2.0 中本聪提出了点对点记账的方式,即人人都能记账,每人有一个账本,账本的每一页记录着交易信息,账本哈希值(用来唯一标示账本处理信息),时间,以及上一页的哈希。村民的每一次转账都得用自己家的大喇叭通知全村庄(即p2p广播)。 特点: 有人生病或者出去旅游别人找到不到他没关系,找村庄里任何一个人同步一下账本即可;但是记账比较麻烦,因此设置了手续费,而且为了鼓励记账,产生了挖矿以及矿工奖励的概念;挖矿就是用算数学题的方式(只能暴力破解),通过挖矿所用的时间等标识工作量
3、数字货币
- 有EOS、USDT(与美元1:1兑换,由bitfinex交易所发行,是价格最稳定的数字货币,是数字货币世界的基础货币之一,一般先用钱买USDT,再用它去购买比特币或者以太坊)、LTC、DOGE、Ripple等等
- 数字货币衍生品有ICO(众筹)、交易所(场外、撮合)以及钱包
- 价值:供需决定价格,由于代码量稳定因此数量稳定,而且支付信息采用匿名方式(一个字符串)但是谁都可以看到交易信息,透明中立,而且支付方便
二、区块链前景展望
基于区块链的特性的各种脑洞大开的应用
- 数字货币 支付
- 共享经济 信用传递
- 食品安全,即共享不可篡改的检查信息等(阿里正在进行这方面的研究)
- 数字版权:很多盗版视频其实很难认证他时盗版的,得走法律流程,得打官司,而如果在区块链是发布视频,这谁先发布的一下子就可以查出来,而且本身是不可篡改的因此可以证明版权
- 众筹:防止捐钱后钱进入了黑盒,被贪污了;一切交易都是透明的
- 合约:一起开公司不用走法律流程、签合同,直接在区块上写明合约,由于代码不可篡改,符合条件便会执行,因此十分可信可靠
- 游戏、音乐视频
- 可编程社会:定制化
- 学术、选举
1、区块链现在最广泛的应用
- 比特币:第一个应用,诞生于密码朋克,总量2100W,运行了8年了
- 以太坊:下一代区块链,众多高级功能,如智能合约,DAPP(如养猫等游戏。去中心化的分布式应用,数据不可篡改)
- EOS、USDT、LTC、DOGE、Ripple等数字货币
- IPFS (星际文件系统),相当于无限量的百度网盘,而且永远不会消失,可通过哈希值迅速找到文件
- 超级账本fabric,区块链3.0 的代表项目,主要用于交易身份认证
- NameCoin 键值数据库,IPFS实际上是它的一个文件系统
2、区块链场景
具体应用领域
- 公有链:比如以太坊、比特币,信息透明化、不可篡改、不受第三方控制
- 私有链:比如基于公有链建立一条公司内部的区块链
- 联盟链:区块链3.0十分火爆的一个概念,即信息只对特定的一个团体开放,比如想交接学习资料,联系所有费教育公司组成一个教育链
3、学习区块链的辅助工具
迷你区块链 iblockchain,这是github上的一个开源项目,可以帮助理解区块链,有以下主要功能:
4、区块长什么样
想要查看当前的区块链,你需要在命令提示行下输入blockchain或者bc。你应该会看到像下面的图片一样的一个区块。
- 区块链上的一个区块:
- Index:是哪一个区块(创世块的索引是0)?
- Hash:区块是否有效?
- Previous Hash:前一个区块是否有效?
- Timestamp:什么时候添加的区块?
- Data:什么信息存储在区块上?
- Nonce:在找到有效区块之前,我们进行了多少次迭代?
- 创世区块: 每一个区块链都是从 创世区块(Genesis Block)开始的。正如你们将要在后面看到的,区块链上的每一个区块都依赖于前一个区块。所以,需要创世块来挖出我们的第一个区块。
- 当一个新的区块被开采时会发生什么? 让我们挖出我们的第一个区块。在命令行中输入mine freeCodeCamp。 区块链查看链上最新的区块来获取index和previous hash。在这个案例下创世块是最新的区块。
- Index:0 1=1
- Previous Hash:0000018035a828da0…
- Timestamp:区块被添加的时间
- Data:freeCodeCamp
- Hash:???
- Nonce:???
- 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
}
}
- 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则是难度系数的体现。 6. 为什么这么重要? 这些机制非常重要,它们使区块链不可变。如果我们有这么一个区块链“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。
改变一个区块的唯一方法就是将这个区块重新挖一遍,接下来是所有的区块。由于总是有新的区块被添加,因此改变区块几乎是一件不可能的事。
5、区块链思维导图
总结一下用 Node.js 开发区块链的思路
6、智能合约开发DAPP
目前区块链更广泛的应用是它的二代技术,强类型语言solidity开发智能合约,truffle框架自动化部署编译合约代码,web3引入合约到前端代码中,再结合前端技术展示页面,根据合约制定的规则响应用户的操作,就可以做去中西化的应用DAPP,比如众筹、宠物领养等等。
DAPP中,用户写入数据(比如添加众筹课程、领养宠物等)是需要支付比特币的,这时就需要用到 chrome 插件 metamask 比特币钱包,具体如何安装插件以及开发DAPP,truffle官网中有详细demo教程,就不一一赘述了: DAPP宠物领养开发教程。以下是开发 DAPP 的思维导图:
本人的领养宠物项目:zyqq/pet-shop,用react web3连接智能合约开发了领养宠物的DAPP,代码展示了前端如何链接区块链
三、总结
“志存高远,脚踏实地。是前端,但不止于前端”,学无止境,大伙共勉。
参考文章: 1. 写给前端的区块链开发入门指南 2. 前端技术和区块链技术的结合点在哪里