
編者按:本文來自鏈聞ChainNews(ID:chainnewscom)編者按:本文來自
鏈聞ChainNews(ID:chainnewscom)
編者按:本文來自
鏈聞ChainNews(ID:chainnewscom)
編者按:本文來自
鏈聞ChainNews(ID:chainnewscom)
,作者:李畫,經授權發布。
區塊鍊是一種分佈式系統。不了解分佈式系統的工作原理,很難真正理解區塊鏈。
而不理解區塊鏈的麻煩,在於會陷入到對「去中心化」、 「無需許可」等等概念以及「TPS」、「安全」等等問題失去語境的討論中去。這不僅無助於我們去準確地分析和判斷一個區塊鏈項目,也讓我們無法認清區塊鏈在技術上的可能的發展路線。
更直白來講,我們需要掌握分佈式系統的一些基礎知識。因為這樣,我們就能看到區塊鏈本身的局限性,我們就知道任何一個真正有價值的區塊鏈項目都應該:為了解決特定的問題,在特定的環境中,做出特定的解決方案。
了解分佈式系統的工作原理對區塊鏈世界非常重要。那麼現在,就讓我們開啟分佈式系統的探索之旅吧。
分佈式系統有多種不同的架構,用以實現不同的處理信息的方法。假設系統中有十台計算機,一種架構是:我們把一個計算任務分成十份,讓每台計算機獨立處理一份任務,最後匯總它們的計算結果,作為輸出。
二級標題

