(一)區塊鏈的共識算法:總體介紹 及 分叉 的通俗講解

做者:林冠宏 / 指尖下的幽靈git

掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8github

博客:http://www.cnblogs.com/linguanh/算法

GitHub : https://github.com/af913337456/數據庫

騰訊雲專欄: https://cloud.tencent.com/developer/user/1148436/activities安全


本文不作通常入門的區塊鏈描述講解。着重簡述講解:網絡

  • 區塊鏈的分叉
  • 共識算法

目錄

前言

因爲最近的開發工做是與以太坊公鏈相關的去中心化交易所,項目兩個多月之久,對區塊鏈相關的知識內容瞭解了一些,故擇文以記錄之,但求文字通俗易懂,無紕漏。因自身求學過程當中所遇坑無數,業內良文亦少之又少,深感朦朧之懂之不爽。此外,亦堅信區塊鏈技術將來必能大放光芒,因如今多應用於虛擬貨幣,故人談區塊鏈,心裏首想皆炒幣相關以內容。數據結構

簡單過一下區塊鏈

咱們通常意識形態中的 鏈 是鐵鏈,由鐵鑄成,一環扣一環。形象地,區塊鏈的也能夠這麼理解,只不過它不是由鐵鑄成,而是由擁有必定數據結構的塊鏈接而成,這是一個最簡單的雛形函數

見下圖區塊鏈

通俗講解共識

所謂共識,通俗來講,就是咱們你們對某種事物的理解達成一致的意思。好比說平常的開會討論問題,又好比判斷一個動物是否是貓,咱們肉眼看了後以爲像貓,其知足貓的特徵,那麼咱們認爲它是貓。共識,是一種規則。加密

繼續咱們的會議例子。參與會議的人,經過開會的方式來達到談論解決問題

對比區塊鏈中,參與挖礦的礦工經過某種共識方式(算法)來解決讓本身的帳本跟其餘節點的帳本保持一致。讓帳本保持一致的深刻一層意思就是,讓鏈中區塊信息保持一致。

爲何須要共識,不須要可不能夠?固然不能夠,生活中沒了共識的規則,一切亂套。區塊鏈沒了共識的規則,各個節點各幹各的,失去一致的意義。

這兩個例子的對應的關係以下:

  • 會議的人 = 挖礦的礦工
  • 開會 = 共識方式(算法)
  • 談論解決問題 = 讓本身的帳本跟其餘節點的帳本保持一致

若是你對節點的概念意思不懂,請先理解爲礦工,一個節點內部包含不少角色,礦工是其中之一。

共識算法

目前常見的在區塊鏈中,節點們讓本身的帳本跟其餘節點的帳本保持一致共識方式(算法)有以下幾種:

  • PoW,表明者是比特幣 (BTC)
    • 弊端:
      • 礦池的出現,必定程度上違背了去中心化的初衷,同時也使得51%攻擊成爲可能,影響其安全性。
      • 存在巨大的算力浪費,看看礦池消耗大量的電力資源,隨着難度增長,挖出的不夠付電費
  • PoS,表明者是以太坊 (ETH),從PoW過分到PoS
    • 弊端:
      • 破壞者對網絡的攻擊成本很低,擁有代幣就能競爭
      • 另外擁有代幣數量大的節點得到記帳權的機率會更大,會使得網絡共識受少數富裕帳戶支配,從而失去公正性
  • DPoS,表明者是柚子(EOS)
    • 弊端:
      • 選舉固定數量的見證人做爲記帳候選人有可能不適合於徹底去中心化的場景
      • 在網絡節點不多的場景,選舉的見證人的表明性也不強.
  • PBFT 拜占庭容錯,聯盟鏈中經常使用
    • 弊端:
      • 不適合公有鏈,適合聯盟鏈

下面通俗講解下每種共識算法的概念,注意!是概念,非代碼層面的詳細實現。

PoW

它的全稱是:Proof of Work 工做量證實。字面意思,就是誰作的活越多,誰話事權越大,必定層面上相似現實生活的多勞多得的概念。該例子會穿插生活事例,其餘的幾個講解將再也不累贅。

比特幣爲例子,比特幣挖礦就是經過計算符合某一個比特幣區塊頭哈希散列值爭奪記帳權。這個過程須要經過大量的計算實現,簡單理解就是你進行的計算量大(工做量大),你就有大機率得到記帳權,即礦工的挖出的區塊併入主鏈。

  • 區塊頭,區塊鏈中的區塊的頭部。你有一個飯盒,飯盒第一層,形象爲動物頭部,稱之爲頭部。第一層放着米飯,米飯就是頭部裝載着的東西
  • 哈希散列值,一種經過數學公式計算得出的值
    • 哈希:數學中的散列函數
    • 散列值: 經過哈希函數得出的值
    • 例如加法公式:1 + 2 = 3。那麼哈希公式:hash(1,2) = 結果
  • 區塊頭哈希散列值,飯盒第一層裝着的是飯。那麼這裏的這個值就是區塊頭裝着的東西
  • 記帳權,話事權,誰挖出的區塊是有效的。

因此說。在不少個節點都在挖礦的狀況下,你們都有可能挖出一個區塊,隨之廣播到其餘節點中去,那麼每一個節點中會根據誰先挖出爲準,確認該區塊,併入鏈中。

對比現實生活,數學競賽中,參數者 至關於礦工,一道題目,誰先作出就公佈計算過程和答案,不禁裁判判斷,由參賽者一塊兒驗證,沒問題後,宣佈該題目結束,解題者等相關信息被記錄到冊子/數據庫/網絡。以後繼續下一道題。

