坎坷的“共識機制”之路——區塊鏈技術引卷之一


坎坷的“共識機制”之路——區塊鏈技術引卷之一

FENBUSHI DIGITAL × 通證通研究院 聯合出品

文:宋雙傑,CFA;Rin,FENBUSHI投資總監

特別顧問:沈波

導讀

如果說商業活動是驅動人類文明發展的一架馬車,那麼價值記錄則是馬匹的四隻蹄鐵。自人類500年前發明複式記賬以來,價值記錄工具、方法隨著科技的進步發生了一次次翻天覆地的變化,以區塊鏈為代表的分佈式記賬也是其中之一。本文將從闡述分佈式和非中心化的基本思想開始,帶領讀者瞭解區塊鏈及其共識機制,為什麼共識在區塊鏈裡得以扮演如此重要的角色。

摘要

區塊鏈可以看作一個非中心化分佈式的賬本,參與交易的各方共同維護著同樣的賬本記錄,這意味著各節點都保存賬本的完整副本,並認可賬本的正確性,沒有一個節點能夠完全控制記賬的權利。它實現了人類記賬規則與記賬方式的重要突破,從而為線上價值轉移提供了基礎。

但絕對可靠的分佈式對等系統是不存在的。由於組成分佈式對等系統各節點的地理位置不同、網絡延遲的存在,節點間的通信總是存在不可預測的延遲,因此不同節點對其接收到消息的先後順序有不同的判斷,這種消息處理模式稱為異步模型。除了節點通信過程會發生意外,有時組成網絡本身的各節點也會發生故障,表現出不可預測行為,它的存在是設計開放式區塊鏈網絡共識機制時必須考慮的因素。

FLP不可能原理表明:異步的分佈式系統中不存在能容錯(Fault Tolerant)的狹義共識算法。CAP原理表明:分佈式系統最多隻能同時滿足一致性、可用性和分區容錯性中的兩項特性。

我們根據區塊鏈網絡的特點作出有別於傳統分佈式系統的CAP定義,並以BTC及其共識機制工作量證明(PoW)為例,分析其共識機制的原理與過程,從密碼學、概率論、博弈論的角度說明最終一致性的可實現性。以及為了滿足實際應用場景的需求,PoW如何在一致性、可用性和分區容忍性實現完美平衡。我們還將分析節點可能對區塊鏈網絡發動的惡意攻擊,並闡明PoW有一定抵禦常見的惡意攻擊的能力。

最後我們在分析PoW的基礎上,抽象出區塊鏈共識機制的八個關鍵要素,它們決定了共識機制的主要特徵。在專題後續文章中,我們將進一步介紹主流的共識機制及其特點。

目錄

1 什麼是區塊鏈:漫談分佈式系統與非中心化

1.1 記賬方式與信任

1.2 分佈式與非中心化的融合

2 分佈式對等系統內部的通信與共識

2.1 不存在絕對可靠的分佈式對等系統

2.2 “狼人殺”與拜占庭將軍們

2.3 分佈式系統不存在完美的確定性共識算法

2.4 CAP原理與區塊鏈共識機制

3 PoW工作量證明——一致性與可用性的權衡

3.1 BTC實現實際應用中的一致性

3.2 密碼學是PoW一致性的基礎

3.3 最長鏈原則與“礦工”間的博弈

3.4 PoW如何防止拜占庭故障破壞共識

4 區分不同共識機制的八個關鍵要素

正文

1 什麼是區塊鏈:漫談分佈式系統與非中心化

“資本主義實踐將貨幣單位轉換成為合理的成本-利潤計算的工具,複式記賬法是它高聳的紀念塔。”——熊彼特

1.1 記賬方式與信任

如果說,商業活動是驅動人類文明發展的一架馬車,那麼價值記錄則是馬匹的四隻蹄鐵。14世紀晚期,在文藝復興的發源地意大利——中世紀歐洲的海上貿易中心,複式記賬法誕生了。這項500多年前的發明也是現代會計學的重要基礎。目前最常用的借貸記賬法基於一個簡單的恆等式:資產=權益+負債。交易的本質是價值的轉移,複式記賬法使資金轉移過程的記錄變得清晰,讓驗證賬本的正確性變得簡單,與“記流水賬”相比,增加了不誠實的記賬人造假的成本。

