原文: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♥︎
。
區塊鏈檢視鏈上最新的區塊來獲取index
和previous hash
。在這個案例下創世塊是最新的區塊。
- Index:0+1=1
- Previous Hash:0000018035a828da0…
- Timestamp:區塊被新增的時間
- Data:freeCodeCamp❤
- Hash:???
- Nonce:???
Hash是如何計算的?
雜湊值是唯一標識資料的固定長度的數值。
Hash是通過將Index
、Previous Hash
、Timestamp
、Data
和Nonce
作為輸入值來計算的。
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上的資料。那麼會發生什麼呢?
- 區塊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。
改變一個區塊的唯一方法就是將這個區塊重新挖一遍,接下來是所有的區塊。由於總是有新的區塊被新增,因此改變區塊幾乎是一件不可能的事。
我希望這個教程能夠對您有所幫助!
如果您想要檢視網頁版的演示,請出門右轉blockchaindemo.io