原文: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♥︎
。
區塊鏈查看鏈上最新的區塊來獲取index
和previous hash
。在這個案例下創世塊是最新的區塊。
Index:0+1=1
Previous Hash:0000018035a828da0…
Timestamp:區塊被添加的時間
Data:freeCodeCamp❤
Hash:???
Nonce:???
哈希值是惟一標識數據的固定長度的數值。
Hash是經過將Index
、Previous Hash
、Timestamp
、Data
和Nonce
做爲輸入值來計算的。
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
SHA256算法將會依據這些輸入計算出一個惟一Hash值。一樣的輸入老是會返回一樣的結果。
四個前導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是用來查找一個有效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上的數據。那麼會發生什麼呢?
區塊A上的數據改變了。
區塊A的hash改變了,由於數據被用來計算hash。
區塊A失效了,由於它的hash再也不有4個前導0。
區塊B的hash改變了,由於區塊A的hash被用來計算區塊B的hash。
區塊B失效了,由於它的hash再也不有4個前導0。
區塊B的hash改變了,由於區塊C的hash被用來計算區塊B的hash。
區塊C失效了,由於它的hash再也不有4個前導0。
改變一個區塊的惟一方法就是將這個區塊從新挖一遍,接下來是全部的區塊。因爲老是有新的區塊被添加,所以改變區塊幾乎是一件不可能的事。
我但願這個教程可以對您有所幫助!
若是您想要查看網頁版的演示,請出門右轉http://blockchaindemo.io