隨著20世紀電子計算機的發明,人類的記賬工具開始向數字化演進。數據庫技術與互聯網的普及,使電子支付成為了可能,數據的規模與處理效率也得到了極大的提升,但這背後的複式記賬法則仍然沒有改變。在傳統的記賬方法中,賬本由一個單一的記賬人維護。這種由單一的中央機構實現對數據的存儲、記錄以及維護的模式被認為是中心化的。賬本的正確性與不可篡改性以記賬人的聲譽、信用或資產擔保。

在中心化的記賬體系裡,參與交易的雙方各自維護著自己的賬本,這樣就產生了一些問題:雙方的賬本若不一致該如何處理?如何保證雙方不會為了自己的利益篡改賬本?為了解決這些信任問題,仍然需要專業機構對公司賬目進行審計,帶來的額外成本也非常大。於是參與交易的各方共同維護同一個賬本的記賬方式就應運而生了,這也是分佈式賬本的思想。

1.2 分佈式與非中心化的融合

區塊鏈行業提到的“非中心化分佈式”這一概念與傳統計算機科學中的分佈式計算略有不同。一個分佈式計算系統通常出於解決:

  • 單個節點的計算性能瓶頸。
  • 屬於同一公司或組織的不同計算節點在地理位置上的分散性。
  • 節點數據的分散儲存與備份問題。

一般來說,由能夠互相通信的多個能夠實現“最小功能”的工作單元以實現同一項任務為目標協同工作組成的系統稱為分佈式系統。分佈式系統的一個工作單元稱為節點

在理想的分佈式系統中,用戶可以通過任意節點使用系統的完整功能。

那麼區塊鏈和傳統分佈式系統相比有什麼特點呢?

之前提到,區塊鏈最初的目的是進行非中心化的分佈式記賬,這要求參與交易的各方(各節點)共同記錄同一個賬本,意味著各節點都保存賬本的完整副本

,並能夠檢驗賬本的正確性。因此,我們可以認為區塊鏈是由多個具有記賬功能的節點以維護一個特定賬本的完整記錄為目標協同工作的分佈式系統。

隨著技術的發展,其功能也不僅僅侷限於單一的“記賬”。賬本的概念擴展為一個可以增添記錄的特定“數據結構”,並定義其為當前系統的“狀態”。整個網絡的目的就是共同維護一個“系統狀態”。

但如果整個分佈式記賬系統由一箇中心節點來控制的話,其實依然可以對賬本進行整體化的篡改。而區塊鏈的非中心化性解決了這一問題。

有別於某一些存在中心節點分發並確認任務的分佈式系統,在區塊鏈網絡中,沒有一個節點能夠完全決定系統的當前狀態。通常說這種不存在某一個或一些特殊的節點能夠決定系統狀態的分佈式系統是非中心化的。

回到區塊鏈究竟是什麼的問題上來。大部分人認為它是繼互聯網之後的又一重大技術革新,極客們認為它是能夠不同於中心化體的一套自治的的體系。也有人認為區塊鏈是一個無需第三方信用背書、信息可溯源且不可篡改的數據庫。

事實上,非中心化與中心化的概念仍然沒有明確的定義,人們對兩種模式的爭論仍然在繼續。

從技術的層面來說,區塊鏈同時具有分佈式系統和非中心化的特徵,是兩者的有機結合。因此它同時具有:節點以維護賬本的正確性為目標、沒有中心節點可以控制賬本的記錄的特點。由此帶來應用層面的特性包括無需中心機構的可信任性,以及安全信息記錄方式。有些區塊鏈網絡還實現了智能合約,能夠自動地執行流程化的交易,進一步提升了效率。

2 分佈式對等系統內部的通信與共識

“蜂群意識、經濟體行為、超級電腦的思維,以及我的生命分佈 在眾多更小的單元上。我們所能發現的最有趣的奇蹟——生命、智力、進化,全都根植於大型分佈式系統中。”——凱文•凱利

2.1 不存在絕對可靠的分佈式對等系統

假設有一個由n個節點共同維護的分佈式賬本,並且每個節點都能夠對賬本進行本地處理,也能夠向其他所有節點發送消息(稱為

廣播一條消息,在有的消息模型中不存在一對多的廣播渠道)。如果有數個節點對賬本進行了修改,它們會向其他節點發送一條包含修改內容的消息。在實際情況中,會出現各種各樣的意外:

  • 消息損壞、消息被惡意篡改:解決方案是為消息添加校驗信息
  • 消息丟失:由於通信網絡不能正常工作,可能有部分或全部的節點沒有收到某條消息。
  • 不確定的消息延遲:由於各節點的地理位置、網絡狀況不同,收到來自其他節點消息的時刻與該節點發送消息的時刻之間總是存在不可預測的延遲,因此不同節點對其接收到消息的先後順序有不同的判斷。

