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

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

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

一個用于維護不斷增長的記錄列表的分布式數據庫,我們稱之為區塊鏈。

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

為了說明區塊鏈,我們將會使用一個名為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。

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

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

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容