(A minimal blockchain command-line interface.)
維基百科上對區塊鏈的描述:
維護不斷增長的記錄(稱作區塊)的分散式資料庫。
聽上去很簡單,但到底是怎麼回事呢?
我們用一款開源命令列介面 Blockchain CLI 來詳細說明區塊鏈。我也做了一個瀏覽器可以訪問的線上版。
安裝命令列介面
首先請確保安裝 Node.js
然後在終端裡執行下面命令:
1 2 |
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):??
雜湊值如何計算?
雜湊值是固定長度的數值,用來標識唯一資料。
雜湊通過將索引、前個雜湊、時間戳、資料、隨機數作為輸入後計算得出。
1 |
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce) |
SHA256 演算法通過給定的輸入,計算出一個唯一的雜湊。相同的輸入總會生成相同的雜湊。
你注意到雜湊開頭的四個 0 了嗎?
開頭的四個 0 是有效雜湊的基本要求。開頭 0 的個數被稱為難度值(difficulty)。
1 2 3 4 5 6 7 8 |
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)。
什麼是隨機數?
隨機數是用來尋找有效雜湊的一個數字。
1 2 3 4 5 6 7 8 |
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
打賞支援我翻譯更多好文章,謝謝!
打賞譯者
打賞支援我翻譯更多好文章,謝謝!
任選一種支付方式