我們一般認為不同的節點本身的時鐘也是不完全同步的,又由於消息丟失和不確定延遲的存在,所以當節點在處理消息時,不能使用基於時間的控制流程:“在某時某刻,開始執行某操作”、“先處理來自節點i的消息,再處理來自節點j的消息”,而只能採用基於事件的控制流程:“當收到來自節點i的消息,開始執行某操作”。這種處理方式稱為

異步模型(Asynchronous Model)。在異步模型中,我們假設節點在本地對消息的處理時間要遠遠短於消息的延遲。

除了傳遞消息的通信過程會發生意外,有時組成網絡本身的各個節點也會發生故障。一個著名的例子就是拜占庭將軍問題,在下一節會具體介紹。

我們先簡單地假設n個節點中存在f個不能正常工作的節點,但網絡通信都是可靠的,即不存在消息丟失這一情況,並且假設初始條件下所有節點保存了相同的賬本。當一筆交易發生後,需要對賬本增加一條記錄,參與交易的節點會向其他節點發送一條消息,稱這條記錄了修改內容的消息為節點發出的一個提案。當節點收到來自其他節點的提案時,需要從全部提案中選出一個提案作為自己的決策,決策應該滿足三個條件:

  • 合同性(Agreement):所有正常工作節點的決策應該相同,即對賬本應該記錄的內容達成一致。
  • 有效性(Validity):決策必須從提案中選出。
  • 可終止性(Termination):節點選擇決策的時間必須是有限的。

滿足條件的決策值即作為一條新的記錄被添加到賬本中,同時成為新的系統狀態。

狹義概念的共識可以表述為,節點收到來自其他節點的提案並根據一定的規則作出滿足上述三個條件的決策的過程。

很多人都有過搶購火車票的經歷,考慮這樣一個“分佈式”售票系統:由數個售票節點組成的分佈式系統,維護一個記錄車票餘量和購買信息的數據庫,以及請求購票服務的用戶節點A和B。當用戶發出購買車票的請求後,節點應當就車票餘量與用戶購買是否成功達成一致判斷。

這個系統若要達成狹義的共識,要求所有正常工作的售票服務器應當就上次達成共識狀態後,到本次共識完成前,在有限時間內對數據庫的修改提案作出相同的決策。尤其是對於消息的先後順序也應達成一致的判斷,否則,如果車票只有一張,而用戶A和B幾乎同時發出一次購買請求,不同的售票節點對於A和B誰先發出請求可能存在不同的判斷。在傳統的中心化系統中,可以通過判斷A和B發出請求時間的先後決定票應該賣給誰。但在我們討論的“分佈式對等系統各節點不能訪問一個同步的時間服務器”情況下,解決這個問題將會變的更加複雜。

坎坷的“共識機制”之路——區塊鏈技術引卷之一

2.2 “狼人殺”與拜占庭將軍們

上個世紀的航空航天專家們為了提高飛機的安全係數,曾經對飛機上安裝的傳感器發生的錯誤進行統計建模。他們發現,在高空環境下,失靈的儀器不但會停止工作,還會隨機地發出錯誤的信號,極大影響飛行員對於飛機狀況的判斷,從而造成安全事故。

在通信網絡的研究中,有一個著名的拜占庭將軍問題:假設有n個將軍需要合作進攻地方的城池,他們的軍隊駐紮在n個不同的駐點,相互間只能通過信使通信,根據其他將軍的提案作出行動決策。為了簡化問題,將軍的提案限定於“進攻”與“撤退”兩種,必須通過投票來決定所有軍隊是一起進攻或一起撤退。將軍們可看作分佈式對等系統的節點,而信使則是不可靠的信道。除此之外,將軍中還可能出現反叛者,反叛者將不會遵守忠誠將軍的行為規範,甚至會蓄意破壞忠誠將軍之間的共識。參考下圖,考慮5名將軍組成的系統,其中有1名反叛者,如果2名忠誠將軍發送“進攻”的提案(綠色的將軍),2名忠誠將軍發送“撤退”的提案(橙色的將軍),那麼反叛者在收到提案後可以向發送“進攻”的將軍發送“進攻”的提案(綠色的箭頭),並同時向發送“撤退”的將軍發送一個“撤退”的提案(橙色的箭頭),這樣在每一名忠誠的將軍看來,自己的提案都是佔多數的,因此投“進攻”的將軍會進攻,投“撤退”的將軍會撤退,軍隊的一致性被打破。除此之外,信使也可能被敵人截殺或者反叛等。可見由於節點的背叛或者通信系統的不可靠,系統的一致性便得不到保障。

