原文:How does blockchain really work? I built an app to show you.
做者:Sean Han
译者:JeLewinenode
根据维基百科,区块链是:算法
一个用于维护不断增加的记录列表的分布式数据库,咱们称之为区块链。数据库
这听起来很棒,那它是如何工做的呢?npm
为了说明区块链,咱们将会使用一个名为Blockchain CLI的开源命令行工具。浏览器
我同时也创建了一个基于浏览器的版本app
在此以前请先安装Node.js分布式
而后在你的命令行中运行如下指令:工具
npm install blockchain-cli -g blockchain
你应该会看到? Welcome to Blockchain CLI!
和一个blockchain →
提示。这说明已经准备好了。post
想要查看当前的区块链,你须要在命令提示行下输入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是经过将Index
、Previous Hash
、Timestamp
、Data
和Nonce
做为输入值来计算的。
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
SHA256算法将会依据这些输入计算出一个惟一Hash值。一样的输入老是会返回一样的结果。
四个前导0是一个有效Hash的最低要求。所需前导0的数量被称之为难度
function isValidHashDifficulty(hash, difficulty) { for (var i = 0, b = hash.length; i < b; i ++) { if (hash[i] !== '0') { break; } } return i >= difficulty; }
这也被称为工做证实系统
Nonce是用来查找一个有效Hash的次数。
let nonce = 0; let hash; let input; while(!isValidHashDifficulty(hash)) { nonce = nonce + 1; input = index + previousHash + timestamp + data + nonce; hash = CryptoJS.SHA256(input) }
Nonce迭代到直到Hash有效。在咱们的案例中,一个有效的Hash至少要拥有4个前置0。查找与有效Hash对应的Nonce的过程就是挖矿。
随着难度的增长,可能的有效Hash数量就会减小。伴随着有效Hash的减小,咱们须要更强的算力来查找有效Hash。
这些机制很是重要,它们使区块链不可变。
若是咱们有这么一个区块链“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。
改变一个区块的惟一方法就是将这个区块从新挖一遍,接下来是全部的区块。因为老是有新的区块被添加,所以改变区块几乎是一件不可能的事。
我但愿这个教程可以对您有所帮助!
若是您想要查看网页版的演示,请出门右转http://blockchaindemo.io