回到比特幣挖礦中:

  • 這道難題就是 計算出正確的哈希散列值
    • 計算哈希散列值 隨着難度係數增大,會愈來愈困難
    • 計算須要耗費大量的電力資源,工做量大
  • 一旦計算出了,就告訴其餘節點
  • 節點收到通知後,停下手上的計算工做
  • 節點開始驗證信息
    • 信息有效,當前的塊被挖出,各節點開始從新挖下一個
    • 信息無效,各節點繼續本身的手上的計算工做
  • 成功挖出有效區塊的節點得到獎勵,比特幣獎勵

同時解出問題的狀況怎麼辦?---① 答案見下一章節 http://www.javashuo.com/tag/區塊鏈分叉

區塊鏈分叉

注意私有節點不在討論範圍內,全部節點基於公有節點。分叉的狀況有:

  • 硬分叉
    • 一旦出現,最後的結果是一分爲二
    • 術語的說法:舊節點沒法承認新節點產生的區塊,爲硬分叉
  • 軟分叉
    • 一旦出現,最後的結果是能掰正的
    • 術語的說法:舊節點可以承認新節點產生的區塊,爲軟分叉

如今先回答上一章節留下的問題 --- ①,
① 的狀況是軟分叉的一種,當有兩個或多個節點同時挖出了同區塊號碼的一個區塊,而後它們同時廣播信息出去,假設一個是A,而另外一個是B,那麼距離 A 比較近的節點,還沒等到收到其餘消息就先收到了 A 的信息,並開始確認 A 所挖出的這個區塊的信息,隨後加入A挖出的這個區塊到本身所在的公鏈中去。同理 距離 B 比較近的節點,也會先處理 B 挖出的區塊信息並添加入本身所在的公鏈中。

上面文字對應於下圖。距離 A 最近的是 節點1,距離 B 最近的是 節點5

至此,出現了鏈的分叉。這是一種使用了一樣共識算法,共識規則下致使的分叉,

出現了這種狀況,礦工是比較好自我糾正的。因爲解題能力和礦工的數量成正比,所以兩條鏈的增加速度也是不同的,在一段時間以後,總有一條鏈的長度要超過另外一條。當礦工發現全網有一條更長的鏈時,他就會拋棄他當前的鏈,把新的更長的鏈所有複製回來,在這條鏈的基礎上繼續挖礦。全部礦工都這樣操做,這條鏈就成爲了主鏈,分叉出來的鏈便會被拋棄掉。

硬分叉的出現

若是區塊鏈軟件的共識規則被改變,而且這種規則改變沒法向前兼容,舊節點沒法承認新節點產生的區塊,且舊節點恰恰就是不升級,那麼該分叉將致使鏈一分爲二。

分叉點後的鏈,日後互不影響,節點在站好派別後,也不會再互相廣播區塊信息。新節點舊節點會開始在不一樣的區塊鏈上運行(挖礦交易驗證等)

舉個簡單的例子,若是節點版本1.0 所接收的區塊結構字段是10個,1年後發佈節點2.0版本,2.0 兼容 1.0,可是 1.0 的不能接受 2.0 版本中多出的字段。

硬分叉的過程:

  • 開發者發佈新的節點代碼,新的改變了區塊鏈的共識規則且不被舊的兼容,因而節點程序出現了分叉(software fork)
  • 區塊鏈網絡中部分節點開始運行新的節點代碼,在新規則下產生的交易與區塊將被舊節點拒絕,舊節點開始短暫的斷開與這些發送被本身拒絕的交易與區塊新節點的鏈接,因而整個區塊鏈網絡出現了分叉(network fork)
  • 新節點的礦工開始基於新規則挖礦,舊的依然用舊的規則,不一樣的的礦工算力出現了分叉(mining fork)
  • 最終,整個區塊鏈出現了分叉(chain fork)。

一個實例:

2017年8月1號,Bitcoin Cash(BCH)區塊鏈成功在區塊高度478559與主鏈分離。這一新的加密貨幣默認區塊大小爲8MB,而且能夠實現區塊容量的動態調整。
因爲舊節點只承認小於1MB的區塊,因此運行BCH客戶端節點產生的區塊沒法向前兼容,將被舊節點拒絕,最後運行不一樣客戶端的礦工將會長期運行在兩條不一樣的區塊鏈上(BTC和BCH)

軟分叉的出現

  • 不一樣的節點短期差內挖出了同區塊號的區塊,也就是上面的例子
  • 因共識規則被改變,舊節點可以識別新節點產生的區塊,舊的塊不能被新的接受
    • 新節點全網算力大於50%
    • 新節點全網算力小於等於50%

第二種的軟分叉是不必定能由節點自我糾正的。萬全的解決方案必須依賴人力升級節點到同版本。

  1. 新節點全網算力大於50%,由於新節點算力大於50%,因此不論舊節點升級不升級,最長的鏈也必定會是所有由新節點生成的區塊組成的鏈。並且,這條最長鏈最終都會是雙方都認爲合法的一條,緣由參考上面談到的最長鏈複製,因知足下面幾點因此能被複制。

    • 舊的能接收新的,在分叉點以後的區塊參雜着
      • 舊節點的區塊
      • 新節點的區塊
    • 新的不能接收舊的,可是最終及其以後總比舊的長
  2. 新節點全網算力小於等於50%,最終不能經過短的複製長的達到統一,結果是:分叉。緣由以下。

    • 舊節點最終會比新節點的鏈要長
    • 新的老是不能接受舊的,不會去複製一條含有本身不能接受的塊的鏈

寫到這,發現內容鋪開後比我想象中的要多。

故目前暫時分紅兩章節,剩下的共識算法的介紹留到第二章

參考

http://www.javashuo.com/article/p-wfmkkumw-cz.html

http://www.javashuo.com/article/p-uibrlpbx-y.html

相關文章
相關標籤/搜索