這就像“狼人殺”遊戲裡的村民和狼人。在每一個夜晚結束後,所有玩家(節點)就上一輪被處死的玩家達成了共識,並通過輪流發言(類比相互通信),指出自己認為的兇手(提案),並經過投票表決(決策)選出兇手(達成共識)。由於狼人的存在(表現出惡意行為的節點)、信道的不完美、玩家之間身份的不透明,狹義的共識是很難達成的。(當然這個類比也有不完美之處)

2.3 分佈式系統不存在完美的確定性算法

關於一個分佈式系統能否達成狹義共識的問題,已經有很多學者研究過。我們繼續之前的假設,即使一個網絡通信都可靠的分佈式系統,並且節點發出的提案非常簡單:只從0和1當中取值,那麼是否存在一個算法,使這個系統在異步模型下能夠達成狹義共識呢?

遺憾的是,Fischer,Lynch,Patterson三位科學家在1985年發表的論文中證明了,在這樣的分佈式系統中,即使存在一個可能失效的節點(f=1),也不存在一個確定性的算法,總能在異步模型下達成狹義共識,這就是著名的

FLP不可能原理

在一個分佈式系統中,節點可能出現多種故障。

我們定義分佈式系統的三個特性(CAP)

  • 一致性(Consistency):系統的所有節點訪問同一份最新的數據副本。
  • 可用性(Availability):每次請求都能獲取到非錯的響應,但是不保證獲取的數據為最新數據。
  • 分區容忍性(Partition Tolerance):以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味著發生了分區的情況,必須就當前操作在C和A之間作出選擇。

CAP原理表明,分佈式系統無法同時滿足一致性、可用性、分區容忍性,最多隻能同時滿足其中兩個特性。

CAP原理適用於傳統的分佈式系統,但區塊鏈這樣的分佈式和非中心化結合的網絡有很多不同之處。我們將說明當前的區塊鏈共識機制可以實現三者接近完美的平衡。

2.4 CAP原理與區塊鏈共識機制

我們將CAP三個條件放在區塊鏈網絡的實際應用場景中考慮,瞭解一下區塊鏈對CAP特性的適用性:

  • 一致性(Consistency)分佈式對等系統中的概率共識可以解決拜占庭故障,從而達到最終的一致性。
  • 可用性(Availability):每次請求都能獲取到非錯的響應,但是不保證獲取的數據為最新數據。
  • 分區容忍性(Partition Tolerance):系統能夠在一定的時限內達成數據一致性。

比如在PoW的共識機制中,當兩個節點分處分區兩側時,區塊鏈會根據其概率共識(51%的算力支持)來確定某個數據結果,並確認整條主鏈,主鏈上每一個節點的最新數據副本相同,保證了C性質;而分區一側有不同結果的節點會被更新狀態,繼續參與記賬,保證了A性質;在這一段時間內,兩個節點依然可以互相通信,保證了P性質。

從而使PoW可以實現CAP接近完美的平衡。

區塊鏈能夠在一定時間內通過概率共識對系統節點進行更新,並達成一致性,從而滿足CAP特性。

3 PoW工作量證明——一致性與可用性的權衡

3.1 BTC實現實際應用中的一致性

以之前的“分佈式售票系統”舉例來說明最終一致性。也許當你在查詢車票時,用戶節點存儲的數據庫是“有票”狀態,但在你完成購票之前另一名用戶已經完成了購票操作,售票節點的數據庫已經更新。當你點下付款按鈕時,售票節點通知用戶節點更新系統的狀態,這時就會提醒你“車票已售完”。“雙十一”搶購時天貓等購物網站的系統也有類似設計。

我們並不需要在任何時刻都保證節點讀取同樣的系統狀態,而是保證所有拜占庭故障經過有限時間後就係統的狀態達成一致,稱為最終一致性。

從這個例子還可以看出,在某個時間段內,節點可能保存的系統的狀態不同,因此發出的提案可能存在衝突,需要一個衝突解決機制避免衝突的提案對系統狀態的影響,並使節點最終對某個系統狀態達成共識。

