區塊鏈原理最清晰最直觀的解釋

 

維基百科上對區塊鏈的描述:
 
維護不斷增長的記錄(稱作區塊)的分佈式數據庫。
 
聽上去很簡單,但到底是怎麼回事呢?
 
我們用一款開源命令行界面Blockchain CLI 來詳細說明區塊鏈。我也做了一個瀏覽器可以訪問的在線版。
 

 
安裝命令行界面
 
首先請確保安裝Node.js
 
然後在終端裡運行下面命令:
 
npm install blockchain-cli -g
blockchain
 
你將看到👋 Welcome to Blockchain CLI! 和blockchain → 提示已準備好接受命令。
 
區塊是什麼樣子的?
你可以在命令行中輸入blockchain 或bc 來查看你當前的區塊鏈。你將看到下圖類似的區塊。
 

 
索引(區塊):這是哪個區塊?(初始區塊索引為0)
哈希:區塊有效嗎?
前個哈希:之前一個區塊有效嗎?
時間戳:區塊什麼時候添加的?
數據:區塊中存的什麼信息?
隨機數(Nonce):我們重複了多少次才找到有效的區塊?
 
初始區塊
每個區塊鏈都會以一個🏆 Genesis Block 作為開始。你接下來將會看到每個區塊都關聯前一個區塊。所以我們開採第一個區塊前,要有初始區塊。
 
當一個新的區塊被開采出來會發生什麼?
 

 
讓我們來開採我們的第一個區塊,在提示框輸入mine freeCodeCamp♥ 命令。區塊鏈根據最後一個區塊生成當前索引和前個哈希。我們現在的區塊鏈最後一個區塊就是初始區塊。
 
索引:o+1 = 1
前個哈希:0000018035a828da0…
時間戳:區塊什麼時候添加的?
數據:freeCodeCamp❤
哈希:??
隨機數(Nonce):??
 
哈希值如何計算?
哈希值是固定長度的數值,用來標識數據。
 
哈希通過將索引、前個哈希、時間戳、數據、隨機數作為輸入後計算得出。
 
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
 
SHA256 算法通過給定的輸入,計算出一個的哈希。相同的輸入總會生成相同的哈希。
 
你注意到哈希開頭的四個0 了嗎?
開頭的四個0 是有效哈希的基本要求。開頭0 的個數被稱為難度值(difficulty)。
 
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 上的數據。會發生下面情況:
 
修改區塊A 上的數據。
區塊A 的哈希變動,因為計算哈希所用的數據變化了。
區塊A 無效,因為它的哈希不是四個0 開頭。
區塊B 的哈希變動,因為計算區塊B 的哈希所用到的區塊A 的哈希值變化了。
區塊B 無效,因為它的哈希不是四個0 開頭。
區塊C 的哈希變動,因為計算區塊C 的哈希所用到的區塊B 的哈希值變化了。
區塊C 無效,因為它的哈希不是四個0 開頭。
 
修改一個區塊的方式就是重新開採這個區塊以及它之後的所有區塊。因為新的區塊不斷增加,基本不可能修改區塊鏈。
 
我希望本文對你有幫助。
 

 

如果你想checkout 在線版本的例子,移步http://blockchaindemo.io

 

轉貼自: 煉數成金


留下你的回應

以訪客張貼回應

0

在此對話中的人們

每月文章