根据维基百科的描述, 区块链是:
一个分布式数据库, 用于维护不断增长的记录列表, 这个列表称作块
听起来挺棒的, 但它是如何运作的?
为了演示一个区块链, 我们将使用一个名为Blockchain CLI的开源命令行界面.
我在这里也构建了一个基于浏览器的版本.
如果你还没有准备好, 请先安装Node.js.
然后在终端中运行以下命令:
npm install blockchain - cli - g
blockchain
你应该可以看到👋 Welcome to Blockchain CLI以
及!blockchain →提
示你命令行准备好接收命令了.
要查看你当前的区块链, 请输入blockchain
或bc
至命令提示符. 你应该会看到一个区块如下图所示.
每个区块链都会以🏆 Genesis Block开
始. 正如你稍后会看到的, 区块链上的每个区块都依赖于前一个区块. 所以, 我们需要起始块来挖掘我们的第一个区块.
让我们来挖掘我们的第一个区块. 命令提示符中键入 mine freeCodeCamp♥︎
区块链会查看区块链上最新区块的索引和它的前一个哈希值. 在现在的情况下, 起始块是最新的块.
哈希值是唯一标识数据的固定长度的数值.
哈希值是由索引,先前区块的散列值,时间戳,数据块和随机数作为输入数据计算所得的.
CryptoJS.SHA256 ( index + previousHash + timestamp + data + nonce )
SHA256算法将根据给出的输入数据计算出一个唯一的哈希值,相同的输入将始终返回相同的哈希值.
四个前导0是一个有效散列值的最低要求. 前导0所需的数量被称为难度.
function isValidHashDifficulty (hash, difficulty) {
for(var i = 0, b = hash.length; i < b; i++ {
if (hash[i] !== '0') {
break;
}
}
return i >= difficulty;
}
这就是我们熟知的工作量证明(Proof-of-Work)系统.
随机数是一个用于查找有效散列的数字.
let nonce = 0;
let hash;
let input;
while(!isValidHashDifficulty(hash)) {
nonce = nonce + 1;
input = index + previousHash + timestamp + data + nonce;
hash = CryptoJS.SHA256(input)
}
随机数会持续迭代直到散列值有效. 在我们的例子中, 一个有效的散列值至少有四个前导0. 寻找与有效散列值相对应的随机数的过程就是挖矿.
随着难度的增加, 可能的有效散列值数量会减少. 使用较少可能的有效散列, 意味着需要更多的处理能力才能找到有效的散列值.
这很重要,因为它使区块链不可变.
如果我们有以下区块链A→B→C, 当有人想要更改区块A上的数据, 会发生以下情况:
让区块变异的唯一方法是再次挖出该块, 然后再挖掘所有块. 因为新的区块总是被添加, 因此几乎不可能改变区块链.
希望本教程对你有用.
如果你想查看一个该演示的网页版本, 请移步http://blockchaindemo.io