原文:How does blockchain really work? I built an app to show you.
作者:Sean Han
譯者:JeLewine
根據(jù)維基百科公给,區(qū)塊鏈?zhǔn)牵?/p>
一個(gè)用于維護(hù)不斷增長(zhǎng)的記錄列表的分布式數(shù)據(jù)庫(kù)誊薄,我們稱(chēng)之為區(qū)塊鏈。
這聽(tīng)起來(lái)很棒唧垦,那它是如何工作的呢?
為了說(shuō)明區(qū)塊鏈,我們將會(huì)使用一個(gè)名為Blockchain CLI的開(kāi)源命令行工具。
我同時(shí)也建立了一個(gè)基于瀏覽器的版本
安裝命令行工具
在此之前請(qǐng)先安裝Node.js
然后在你的命令行中運(yùn)行以下指令:
npm install blockchain-cli -g
blockchain
你應(yīng)該會(huì)看到?? Welcome to Blockchain CLI!
和一個(gè)blockchain →
提示攀圈。這說(shuō)明已經(jīng)準(zhǔn)備好了。
區(qū)塊長(zhǎng)什么樣峦甩?
想要查看當(dāng)前的區(qū)塊鏈,你需要在命令提示行下輸入blockchain
或者bc
现喳。你應(yīng)該會(huì)看到像下面的圖片一樣的一個(gè)區(qū)塊凯傲。
- Index:是哪一個(gè)區(qū)塊(創(chuàng)世塊的索引是0)?
- Hash:塊是否有效嗦篱?
- Previous Hash:前一個(gè)區(qū)塊是否有效冰单?
- Timestamp:什么時(shí)候添加的區(qū)塊?
- Data:什么信息存儲(chǔ)在區(qū)塊上灸促?
- Nonce:在找到有效區(qū)塊之前诫欠,我們進(jìn)行了多少次迭代涵卵?
創(chuàng)世塊
每一個(gè)區(qū)塊鏈都是從?? Genesis Block
開(kāi)始的。正如你們將要在后面看到的荒叼,區(qū)塊鏈上的每一個(gè)區(qū)塊都依賴(lài)于前一個(gè)區(qū)塊轿偎。所以,需要?jiǎng)?chuàng)世塊來(lái)挖出我們的第一個(gè)區(qū)塊被廓。
當(dāng)一個(gè)新的區(qū)塊被開(kāi)采時(shí)會(huì)發(fā)生什么坏晦?
讓我們挖出我們的第一個(gè)區(qū)塊。在命令行中輸入
mine freeCodeCamp??
嫁乘。
區(qū)塊鏈查看鏈上最新的區(qū)塊來(lái)獲取index
和previous hash
昆婿。在這個(gè)案例下創(chuàng)世塊是最新的區(qū)塊。
- Index:0+1=1
- Previous Hash:0000018035a828da0…
- Timestamp:區(qū)塊被添加的時(shí)間
- Data:freeCodeCamp?
- Hash:蜓斧?仓蛆??
- Nonce:挎春?看疙??
Hash是如何計(jì)算的搂蜓?
哈希值是唯一標(biāo)識(shí)數(shù)據(jù)的固定長(zhǎng)度的數(shù)值狼荞。
Hash是通過(guò)將Index
、Previous Hash
帮碰、Timestamp
相味、Data
和Nonce
作為輸入值來(lái)計(jì)算的。
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
SHA256算法將會(huì)依據(jù)這些輸入計(jì)算出一個(gè)唯一Hash值殉挽。同樣的輸入總是會(huì)返回同樣的結(jié)果丰涉。
你是否注意到區(qū)塊Hash中的四個(gè)前導(dǎo)0?
四個(gè)前導(dǎo)0是一個(gè)有效Hash的最低要求斯碌。所需前導(dǎo)0的數(shù)量被稱(chēng)之為難度
function isValidHashDifficulty(hash, difficulty) {
for (var i = 0, b = hash.length; i < b; i ++) {
if (hash[i] !== '0') {
break;
}
}
return i >= difficulty;
}
這也被稱(chēng)為工作證明系統(tǒng)
Nonce是什么一死?
Nonce是用來(lái)查找一個(gè)有效Hash的次數(shù)。
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有效傻唾。在我們的案例中投慈,一個(gè)有效的Hash至少要擁有4個(gè)前置0。查找與有效Hash對(duì)應(yīng)的Nonce的過(guò)程就是挖礦冠骄。
隨著難度的增加伪煤,可能的有效Hash數(shù)量就會(huì)減少。伴隨著有效Hash的減少凛辣,我們需要更強(qiáng)的算力來(lái)查找有效Hash抱既。
為什么這么重要?
這些機(jī)制非常重要扁誓,它們使區(qū)塊鏈不可變防泵。
如果我們有這么一個(gè)區(qū)塊鏈“A->B->C”蚀之,而且有一個(gè)人想要改變區(qū)塊A上的數(shù)據(jù)。那么會(huì)發(fā)生什么呢捷泞?
- 區(qū)塊A上的數(shù)據(jù)改變了足删。
- 區(qū)塊A的hash改變了,因?yàn)閿?shù)據(jù)被用來(lái)計(jì)算hash肚邢。
- 區(qū)塊A失效了壹堰,因?yàn)樗膆ash不再有4個(gè)前導(dǎo)0。
- 區(qū)塊B的hash改變了骡湖,因?yàn)閰^(qū)塊A的hash被用來(lái)計(jì)算區(qū)塊B的hash贱纠。
- 區(qū)塊B失效了,因?yàn)樗膆ash不再有4個(gè)前導(dǎo)0响蕴。
- 區(qū)塊B的hash改變了谆焊,因?yàn)閰^(qū)塊C的hash被用來(lái)計(jì)算區(qū)塊B的hash。
- 區(qū)塊C失效了浦夷,因?yàn)樗膆ash不再有4個(gè)前導(dǎo)0辖试。
改變一個(gè)區(qū)塊的唯一方法就是將這個(gè)區(qū)塊重新挖一遍,接下來(lái)是所有的區(qū)塊劈狐。由于總是有新的區(qū)塊被添加罐孝,因此改變區(qū)塊幾乎是一件不可能的事。
我希望這個(gè)教程能夠?qū)δ兴鶐椭?/p>
如果您想要查看網(wǎng)頁(yè)版的演示肥缔,請(qǐng)出門(mén)右轉(zhuǎn)http://blockchaindemo.io