1. 程式人生 > >區塊鏈的共識算法 及 分叉 的通俗講解 (一)

區塊鏈的共識算法 及 分叉 的通俗講解 (一)

一段 過大 關系 動物 .net 公式 廣播 安全 user

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

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

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

GitHub : https://github.com/af913337456/

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


本文不做一般入門的區塊鏈描述講解。著重簡述講解:

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

目錄

  • 前言
  • 簡單過一下區塊鏈
  • 通俗講解共識
  • 共識算法
    • PoW
  • 區塊鏈分叉
    • 硬分叉的出現
    • 軟分叉的出現
  • 參考

前言

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

簡單過一下區塊鏈

我們一般意識形態中的 鏈 是鐵鏈,由鐵鑄成,一環扣一環。形象地,區塊鏈的也可以這麽理解,只不過它不是由鐵鑄成,而是由擁有一定數據結構的塊連接而成,這是一個最簡單的雛形

見下圖

技術分享圖片

通俗講解共識

所謂共識,通俗來說,就是我們大家對某種事物的理解達成一致的意思。比如說日常的開會討論問題,又比如判斷一個動物是不是貓,我們肉眼看了後覺得像貓,其滿足貓的特征,那麽我們認為它是貓。共識,是一種規則。

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

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

為什麽需要共識,不需要可不可以?當然不可以,生活中沒了共識的規則,一切亂套。區塊鏈沒了共識的規則,各個節點各幹各的,失去一致的意義。

這兩個例子的對應的關系如下:

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

如果你對節點的概念意思不懂,請先理解為礦工,一個節點內部包含很多角色,礦工是其中之一。

共識算法

目前常見的在區塊鏈中,節點們讓自己的賬本跟其他節點的賬本保持一致共識方式(算法)有如下幾種:

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

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

PoW

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

比特幣為例子,比特幣挖礦就是通過計算符合某一個比特幣區塊頭哈希散列值爭奪記賬權。這個過程需要通過大量的計算實現,簡單理解就是你進行的計算量大(工作量大),你就有大概率獲得記賬權,即礦工的挖出的區塊並入主鏈。

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

所以說。在很多個節點都在挖礦的情況下,大家都有可能挖出一個區塊,隨之廣播到其他節點中去,那麽每個節點中會根據誰先挖出為準,確認該區塊,並入鏈中。

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

回到比特幣挖礦中:

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

同時解出問題的情況怎麽辦?---① 答案見下一章節 區塊鏈分叉

區塊鏈分叉

註意私有節點不在討論範圍內,所有節點基於公有節點。分叉的情況有:

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

現在先回答上一章節留下的問題 --- ①,
① 的情況是軟分叉的一種,當有兩個或多個節點同時挖出了同區塊號碼的一個區塊,然後它們同時廣播信息出去,假設一個是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%,最終不能通過短的復制長的達到統一,結果是:分叉。原因如下。

    • 舊節點最終會比新節點的鏈要長
    • 新的總是不能接受舊的,不會去復制一條含有自己不能接受的塊的鏈

寫到這,發現內容鋪開後比我想象中的要多。
技術分享圖片
故目前暫時分成兩章節,剩下的共識算法的介紹留到第二章

參考

https://blog.csdn.net/chabuduoxiansheng1/article/details/79740018

https://blog.csdn.net/s_lisheng/article/details/78022645

區塊鏈的共識算法 及 分叉 的通俗講解 (一)