(點擊上方公眾號,可快速關注)
編譯:伯樂在線 - 孫騰浩
如有好文章投稿,請點擊 → 這裡了解詳情
(A minimal blockchain command-line interface.)
維基百科上對區塊鏈的描述:
維護不斷增長的記錄(稱作區塊)的分布式資料庫。
聽上去很簡單,但到底是怎麼回事呢?
我們用一款開源命令行界面 Blockchain CLI 來詳細說明區塊鏈。我也做了一個瀏覽器可以訪問的在線版。
首先請確保安裝 Node.js
然後在終端裡運行下面命令:
npm install blockchain-cli -g
blockchain
你將看到 👋 Welcome to Blockchain CLI! 和 blockchain → 提示已準備好接受命令。
區塊是什麼樣子的?你可以在命令行中輸入 blockchain 或 bc 來查看你當前的區塊鏈。你將看到下圖類似的區塊。
每個區塊鏈都會以一個 🏆 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
看完本文有收穫?請轉發分享給更多人
關注「程式設計師的那些事」,提高編程技能