BTC網絡是一個任何節點都可自由加入、不記名的區塊鏈網絡,要達成一個全部節點參與的、滿足一致性的共識是很難的。PoW機制通過一些巧妙的機制,實現了應用環境可信強度的一致性。

為什麼最終一致性可以替代一致性,系統如何選擇出一個狀態成為最終的共識呢?為了解答這個問題,我們首先需要了解區塊鏈的結構和PoW的工作原理。

3.2 密碼學是PoW一致性的基礎

BTC是一個分佈式對等賬本。一個加入BTC網絡的用戶可以生產任意個成對的公鑰和私鑰。私鑰由用戶保存,是不應該洩露給他人的。私鑰可以用於對消息簽名,簽名不可偽造,並且是可以通過私鑰對應的公鑰驗證的。

密碼學保證簽名具有以下特點:

有效性。如果用戶用私鑰簽名了一個消息,那麼其他任何人使用私鑰對應的公鑰、消息原文來驗證簽名,該簽名必須是有效的。

不可偽造性。如果沒有掌握某個私鑰,就無法對一條之前該私鑰沒有簽過名的消息生成一個簽名,並且使它可以被公鑰驗證為有效。也就是說,僅僅掌握了公鑰是無法偽造相應私鑰的簽名的。在實際情況中,找到公鑰對應私鑰的代價通常非常巨大,以至於我們認為這是“無法完成的”。

在BTC的世界中,公鑰代表節點的身份。地址通常是公鑰經過數次哈希處理得到的字符串,與公鑰存在對應關係。地址也被用於標識一定數量的比特幣的歸屬。

坎坷的“共識機制”之路——區塊鏈技術引卷之一

在BTC的網絡裡,一筆交易是一個特殊的數據結構,它包含了若干個輸入和若干個輸出,描述的是一次BTC使用權的轉移情況。

一個輸出是一個包含了一定數額的BTC和一個使用條件組成的列表。使用條件一般與某個地址相關聯。輸出存在已使用和未使用兩個狀態。BTC賬本並不記錄某個地址對應的BTC餘額,地址的餘額是某一時刻與它關聯的所有未使用輸出的BTC數額之和。所有未使用的交易輸出(Unspent Transaction Outputs,UTXO)就構成了BTC這個區塊鏈網絡的一個狀態。網絡中的(全功能)節點各自維護一個狀態的副本,並在某一時刻就係統的狀態達成最終一致。

一個輸入同樣也是一個列表,包含對之前一個未使用輸出的引用,以及能夠證明交易創建者滿足該輸出使用條件的有效簽名。

即證明交易創建者對他引用的未使用輸出中BTC的使用權,被引用的輸出會從UTXO中刪除。一筆交易還要滿足以下條件:輸出所包含的總金額應小於等於輸入所包含的總金額。這時輸入與輸出的差額作為交易費作為激勵費用獎勵給記賬的節點。滿足以上輸入與輸出的交易被看作是“合法的”。

當一個地址要發佈一筆交易時,它所做的其實是向BTC整個網絡中的節點廣播該條交易,該條交易會被標記為“未確認的”(Unconfirmed)。BTC網絡並不是收到一條廣播就立刻更新系統的狀態,而是有區塊以及內存池的設計。

在某一個時刻,所有BTC節點都維護著一個記錄UTXO的賬本,並有一個接收未確認交易的內存池(Mempool),當收到一條交易廣播時,節點就會把該交易加入自己的內存池。由於網絡通信的原因,各個節點內存池中的交易都不完全相同。

坎坷的“共識機制”之路——區塊鏈技術引卷之一

一“輪”共識過程開始於節點對“哪些未確認的交易應該被確認”發出提案。在BTC網絡中,交易都是被“打包”放進區塊進行處理的。區塊(Block)是一個精心設計的數據結構,它包含兩部分。第一部分是一個哈希指針,它包含上一區塊的哈希值,可以表明自己上一個區塊的信息。第二部分是一個Merkle樹,它的葉節點是被打包進該區塊的所有交易的哈希值,非葉子節點則是根據它的兩個子節點計算出的哈希值。通過Merkle各節點的哈希可以方便地驗證該區塊內所有交易的完整性。這樣的一個個區塊由哈希指針連接組成的“鏈”被形象地稱為區塊鏈。