很容易就能發現,這是一個「自找苦吃」的系統,它相當於把同樣的工作做了十次,而且還需要額外增加不同計算機之間的溝通工作。
二級標題
那為什麼還需要這種系統?因為它可以讓我們免除對中心化的那一台計算機,以及那台計算機背後的中心化的公司或組織的依賴。這樣一來,既能避免單點故障或作惡,也能減少權力的集中及濫用。
二級標題
區塊鏈所屬的分佈式系統也被稱為「複製狀態機模型」(Replicated State Machine),它的目標很簡單:系統內全部的計算機都同意某一個輸出值,也就是指:系統內所有的節點/ 計算機都有相同的初始狀態,在執行完一個事務後,所有的節點都有相同的最終狀態。
某台/ 某些計算機出現故障,它可能無法計算出結果,也可能連接不上系統。
二級標題
這些問題是常見且不可避免的,而一旦出現問題,就無法實現全部的計算機都同意某一個輸出結果。著名的分佈式系統「FLP 不可能原理」是這樣描述的:在網絡可靠,但允許節點失效的最小化異步模型系統中,不存在一個可以解決一致性問題的確定性共識算法。通俗而言就是:只要係統中有一台計算機出問題,該系統就無法在輸出值上達成共識。
二級標題
FLP 不可能原理告訴我們:不要浪費時間去為分佈式系統設計面向所有場景的共識算法,那是不可能實現的。
二級標題
二、分佈式系統的共識算法
雖然FLP 不可能原理很殘酷,但分佈式系統能夠帶來的好處是值得我們迎難而上的。既然不存在面向所有場景的共識算法,那麼也許可以找到一些在特定場景中有效的共識算法。共識算法,是指讓分佈式系統達成共識的方法。
讓我們看看科學家們是如何一步一步限定場景,並實現該場景下的共識算法的。
首先,如果系統中的每一台計算機都可以提出自己的結果,場面無疑是複雜的,因為我們連就哪一個結果去達成共識都無法知曉。所以解決共識問題的第一步是確定共識的到底是什麼,最簡單的方法就是某一台計算機說了算,它提出一個結果,其他的計算機來表態是否同意這個結果。
說了算的那台計算機被稱為提案者或者領導者。雖然通過領導者來實現共識並不是唯一解決問題的方法,但絕大多數協議都是在此基礎上實現的,包括區塊鏈系統中使用的共識算法。
所以你看,並沒有絕對的去中心化,實現共識的第一步就是要確定一個中心。
回到主題。需要領導者的共識算法的工作步驟大致是這樣的:
領導者提出一個結果;
二級標題
如果大家就結果達成了共識,系統輸出最終結果;如果大家未達成共識,回到步驟1 重新開始。
二級標題
這種思路提供了一種可以達成共識的方法,但它離真正實現共識還很遙遠。因為如果一台計算機連接不上系統,它就無法表決自己是否同意領導者的結果;如果出現問題的計算機恰好是領導者,情況就會更糟糕,整個系統會進入停滯狀態。
二級標題
三、同步性假設共識算法
那麼新的問題來了,我們怎麼知道它是連接不上系統,還是它正在參與共識只不過速度比別的機器慢?
Paxos 算法和Raft 算法都是基於同步性假設提出來的。但這兩個算法還需要對系統做另一種假設,即認為系統內所有的計算機都是「好人」,它們要么正確地響應領導者的提案,要么因為故障無法響應。
二級標題
於是,我們終於擁有了一個可以實現共識的分佈式系統,雖然對它有嚴格的條件限定。
二級標題
Paxos 共識算法是由萊斯利·蘭伯特(Leslie Lamport)在1990 年提出的一種基於消息傳遞且具有高度容錯特性的一致性算法,它在分佈式系統應用領域有著重要的地位,包括Google在內的許多公司的大型分佈式系統採用的都是該算法。而我們第一階段的探索也可以在此處結束,接下來是第二階段。
二級標題
四、解決掉系統中的「壞人」
Paxos 雖然能實現共識,但它的算法是建立在所有計算機都是「好人」的基礎上的,這些計算機要么沉默,要么發出正確的聲音,因此整個系統中只有一種聲音,大家就這個聲音達成共識即可。而如果計算機中有「壞人」,系統裡就會出現壞人的聲音和好人的聲音,Paxos 算法無法處理這一情況。
我們需要在有壞人的情況下也可以實現共識的算法,有沒有可能?萊斯利·蘭伯特建立了一個模型來討論這種可能性,該模型被稱作拜占庭將軍問題,其中的拜占庭節點就是壞人節點,它們會傳遞幹擾信息阻礙整個系統達成共識。
在論文《The Byzantine Generals Problem》中,蘭伯特提出了幾種解決方案,其中一種可以在拜占庭節點不到1/3 時實現系統的共識。也就是說,如果系統中壞人的數量少於1/3,就可以通過算法實現共識。
這之後出現的DLS 算法、PBFT 算法(實用拜占庭容錯算法)都是在此基礎上發展出來的。
pre-prepare 階段:領導者發送結果給所有追隨者。領導者在本圖中是0 號節點,它把結果發給追隨者1、2、3 號節點。
commit 階段:如果追隨者發現超過2/3 的節點認可了領導者的結果,就告訴所有其他節點自己接受這個結果為最終結果。
二級標題
到此,我們就解決了有拜占庭節點的分佈式系統的共識問題。不過如果系統中壞人的數量等於或多於1/3,依然是無法達成共識的。我們能做的是通過系統的准入條件或激勵措施,讓壞人可以少於1/3。
二級標題
對分佈式系統的第二階段的探索到這裡就結束了,接下來進入到第三階段。
二級標題
五、中本聰共識算法
不管Paxos 還是PBFT,都使用了同步性假設,事實上,大家對共識算法的研究幾乎都是在該方向上的,直到中本聰共識的出現。中本聰共識使用的是非確定性機制。
這是什麼意思呢?我們可以把一個由12 台計算機組成的分佈式系統想像成一個由12 名陪審員組成的陪審團。我們把這12 個人關在會議室裡,遞進去一張紙條闡述案情,然後坐在會議室門口等他們給出審理的結果。
這12 個人對於如何判決會有不同的意見,隨著討論的深入也可能改變自己的立場,還有的人可能睡著了無法發表看法(參考《十二怒漢》)。那麼坐在門口等的人有兩種選擇。第一種選擇是你們去討論吧,讓我等多久都可以,但最後你們給我的必須是唯一確定的審理結果;第二種選擇是我等不了,你們先把最多人同意的那個結果給我,如果之後出現一個更多人同意的結果,我再改成那個結果。

