閱讀286 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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的區塊數據為準。

參考文檔

最後更新:2017-09-14 09:33:07

  上一篇:go  麵試題:整數反序
  下一篇:go  戊己土