一個區塊還包含了一個coinbase交易(幣基交易),這個交易僅包含一個名義上的輸入,它不指向之前任何一筆未確認的輸出,輸出的總金額等於一個固定的數值(當前是12.5,表示打包一個區塊獲得的獎勵),加上該區塊裡所有交易的交易費。幣基交易不消耗未確認的輸出,因此這部分固定的獎勵BTC是被新“創造”出來的,將被支付給打包這個區塊的節點。這也是唯一一種“發行”新的BTC的方式。

因為這種獎勵的存在,使得節點之間有

競爭“記賬權”的動力,每個節點都希望自己打包的區塊成為系統的長期共識(最終一致性共識),因為只有這樣自己才能獲得幣基交易的獎勵。BTC採用工作量證明模式限制一段時間內能夠發出提案的節點數量,從而避免同一時間段節點發出不同的提案數目過多,影響最後節點決策的效率與最終一致性。

任何一個希望發出決定下一個區塊內容的提案的節點都需要完成一個“數字解謎”的小遊戲。這個小遊戲的目的在於:

  1. 任何一個成功解謎的節點都可以通過展示謎底,證明它至少完成了一定量的“計算”,即為工作量證明
  2. 整個網絡希望可以通過算法調整謎題的難度,可以動態地根據網絡中節點的計算能力進行調整,保證出現一個節點解開謎題的時間期望是相對恆定的
  3. 這個謎題不應該設計成總是隻能由計算能力最強的節點解開,也不能被巧妙的算法破解,
    每個節點成功解謎的概率應與其計算能力成正比
  4. 這個謎底應該是可驗證的。當一個節點宣佈解開謎題時,它會將區塊以及謎底廣播到其他節點,其他節點應該能迅速的驗證謎底的正確性。

密碼學再一次給了我們驚喜。哈希函數便是滿足以上所有條件的一個“謎面”。前面提到一個區塊包括一個哈希指針,以及一棵包含區塊內交易及哈希值的Merkle樹。現在BTC網絡給所有節點發布了一個謎題:在區塊的前面加上一個隨機數nonce,計算整個區塊的哈希值,謎底便是使區塊哈希值小於特定的目標值的那個隨機數。這樣第一個找出對應nonce的節點就幸運地取得了下一個區塊的記賬權,節點找出nonce的概率與它計算哈希值的速度成正比,也稱為節點的算力,這樣解謎的過程也被稱為挖礦。節點可以將自己挖掘的區塊廣播出去,其他節點在驗證謎題的正確性與區塊內交易的合法性之後,就會以:

  1. 停止自己正在進行的解謎工作。
  2. 將此輪記賬節點打包的區塊加入到自己維護的區塊鏈賬本最後。
  3. 清理本地的內存池,刪除已經被確認的交易、以及與已經被打包的區塊衝突的交易。
  4. 下一個區塊的開頭引用這個這個區塊的哈希指針。

方式表達自己對這個區塊提案的支持,從而決策過程完成,該區塊中的所有交易變為已確認的狀態,我們說這些交易得到了1個區塊的確認。隨後各節點在延長後的新鏈上開始新一輪的解謎過程。

坎坷的“共識機制”之路——區塊鏈技術引卷之一

3.3 最長鏈原則與“礦工”間的博弈

在剛才提到的“一輪”共識過程中,我們發現,如果單單隻靠工作量證明機制,並不能保證系統的最終一致性。因為當節點收到來自其他節點的區塊時,沒有任何強制性措施讓它接受這一區塊並加到自己維護的歷史區塊鏈之後,另外,由於節點可能存在網絡通信等故障,它可能並沒有接收到其他節點發出的提案。

BTC網絡中通過最長鏈原則解決系統最終一致性的問題。每個區塊都包含有一個指向前一區塊的哈希指針,並由此可以追溯到創世區塊,我們定義從創世區塊到這個區塊所形成的“鏈”上的區塊總數為該區塊的區塊高度。BTC網絡規定,當網絡中存在所謂的“分叉”時,即多個區塊同時引用了同一個區塊的哈希指針,只有最長鏈(即區塊高度最高的鏈)上的交易會被承認。

這樣每個節點在選擇自己將在哪一個區塊進行自己的解謎工作時,如果節點預期自己找出一個謎底所花費的成本低於能從挖掘一個區塊中獲取的收益,那麼它會主動在當前的最長鏈上進行解謎遊戲,因為只有最長鏈上的交易能夠得到確認。

