3分鍾通過一個App的演示深入理解區塊鏈運行原理
作者:黎躍春,資深講師,全棧工程師;專注於「區塊鏈+內容」產品的開發以及區塊鏈技術培訓。
公眾號:區塊鏈部落
QQ群:348924182
微信:liyc1215
區塊鏈技術部落閣:https://liyuechun.org
安裝命令行工具
- 打開終端,輸入
npm install blockchain-cli -g
Last login: Wed Sep 13 15:48:00 on ttys000
liyuechun:~ yuechunli$ npm install blockchain-cli -g
/usr/local/bin/blockchain -> /usr/local/lib/node_modules/blockchain-cli/main.js
> wrtc@0.0.62 install /usr/local/lib/node_modules/blockchain-cli/node_modules/wrtc
> node-pre-gyp install --fallback-to-build
[wrtc] Success: "/usr/local/lib/node_modules/blockchain-cli/node_modules/wrtc/build/wrtc/v0.0.62/Release/node-v57-darwin-x64/wrtc.node" is installed via remote
+ blockchain-cli@1.0.5
added 263 packages in 89.506s
liyuechun:~ yuechunli$
- 終端輸入
blockchain
liyuechun:~ yuechunli$ blockchain
Welcome to Blockchain CLI!
Commands:
help [command...] Provides help for a given command.
exit Exits application.
blockchain See the current state of the blockchain.
mine <data> Mine a new block. Eg: mine hello!
open <port> Open port to accept incoming connections. Eg:
open 2727
connect <host> <port> Connect to a new peer. Eg: connect localhost
2727
peers Get the list of connected peers.
discover Discover new peers from your connected peers.
blockchain →
區塊(block)長什麼樣子?
在blockchian ->
後麵輸入blockchain
或者bc
查看創始區塊結構。
-
Index (Block #):
第幾個區塊? (創世區塊鏈的索引為0) -
Hash:
當前區塊的hash值 -
Previous Hash:
上一個區塊的hash值 -
Timestamp:
當前區塊創建時的時間戳 -
Data:
存儲在當前區塊上的交易信息 -
Nonce:
在找到有效區塊之前,我們經曆的迭代次數
創世區塊(Genesis Block)
每個區塊鏈都是由一個創始區塊「 Genesis Block」
開始。後麵你所看到的區塊都依賴於上一個區塊。因此,創始區塊是我們挖取第一個區塊的基礎。
當一個區塊挖礦時都發生了什麼?
我們在blockchain →
中輸入mine liyc1215
,「liyc1215
是春哥微信號,添加我微信,拉你進區塊鏈技術交流群」挖取我們的第一個區塊。
-
Index:
o+1 = 1 -
Previous Hash:
0000018035a828da0… -
Timestamp:
這個區塊創建的時間 -
Data:
liyc1215 -
Hash:
?? -
Nonce:
??
Hash是怎麼計算的?
Hash
值是一個十六進製
固定長度為64位
的唯一的標識。
hash
值是由index
, previous block hash
, timestamp
, block data
, 和 nonce
作為輸入數據計算而得。
CryptoJS.SHA256(index + previousHash + timestamp + data + nonce)
The SHA256 algorithm will calculate a unique hash, given those inputs. The same inputs will always return the same hash.
SHA256
算法將根據給出的輸入數據計算出一個唯一的hash值,隻要輸入值不變,永遠返回相同的結果。
輸入數據為liyc1215
時,它的hash值永遠為dca0762d726738ebb8e6b7b43a4ba4186588a1b711f94ba9c694bffda8fcccf9
你是否注意到塊哈希中的四個前導0?
四個前導0是有效散列的最低要求。 所需的前導0的數量稱為難度
。
下麵的方法驗證hash難度是否有效。
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 system。
什麼是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
。找到nonce
值以滿足合適條件的hash
值的過程就叫做挖礦。
隨著難度的增加,可能的有效散列數減少。 使用較少可能的有效散列,需要更多的處理能力才能找到有效的散列。
Hash為什麼如此重要?
hash
散列很重要是因為它可以使區塊鏈不能被改變。
如果我們有三個區塊鏈1 -> 2 -> 3 -> 4 -> 5
,當某個人想要試圖修改區塊A時,下麵幾點將是會發生的幾種情況。
- 區塊3上的區塊鏈被修改。
- 區塊3上的hash值將發生改變,因為hash值是通過數據計算而得。
- 區塊3變得無效,因為它的hash值不再具備4個前導0的條件。
- 區塊4的hash值將發生改變,因為區塊3的hash值用來參與計算區塊4的hash值。
- 區塊4變得無效,因為它的hash值不再具備4個前導0的條件。
- 區塊5的hash值將發生改變,因為區塊4的hash值用來參與計算區塊5的hash值。
- 區塊5變得無效,因為它的hash值不再具備4個前導0的條件。
如果想要無效的區塊3、4、5
變得有效,必須從區塊3開始再一次重新依次挖礦,當你的區塊鏈足夠長,節點足夠多時,就算你將這條鏈上的區塊鏈改變並且重新挖礦成功,但是因為超過50%的節點的數據和你的節點的數據不一致,你這個被改變的節點的數據也依然無效。
在這個demo的演示中,一共有三個節點,我修改了節點2的區塊鏈5並且重新挖礦取得合法的hash值,但是因為節點A
和節點C
中區塊5的hash值為0000e4b9052fd8aae92a8afda42e2ea0f17972ea67cead67352e74dd6f7d217c
,而節點B
中的hash值為0000184634edadb8fc7f4bdee87aa9d7d2a46b0c26db221998e35c1f57c0b42c
,少數服從多數,所以以節點A和C的區塊數據為準。
參考文檔
- How does blockchain really work? I built an app to show you
- https://anders.com/blockchain/distributed.html
- https://blockchaindemo.io
最後更新:2017-09-14 09:33:07