知識拓展:區塊鏈技術之共識演算法
大家好,我是牛牛!
相信大家對比特幣、NFT或多或少有所耳聞吧。比特幣、NFT的底層,其實都是 區塊鏈技術 。
在區塊鏈技術中,最核心的部分,就是 共識 。共識在私有環境、聯盟環境、公開環境下會有不同的挑戰與應對方式。
牛牛以前因為工作原因,就對私有環境下的共識演算法有了解。
近兩年區塊鏈崗位增多 了, 學習相關 的 知識,性 價比也 更高了,牛牛 就順勢研究了共識在各種場景下都是怎麼實現的,今天就來 給 大家 分 享一波。
讀完這篇文章,相信你可以對共識有個初步的瞭解。
0 1
共識是什麼?
望文生義,所謂共識,就是共同的認識,也就是達成一致。
開會表決出的結果是共識,領導的權威是共識,鑽石的價值是共識。更簡單直接一點,如果我們都認為貓咪很可愛,那麼在這件事情上,我們就達成共識。
可以說,人類的發展,就是在互相認可、達成共識中進行的。
從單機到叢集
從單機到叢集,通常有兩種原因:
1.效能不足。 單機處理的能力達到了上限,此時就需要多臺機器一起提供服務,這種情況下,每臺機器就相當於一個分片,各司其職,處理好自己的那部分。
2.可靠性不足。 單機存在風險和隱患,所以需要擴展出多個副本,一起協作,完成使命。這種情況下,多個節點之間,怎麼交流,資料怎麼保持一致,就是值得考慮的。
由於效能不足這部分更像分工合作,基本不涉及共識。所以 我們主要聚焦於可靠性,看看 如何通過共識,解決分片一致性問題 。
多副本共識
從一個分片到多個分片,就會涉及到資料的共識。我們設想一下,如果在現實中,兩個人的資訊要達成一致,有哪些手段呢?
最簡單的一種,就是信任,即我的資訊完全從你那裡得知,你說啥,我認可啥。平常我們的資料庫容災,就是這樣的。
再者就是協商,慣例是少數服從多數,可以用投票決定。
聽起來是不是很簡單,但實際做起來卻不容易。我們的生產環境中,可能會遇到一些很棘手的挑戰。
接下來,我們就來談談從 私有環境、聯盟環境 ,最後到 公有環境 , 由淺至深 ,會面臨哪些挑戰,應對的方法又是怎麼樣的。
挑戰一:系統異常
做後臺開發的都知道,異常是不可避免的,我們總會遇到系統出現網路、磁碟故障、伺服器宕機這類問題,這些都屬於Crash Fault,而我們需要做到的,就是Crash Fault Tolerance,即在故障情況下也能正常工作。
05
解決方案:Crash Fault Tolerance
經典的CFT演算法包括Paxos、Raft等,這類演算法效能較好、處理速度較快、可以容忍不超過一半的故障節點。
Paxos演算法 是Leslie Lamport於1990年提出的一種基於訊息傳遞且具有高度容錯特性的共識演算法。
它描述的是這樣一個場景:在一座叫Paxos的小島,議會決議島上的所有事務。 議會成員的數量是確定的,每個提案都需要超過 半數的議員同意才能生效 。
議員們通過 信使傳遞訊息來對 議案 進行表決。 但議員可能離開,信使可能走丟,甚至同一封信投遞好幾次 。
在這樣的條件下,我們要怎麼達成共識呢?
Paxos演算法將議員的角色分為 Proposers 、 Acceptors 和 Learners 。由proposers提出提案,通過一系列複雜的互動,最終得到共識。
這裡先不做贅述,大家只需要知道Paxos特點是晦澀複雜,難理解。
Raft演算法 則起源於2013年斯坦福Diego Ongaro和John Ousterhout的一篇論文。
他們覺得Paxos太難理解了,都不知道怎麼向學生講解,於是設計出了Raft這個既便於學生學習又容易上手實現的一致性演算法。
Raft的資料一致性等價於Multi Paxos ,可以用於取代Paxos,並且證明可 以提供與Paxos相同的容錯性以及效能 。
Raft演算法是基於日誌複製的,它將節點分為 Leader 、 Follower 、 Cadidate 三種,由Leader將請求寫入日誌,再通知到其它節點進行復制,以達到狀態的 最終一致, Cadidate 則是Follower進取成為Leader的中間狀態。
Raft協議設計的首要目標是易於理解,所以採用了分解法:Raft流程可分解為 選主、日誌複製、安全性和儲存回收 ,能為在計算機叢集之間部署有限狀態機提供一種通用方法,並確保叢集內的任意節點在某種狀態轉換上保持一致。
關於RAFT,我們目前只需要記住幾點:
1.它將複雜問題轉變為幾個簡單的問題;
2.採用日誌複製演算法;
3.簡單清晰。
挑戰二:害群之馬
解決了CFT問題,在相對安全的網路環境是可以高枕無憂了。注意,我們說的是 相對安全 ,比如平常在公司的內網環境中。
什麼時候不安全呢?
叢集由幾個組織下的不同機房管理,我們把這個環境稱為 聯盟環境 ,這時候就可能會有作惡節點出現。
這些作惡節點輕則會搗亂,不讓大家達成共識,重則釋出惡意的虛假資訊造成危害。
也就是說,如果群眾裡面有壞人,單純的CFT演算法就cover不住了。
這種需要考慮惡意節點的場景,就叫做 拜占庭問題 。
之前提到的RAFT和PAXOS,都不能解決拜占庭問題。
07
解決方案:Byzantine Fault Tolerance
針對拜占庭問題,我們就需要專門的拜占庭演算法。
有小夥伴肯定會問,為什麼叫拜占庭呢?
如果我告訴你拜占庭演算法最早也是由 Leslie Lamport解決的 ,那你一定已經明白了,沒錯,這其實跟Paxos一樣,都是 L esl ie Lamport 藉由一個著名的城市編造一個故事,給我們描述一類問題。
拜占庭故事是這樣的:拜占庭帝國的軍隊都駐紮在敵城外,相隔很遠,每個師都由各自的將軍指揮。 將軍們只能通過信使相互溝通。
在戰爭時期,他們必須制定一個共同的行動計劃,如進攻(Attack)或者撤退(Retreat),且只有當半數以上的將軍共同發起進攻時才能取得勝利。
然而, 其中一些將軍可能是叛徒,試圖阻止忠誠的將軍達成一致的行動計劃。更糟糕的是,負責訊息傳遞的信使也可能是叛徒,他們可能篡改或偽造訊息,也可能使訊息丟失。
這樣我們又怎麼樣才能達成一致,取得戰爭的勝利呢?
最知名也是最常見的解決方案是PBFT,即 實用拜占庭容錯演算法 ,這種演算法通過三階段的提交,以反覆進行階段確認的做法,可以保證在惡意節點不超過總數三分之一情況下,系統能良好正確的執行下去。
實用拜占庭演算法比起經典的拜占庭演算法,將效能從指數級降低到了多項式級,做了很大程度的優化,這才有了在生產中實踐的可能。
但是也有一些限制,比如需要節點認證,以及節點數量也不建議超過100。
這裡做個瞭解就好,也不過 多贅述了。
挑戰三:海量節點
實用拜占庭容錯演算法,節點通常是固定的,適用於聯盟場景 。但在公有場景下,節點需要能自由增加減少,比如比特幣。
同時出於效能考慮,BFT的節點通常建議不超過100個,而比特幣的節點遍佈全世界,多不勝數,顯然也是滿足不了的。
針對這種公鏈場景,又該如何達成共識呢?
09
解決方案:POW&POS
方法總比問題多,公鏈也有公鏈的共識演算法,最出名的就是POW和POS。
POW(工作量證明) 是比特幣系統採用的共識演算法。
比特幣的共識是通過10分鐘一輪的算力競賽實現的,競賽的勝利者,就獲得一次記賬的權力,並向其他節點同步新增賬本資訊。
當然,其它節點會做驗證,如果記賬節點有任何的作弊行為,都會導致網路的節點驗證不通過,直接丟棄其打包的區塊,這個區塊就無法記錄到總賬本中,作弊的節點耗費的成本就白費了。
由於有這樣巨大的挖礦成本,使得礦工自覺自願地遵守比特幣系統的共識協議,也就確保了整個系統的安全。
說白了,工作量證明是代價驅動。我都付出了這麼大的代價了,如果不能收穫獎勵,則損失巨大,所以我也就沒有了作弊的動機。比特幣最牛逼的地方,就是採取了經濟手段,實現共識。
POS(權益證明) 則走向了另一條路:記賬權取決於積分,積分由幣量和幣齡綜合決定。簡單來說,你擁有的幣越多,幣齡越長,就有越大的概率獲得記賬權。
POS的優點在於礦工不需要去拼算力,因而不會浪費太多算力,效能也高一些。
缺點在於擁有代幣的大戶可以坐享其成,而且所有參與者可以持幣拿利息。賣幣的人也會少了,大家想著存著幣拿利息,也不利於流動性。並且容易產生馬太效應,讓富人越富,窮人越窮,相對來說,POS沒有POW公平。
除了POW、POS,公鏈上還有DPOS、POA、POL等演算法,感興趣的小夥伴可以去了解一下。
總結
共識是分散式領域極具魅力的一個話題,也是區塊鏈的核心內容。
本次給大家介紹了私有環境的Raft、Paxos演算法,聯盟環境的PBFT演算法,以及公鏈情況下的POW、POS演算法。
後續牛牛也會選擇其中比較有代表性的演算法,單獨寫文章進行詳細分析。
點選下方連結檢視往期精彩文章
END
關注公眾號,免費領取學習資料
你好,我是牛牛,普通二本畢業。
本科進騰訊,去過外企,肝過頭條。
目前回騰訊擔任高階工程師。
想來騰訊的朋友,可以找我 內推 哦!
點個“贊”和“在看”鼓勵一下嘛~
- 深入淺出 Zookeeper 中的 ZAB 協議
- 高仿 “ 微信 ”,太拽了吧!
- Raft 協議原理詳解,10 分鐘帶你掌握!
- MySQL為什麼莫名其妙的斷開連線以及解決方案!
- 10個解放雙手的 IDEA 外掛,這些程式碼真不用手寫!
- 乾貨:21 張思維導圖,檸檬哥肝了半個月的「後端技術學習路線」長啥樣?
- 如何實現一個任務排程系統
- Spring Boot 大屏展示,私活專案,已開源,接私活必備,真香!
- 一文搞懂二分查詢演算法!
- 晉升技術專家了
- MySQL經典36問!
- 貪心演算法,一文搞懂
- 好朋友晉升阿里P7!
- 推薦一份硬核有趣的網路學習資料!再也不用擔心被面試官摩擦
- Spring迴圈依賴還能這麼理解……
- ZooKeeper核心知識總結!
- 知識拓展:區塊鏈技術之共識演算法
- 美團二面:如何解決 bin log 與 redo log 的一致性問題
- 朋友去谷歌面試,竟讓扔雞蛋?
- 分散式系列第一彈:分散式一致性!