由於這種哈希函數解謎本質上是一個分佈式的隨機計算過程,同時由兩個不同節點解出兩個謎底的情況也是可能出現的,這樣就導致了分叉的產生。這樣一個節點可能根據本地收到分叉區塊的順序選擇一個分叉進行解謎工作,但這種分叉是不可持續的。在不同的分支上,同時發現新區塊的概率將呈指數級下降。避免網絡分叉也是限制一段時間內能夠發佈提案的節點個數的原因之一。

工作在較短鏈上的節點一方面損失了可能獲得的區塊獎勵,另一方面增加了在最長鏈上解謎的節點挖掘區塊的概率,因為謎題的難度沒有那麼快調整。博弈論告訴我們,如果在短鏈上解謎的節點是理性的,那麼它們應該立即拋棄這條較短的鏈,切換回最長鏈。因此,整個系統必然會在一個時刻,使所有接入網絡的節點對系統的狀態達成一致,所達成的共識就是當前的最長鏈。

此外,這也表明PoW是一種概率性的共識機制。一筆交易經過n次交易確認後,沒能成為最終共識的概率隨n指數性降低。中本聰經過計算推薦n的取值為6,也就是一筆交易要等待約60分鐘才會被看作“一致性”的共識。BTC為了實現更強的一致性而延長了交易得到確認的時間,犧牲了一部分可用性。

3.4 PoW如何防止拜占庭故障破壞共識

設想一個開放性、節點可無需身份驗證自由加入的區塊鏈網絡,惡意節點的存在是必然的。假設有這樣一個攻擊者,希望通過操縱區塊鏈網絡使自己獲益,他可能採取這樣幾種攻擊方式。

女巫攻擊:得名於電影《女巫》。《女巫》講述了一個患有身份認同障礙的化名“女巫”(Sybil)的女性進行心理治療的故事,她同時具有16種不同的人格。

在某些分佈式對等系統中,投票的表決權是與節點個數成正比的。如果網絡對新加入的節點的身份不做任何驗證,可以任意地創建新的節點,或是攻擊者可以攻破身份驗證系統,使他創建的節點們看起來像是擁有不同的“身份”,但其實都是由同一個人控制的,這會給系統的安全帶來極大的威脅。這種攻擊方式稱為“女巫攻擊”。

在採用PoW共識機制的區塊鏈網絡中,僅僅創建節點是不能給攻擊者帶來額外收益的,因為攻擊者的實際算力並沒有真的增加,所以PoW是能夠抵抗女巫攻擊的。

盜取屬於其他節點的權益:這一點在區塊鏈網絡裡也是無法做到的。即使攻擊者已經獲得了下一個區塊的記賬權利,要構造出一筆能夠通過其他節點檢驗的合法交易來使用不屬於他的貨幣也是無法實現的。因為這要求攻擊者偽造出貨幣持有者的簽名,如果該區塊鏈網絡採取的密碼學機制是安全的,除非擁有該地址對應的私鑰,否則無法構造出可以通過公鑰檢驗的簽名。

拒絕服務攻擊:攻擊者拒絕將特定節點發起的交易請求打包進區塊,以干擾這些節點正常使用區塊鏈網絡的功能。但其實只要輪到下一次正常節點獲得記賬權,這些之前未確認的交易都會被打包進區塊。

雙重支付攻擊:考慮攻擊者向一個商家發起一筆交易x,支付一定數額的BTC購買某項商品,並且這筆交易x已經被打包進區塊,並由一個正常節點廣播到網絡並得到1次確認,商家看到確認以後把商品出售給了攻擊者。如果攻擊者此時馬上發起另一筆雙重支付交易y,它使用與交易x相同的輸入(重複消費已使用的輸出),但是輸出卻指向一個攻擊者擁有的地址。在交易x已經被確認的情況下,交易y會被記賬節點認為是不合法的。

如果攻擊者選擇將交易x和y分別向一半的節點廣播,雖然這兩筆交易在其他節點看來都是合法交易,但最後還是隻有包含了其中一筆交易的區塊會被先挖出。如果恰好有兩個節點同時挖出了包含這兩筆交易的不同區塊(這樣的概率已經很低了),則網絡發生分叉。攻擊者向商家展示交易x獲得1次確認的那條鏈,此時將會有各一半節點在兩條鏈上挖礦,下一個區塊被挖出時,最長鏈也就確定了。但此時已得到1次確認的交易x可能會因為在較短的鏈上而被取消。為了避免這種情況,商家只需要看到交易經過2次區塊確認再交付商品就可以了。

