how-does-blockchain-really-work

区块链实际上是如何工作的?

在维基百科上,区块链是这样定义的:

一种分布式的数据库,用于维护一个连续的、不断增长的记录(称为块)列表。

看上去很好很简单,但是它是如何工作的呢?

为了说明区块链,我们将要用到一个名为Blockchain CLI的开源的命令行交互界面。

另外我还创建了一个基于浏览器的版本

安装命令行界面版本

如果你还没有安装Node.js

在终端中执行下面的命令:

npm install blockchain-cli -g
blockchain

你应该会看到? Welcome to Blockchain CLI!blockchain →提示,表明准备好了接受命令。

块看起来是什么样子?

要查看你当前的区块,在命令提示符中输入blockchain或者bc,你会看到如下图所示的区块。

  • Index(Block #):这是哪一个块?(创世区块的索引为0)
  • Hash:这个块是否有效
  • Previous Hash:上一个块是否有效
  • Timestamp:这个块生成的时间
  • Data:这个块中存储的信息
  • Nonce:经历了多少次迭代后找到的有效块

创世区块

所有区块都是从创世区块开始的。接下来你会看到,每一个区块在区块链中都依赖于上一个区块。所以,我们需要创世区块来开采我们的第一个区块。

当一个新的块被开采时发生了什么?

我们来开采第一个区块,在命令提示符中输入mine freeCodeCamp♥︎

在区块链上查看最后的区块索引和上一个区块的hash。在这种情况下,创世区块是最后一个区块。

  • Index: o+1 = 1
  • Previous Hash: 0000018035a828da0…
  • Timestamp: When the block is added
  • Data: freeCodeCamp❤
  • Hash: ??
  • Nonce: ??

如何计算出hash值

hash值是一个唯一标识数据的固定长度的数值。

一个hash值是由index,previous block hash,timestamp,block data和nonce这些输入计算出的。

“`node.js
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)


SHA256算法会计算出一个唯一的hash值,给出上述的输入,相同的输入总是会返回同一个hash值。

### 你注意到了block hash中的四个前导0了吗?

四个前导0是有效散列的最低要求。所需的前导0的数量称为难度。

```node.js
function isValidHashDifficulty(hash, difficulty) {
  for (var i = 0, b = hash.length; i < b; i ++) {
      if (hash[i] !== '0') {
          break;
      }
  }
  return i >= difficulty;
}

同时也被称为工作量证明

什么是nonce

nonce是用来查找有效hash的数字。

“`node.js
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至少有四个前导0,查找与有效hash相对应的nonce的过程被称为mining(挖矿)。

随着难度的增加,存在的有效的hash值得数量减少,这时查找有效的hash值就需要更多的算力。

### 为什么这很重要?

因为这保持了区块链的不可变。

如果我们有下面的区块链A→B→C,现在有人想要修改区块A中的数据。将会发生:

1. 区块A中的数据变化
2. 区块A的hash发生变化,因为在计算A的hash值时用到了A中的数据
3. 区块A变为无效,因为它的hash不再有四个前导0
4. 区块B的hash发生变化,因为在计算B的hash值是用到了A的hash值
5. 区块B变为无效,因为它的hash不再有四个前导0
6. 区块C的hash发生变化,因为在计算C的hash值是用到了B的hash值
7. 区块C变为无效,因为它的hash不再有四个前导0

改变一个区块的唯一方法就是再次挖掘区块,然后是所有区块。由于新的区块总是在被添加,所有改变区块链几乎是不可能的。

希望这个教程对你有帮助。

如果你想查看web版本的demo,请访问[http://blockchaindemo.io](http://blockchaindemo.io/)

原文链接:https://medium.freecodecamp.org/how-does-blockchain-really-work-i-built-an-app-to-show-you-6b70cd4caf7d

发表评论

电子邮件地址不会被公开。 必填项已用*标注