【譯】區塊鏈是如何工做的——用JavaScript演示

原文: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♥︎

區塊鏈查看鏈上最新的區塊來獲取indexprevious hash。在這個案例下創世塊是最新的區塊。

  • Index:0+1=1

  • Previous Hash:0000018035a828da0…

  • Timestamp:區塊被添加的時間

  • Data:freeCodeCamp❤

  • Hash:???

  • Nonce:???

Hash是如何計算的?

哈希值是惟一標識數據的固定長度的數值。

Hash是經過將IndexPrevious HashTimestampDataNonce做爲輸入值來計算的。

CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)

SHA256算法將會依據這些輸入計算出一個惟一Hash值。一樣的輸入老是會返回一樣的結果。

你是否注意到區塊Hash中的四個前導0?

四個前導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是什麼?

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上的數據。那麼會發生什麼呢?

  1. 區塊A上的數據改變了。

  2. 區塊A的hash改變了,由於數據被用來計算hash。

  3. 區塊A失效了,由於它的hash再也不有4個前導0。

  4. 區塊B的hash改變了,由於區塊A的hash被用來計算區塊B的hash。

  5. 區塊B失效了,由於它的hash再也不有4個前導0。

  6. 區塊B的hash改變了,由於區塊C的hash被用來計算區塊B的hash。

  7. 區塊C失效了,由於它的hash再也不有4個前導0。

改變一個區塊的惟一方法就是將這個區塊從新挖一遍,接下來是全部的區塊。因爲老是有新的區塊被添加,所以改變區塊幾乎是一件不可能的事。

我但願這個教程可以對您有所幫助!

若是您想要查看網頁版的演示,請出門右轉http://blockchaindemo.io

相關文章
相關標籤/搜索