由於BTC的最終一致性,互相沖突的雙重支付x和y最終只有一筆會被納入到長期的共識鏈當中。一筆交易無法做到同時被支付給兩個地址,如果雙重支付攻擊成功,那麼攻擊者沒有花費BTC就得到了商品,而商家收到BTC的交易成為了無效交易。

如果攻擊者擁有一定比例的算力,他可以主動丟棄打包了交易x的區塊,重新在前一個區塊上挖礦,並且將雙重交易y放進新的區塊裡。如果攻擊者掌握的算力足夠多,或者運氣足夠好,能夠在包含交易y的鏈上挖出足夠多的區塊,使原來包含轉賬給商家的交易x的鏈成為短鏈,被所有節點放棄,從而使雙重支付攻擊成功。

對於商家來說,可以採用等待多次區塊確認的方式避免自己遭受到這種攻擊。一筆經過n個區塊確認的交易,一般的採用雙重支付攻擊手段的攻擊者如果要丟棄這筆交易及之後的n個區塊,重新構造出雙重支付交易,並通過算力優勢重新追上較長鏈的區塊高度的可能性隨n增大指數性降低。但如果攻擊者掌握了超過一半的算力,那麼他正在挖礦的那條鏈成為最長鏈只是時間問題。這也就是下面提到的獲取記賬權的攻擊方式,在PoW共識中又稱51%攻擊。

獲取記賬權:如果攻擊者採用各種方式儘可能地提高自己獲得記賬權的概率。當攻擊者有51%以上的概率獲得記賬權時,分叉攻擊和雙重支付攻擊都會變得容易進行,因此我們說PoW共識機制的容錯能力為1/2。BTC以一個較巧妙的方式減少了這類攻擊發生的可能,一方面,基於工作量證明的共識機制要求節點獲得記賬權的概率與節點的計算能力成正比,發動此類攻擊的成本過高。另一方面,只要出現51%算力的節點,即使沒有出現分叉攻擊等事件,人們也可能對BTC網絡失去信任,導致其價格與內在的價值下降。攻擊者雖然掌握了記賬權,但是獲取的收益卻遠遠不及成本。

坎坷的“共識機制”之路——區塊鏈技術引卷之一

4 區分不同共識機制的八個關鍵要素

BTC、ETH以及其他採用各種共識機制的數字通證的穩定長期運行告訴我們,現有的多種共識機制使區塊鏈網絡可以在實際環境中達成可信的共識。

經過對PoW共識機制的分析,我們可以總結出區塊鏈共識過程中的以下八個關鍵問題,對這幾個問題的不同處理方式決定了共識機制的整體特性。

整體:

1. 共識機制如何容忍拜占庭故障?

2. 共識機制如何在實際應用中實現一致性、可用性、分區容忍性?

提案發布階段:

3. 節點如何獲得發佈提案的資格?

4. 如何選擇發佈提案的節點?

5. 提案應該包括什麼內容?具體地說,應該就區塊鏈網絡的哪些數據達成“共識”?

決策階段:

6. 節點根據什麼算法對自己收到的提案集合作出決策?

形成共識:

7. 對記賬節點是否存在激勵機制?

8. 對惡意節點是否存在懲罰機制?

除此之外,BTC的一些有別於傳統的分佈式系統的特殊機制也對最終一致性的達成起了關鍵的作用。例如最長鏈原則,這個規則的實現需要系統維護一個具有哈希鏈表結構的“區塊鏈”。以及激勵機制,這在傳統的分佈式數據庫中是較難實現的。

如果區塊鏈賬本只是單純的存儲交易的歷史記錄,而不給予記賬的節點獎勵,由於節點維護一個賬本需要付出大量成本,最後會沒有節點願意承擔記賬責任,導致共識無法形成。這也是區塊鏈技術與傳統分佈式系統的區別所在。

除了以上分析,我們還可以就安全性、可擴展性、交易性能、匿名性等其他的指標評價共識機制。在本專題後續文章中,我們會從技術、實用性、應用場景等維度對其他主流共識機制進行分析。

附註:

因一些原因,本文中的一些名詞標註並不是十分精準,主要如:通證、數字通證、數字currency、貨幣、token、Crowdsale等,讀者如有疑問,可來電來函共同探討。

坎坷的“共識機制”之路——區塊鏈技術引卷之一


分享到:


相關文章: