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

逆圖發表於2017-09-27

原文:How does blockchain really work? I built an app to show you.
作者:Sean Han

根據維基百科,區塊鏈是:

一個用於維護不斷增長的記錄列表的分散式資料庫,我們稱之為區塊鏈。

這聽起來很棒,那它是如何工作的呢?

為了說明區塊鏈,我們將會使用一個名為Blockchain CLI的開源命令列工具。

我同時也建立了一個基於瀏覽器的版本

安裝命令列工具

在此之前請先安裝Node.js

然後在你的命令列中執行以下指令:

npm install blockchain-cli -g
blockchain複製程式碼

你應該會看到? Welcome to Blockchain CLI!和一個blockchain →提示。這說明已經準備好了。

區塊長什麼樣?

想要檢視當前的區塊鏈,你需要在命令提示行下輸入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。

改變一個區塊的唯一方法就是將這個區塊重新挖一遍,接下來是所有的區塊。由於總是有新的區塊被新增,因此改變區塊幾乎是一件不可能的事。

我希望這個教程能夠對您有所幫助!

如果您想要檢視網頁版的演示,請出門右轉blockchaindemo.io

相關文章