分佈式系統就是這樣,只能二選一,第一種選擇被稱作Finality,即「結果的確定性」或安全性;第二種選擇被稱作Liveness,即網絡的活性或可用性。
這兩種選擇決定了分佈式共識兩種不同的設計思路:
追求Finality,是優先結果,就要對網絡做出要求。 PBFT、Tendermint 都是這一類型的算法,它們走的是網絡的同步性假設路線,使用這類算法的系統不會出現分叉。
追求Liveness,是優先網絡,就要對結果做出讓步。中本聰共識是這一類型的算法,它走的是結果的非確定性路線,使用這類算法的分佈式網絡始終可用,而且任意節點都可以隨時加入/ 離開系統。
題外話,在Finality 和Liveness 中二選一也是分佈式系統CAP 定理(不可能三角)的體現。該定理說的是:對於一個分佈式系統來說,不可能同時滿足一致性、可用性和分區容錯性。因為分區容錯性是指該系統要能容忍網絡出現分區,而現實網絡是一定會分區的,所以這個條件必須滿足,那麼實際上,CAP 定理說的是一個分佈式系統不可能同時滿足一致性和可用性,這其中,CAP 一致性體現的是Finality,CAP 可用性體現的是Liveness。
而不管是FLP 不可能原理,還是CAP 不可能定理,它們不是在告訴我們:這條路很難走通,你如果突破就是了不起的創新;它們告訴我們的是:這條路走不通,你要做的是根據需求來做權衡和選擇。
使用同步性假設的共識算法在前文已經詳細地介紹過了,它們通過引入超時概念忽略出現問題的計算機,從而達成共識。
使用非確定性機制的中本聰共識描述起來也很簡單:如果你看到某提議的區塊擁有最多的工作量證明,就接受該區塊,這也被稱作最長鏈規則。它的具體實現過程大家都很熟悉,本文就不再贅述了。
現在,讓我們看看使用同步性假設的系統(Finality,PoS 中使用較多)和使用非確定性機制的系統(Liveness,PoW 中使用較多)有什麼不同。但需要提醒的是,並非所有的PoS 都是Finality 路線,比如Casper FFG 就不是;而PoW 也不是只能走Liveness 路線,雖然並沒有人設計PoW 上的Finality 共識。
PoW 和PoS 的不同在於一個是Work,一個是Stake。之所以需要強調這一點,是因為在關於PoW 和PoS 的討論中,我們往往不是在討論Work 機制與Stake 機制的不同,而是在比較Finality 系統與Liveness 系統的不同。比如「無需許可」性,它基本是一個Finality 系統與Liveness 系統的話題,而不是Work 與Stake 的爭論點。
讓我們回到有12 個評審員的會議室。為了追求Finality,每個評審員都需要了解其他每一個人的想法,也需要把自己的想法告訴其他每一個人,因此通信複雜度會隨著評審員人數的增加而迅速遞增,整個系統將因此不可用,所以必須控制陪審員的數量。
那麼對於一個分佈式系統而言就是,只挑選少數節點進入會議室,由它們決定共識,而其他節點只接受共識。因此這種系統中有三種角色,領導者、追隨者和學習者,領導者和追隨者是會議室中的評審員,他們需要好好工作,不然可能導致系統無法達成共識。
這樣看來中本聰共識似乎更符合大家對分佈式系統的開放性的期望,但別忘了它之所以可以如此設計,是因為犧牲了Finality,它的輸出結果是一個概率上的最終結果。
試想,你百分百在星巴克得到一杯咖啡,但星巴克並不能百分百收到錢,這並不符合大多數人能理解的世界運轉規則。所以非確定性機制有它自己的短板,以及不適合的場景。
所以你看,設計分佈式系統就像與撒旦做交易,你得到一些,必然要交出一些。沒有最好的系統,只有適合解決某類問題的系統;沒有單純的指標比較,只有是在什麼設定下實現這種指標。
鏈聞注:
- How Does Distributed Consensus Work?
如果你理解了這一點,這篇文章的目的就達到了,而我們對分佈式系統的探索到此也就全部結束了。
- WHAT WE TALK ABOUT WHEN WE TALK ABOUT DISTRIBUTED SYSTEMS
鏈聞注:
六、更進一步
鏈聞注:
本文是受《How Does Distributed Consensus Work?》一文啟發寫成的,如果你想更進一步了解分佈式系統,推薦這篇文章,它從專業的角度介紹了分佈式共識;同時推薦《WHAT WE TALK ABOUT WHEN WE TALK ABOUT DISTRIBUTED SYSTEMS》,它系統地羅列出了分佈式系統的經典論文。
鏈聞注:
- 中文譯本《分佈式共識的工作原理》,by EthFans
分佈式系統的另一個關鍵問題是時序,所有的共識算法都需要解決它,但因為是另一條線索故本文未做涉及,如果你想了解,可以從萊斯利·蘭伯特博士(how old are you)的這篇論文開始:《Time, Clocks and the Ordering of Events in a Distributed System》。
如果你對在Finality 和Liveness 間尋找平衡感興趣,可以去研究Casper FFG 共識,它有Liveness 的一部分,也有Finality 的一部分。同時你也會發現Casper FFG 的PoS 與Tendermint 的PoS 的不同。
兩個定理:FLP 不可能原理;CAP 不可能定理。
參考資料:
兩種容錯能力:宕機容錯;拜占庭容錯。
2.《WHAT WE TALK ABOUT WHEN WE TALK ABOUT DISTRIBUTED SYSTEMS》,Alvaro Videla
3.《Time, Clocks and the Ordering of Events in a Distributed System》,Leslie Lamport
4.《The Byzantine Generals Problem》,LESLIE LAMPORT、ROBERT SHOSTAK、MARSHALL PEASE
5.《Paxos Made Simple》,Leslie Lamport
6.《Bitcoin: A Peer-to-Peer Electronic Cash System》,Satoshi Nakamoto