百花村旁有一座山叫區塊鏈山,屬村民集體所有。村外的A公司準備開發區塊鏈山的旅游資源。A公司和村民委員會聯合成立了百花旅游開發有限公司,簽了股份制合作協議。以下是春節假期期間發生在村民李大和柳五之間的對話:
李大:關于旅游開發區塊鏈山,村民委員會和A公司簽約了。
柳五:那我們有什么好處?
李大:我們都是區塊鏈旅游有限公司的股東了。
柳五:股東要干什么工作呢?
李大:關于區塊鏈的開發的重要決定,股東都要投票的。
柳五:那可不成。春節后我要出去打工,在哪兒還不一定呢。哪有時間回來投票。
李大:不要緊,我們可以推選幾個代表,比如王老師,他會一直留在村辦小學教書,不會走的,而且人又可靠,講信用。
柳五:我也推選王老師,代表我們在重大決議上投票。......
在以上對話中,暗含了一種共識,在區塊鏈世界,我們叫它委托權益人證明機制。搞懂共識機制很重要,因為它解決了區塊鏈如何在分布式場景下達成一致性的問題,是保障區塊鏈系統不斷運行下去的關鍵。
從PBFT到PoW,到PoS,再到DPoS,它們分別代表了怎么樣的運作機制?分別適用于什么樣的應用場景?都有什么優缺點?這篇文章通通告訴你。
本篇文章較長,主要包含以下8點關鍵內容,建議收藏!
1、分布式系統的一致性
2、Paxos算法
3、Raft算法
4、PBFT算法
5、工作量證明——PoW
6、股權權益證明——PoS
7、委托權益人證明——DPoS
8、共識算法的社會學探討
分布式系統的一致性
所謂一致性,就是指數據要完整、要同步。
比如,我們在網上下了個訂單,付了款,商城系統會記錄下這些數據,之后無論我們在哪里訪問自己的訂單,都能看到同樣的結果,即便商城系統出了故障,那一般也會返回一個錯誤提示而不是給我們一個不一樣的結果。
再比如銀行,我們存了一筆錢進去,無論到哪里,我們查詢銀行賬戶的時候金額也不會變。也就是說,在這些系統中,數據的結果總是一致而同步的,即便這些系統的服務器不止一臺,但都屬于同一個中心集群,在內部是可以高效一致同步的。
區塊鏈系統本質就是一個分布式應用軟件。分布式系統的首要問題就是如何解決一致性的問題,也就是如何在多個獨立的節點之間達成共識。要注意的是,這里說的是要達成一致,而沒有說保證一定要結果正確,比如所有的節點都達成失敗狀態也是一種一致,說白了就是要成為一致行動人。如果是中心化的場景,達成一致幾乎沒有任何問題,但分布式環境并不是那么理想的,比如節點之間的通信可能是不可靠的、會有延遲、會有故障,甚至節點直接宕機。
而在無數個節點之間,如果采用同步的方式來調用,那等于失去了分布式的優點,因為絕對理想的一致性,代價通常是很大的。這樣一個模型,通常要求不發生任何故障,所有節點之間的通信沒有任何時差,這幾乎就等于是一臺計算機了,這樣的強一致性往往意味著性能較弱。
歷史經驗表明,多路處理器和分布式系統中的一致性問題是非常難以解決的。難點在于以下幾個方面。
分布式系統本身可能出故障。
分布式系統之間的通信可能有故障,或者有巨大的延遲。
分布式系統運行的速度可能大不相同,有的系統運行很快,而有些則很慢。
但是,一致性是設計分布式系統時必須考慮的問題。一致性問題歷史悠久,而且臭名昭著。傳統處理一致性問題的方法有兩段式提交、令牌環、時間戳等,計算機專業的讀者應該有所耳聞。本文將集中討論與區塊鏈相關的一致性問題和算法。
1、一致性問題
我們用狀態機來解釋一致性的問題。所謂狀態機是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型,狀態可以特指某個系統在某一時刻的數據變量,它具備以下幾個特點:
狀態總數是有限的;
任一時刻,只處在一種狀態中;
某種條件下,會從一種狀態轉變到另一種狀態。
比如進銷存系統中某一個時刻的庫存狀態,銀行系統某一時刻的賬戶狀態等,對于分布式系統來說,就是指每個節點擁有的數據狀態。假設我們有n臺機器,位于不同位置的機器之間通過網絡協同工作,所有機器的初始狀態是一模一樣的。給它們一組相同的指令,我們希望看到相同的輸出結果,而且希望看到狀態的變化也是一樣的。比如機器甲的狀態是從狀態A到B再到C,而如果機器乙的狀態是由A直接到C,這種情況就是不一致的。
總而言之,一致性要求分布式系統中每個節點產生同樣的結果或者具備同樣的狀態,看起來就好像是一臺機器一樣,前提是沒有一個中心服務器作為調度員,這對于分布在互聯網上、不在同一個機房內、不屬于同一個管理者的分布式系統來說,難度是很大的。出于系統的可用性考慮,對于分布式系統來說,我們一般希望具備以下能力。
Optimism Collective將進行第四季社區治理實驗,引入“集體意圖”等新概念:5月17日消息,以太坊二層解決方案Optimism發推文稱,Optimism Collective正在通過實驗建立社區治理,Optimism Collective正在通過實驗建立社區治理。在第4季中,Collective將進行幾項關鍵實驗,旨在增加社區對Optimism逐步去中心化的參與。該季度實驗引入了一些新概念:集體意圖、使命與聯盟、集體信任等級。[2023/5/17 15:07:38]
分布式系統作為一個邏輯整體,不應該返回錯誤的結果。
只要系統里的大部分機器工作正常,整個分布式系統就能有效運行,這也是分布式系統應用的一個優點,抵抗單點故障。
系統的性能是可以橫向擴展的,對于分布式系統來說,木桶原理不起作用。
分布式系統必須是異步的,也就是說每個節點可以按照自己的時序獨立工作,沒有全序的時間順序。
要達到這些要求,可是不容易呢!從生活中我們也可以發現,即便有統一的命令指揮,尚且不一定能完全做到整齊劃一,何況是沒有這么一個指揮員呢!在互聯網的場景中,任意一個節點的狀態,我們都是沒法去強力管控的,比如比特幣節點,誰能控制網絡中的那些節點呢!可能就是關閉了、斷網了,甚至是一個惡意偽裝的節點。一切看起來似乎無解。
然而實際上,很多時候我們對一致性的要求并沒有那么迫切,在一定的約束下,可以實現所謂的最終一致性,也就是說在某個時刻系統達到了一致的狀態。這個節點現在斷網了,沒問題,等恢復后跟上,通過其他節點來同步自己的數據;那個節點宕機了,也沒問題,恢復后跟上。只要整個網絡中絕大部分的節點都是正常工作的,整個系統總能在未來的某一個時刻達成數據狀態的一致。
2、兩個原理:FLP與CAP
FLP定理
叫FLP是因為提出該定理的論文是由Fischer、Lynch和Patterson三位作者在1985年發表的,取了各自名字的首字母作為定理名稱。
看下定義:在網絡可靠、存在節點失效的最小化異步模型系統中,不存在一個可以解決一致性問題的確定性算法。在這個原理的前提下,也告訴人們:不要浪費時間去為異步分布式系統設計在任意場景下都能實現共識的算法,在允許節點失效的情況下,純粹異步系統無法確保一致性在有限時間內完成。
這個其實也很好理解,比如三個人在不同房間回答問題,雖然三個人彼此之間是可以通過電話溝通的,但是經常會有人時不時地開小差,比如Alice和Bob都回答了某個問題,Lily收到了兩者的回答結果,然后玩游戲去了,忘了回復,則三個人永遠無法在有限時間內獲得最終一致的答復。這個定理在理論上證明了此路不通,也就節省了后來者的研究時間。
CAP定理
CAP定理最早是由EricBrewer在2000年ACM組織的一個研討會上提出猜想,后來Lynch等人進行了證明。我們還是先來看下定義:分布式計算系統不可能同時確保一致性、可用性和分區容錯性,這三者不可兼得。通過定義我們可以知道,這是一個典型的不可能三角。那么這三個術語具體是什么意思呢?含義如下。
一致性:所有節點在同一時刻能夠看到同樣的數據,即“強一致性”。
可用性:確保每個請求都可以收到確定其是否成功的響應,并且是在有限的時間內。
分區容錯性:因為網絡故障導致的系統分區不影響系統正常運行,比如1號模塊和2號模塊不能使用了,但是3號和4號依然能提供服務。
直覺上的論證很簡單:如果網絡分成了兩半,我在一半的網絡中給A發送了10個幣,在另外一半的網絡中給B發送了10個幣,那么要么系統不可用,因為其中一筆交易或者全部兩筆都不會被處理,要么系統會變得沒有一致性,因為一半的網絡會完成第一筆交易,而另外一半網絡會完成第二筆交易。
既然不能同時滿足,那么如果弱化對某個特性的支持呢?
弱化一致性
比如軟件升級新版本后,過一段時間其他人才更新成功;再如網站更新內容后,瀏覽器也是刷新后才顯示更新內容。很多時候對于實時的強一致性并沒有很高的要求,生活中也有這樣的例子:如果事情不那么緊急,就會發個短消息或者發個郵件,等對方看到了再處理;如果緊急的話,就直接打電話,所以說電話是一種強連接方式,不過很多朋友肯定不喜歡時不時地就有電話打進來吧。
弱化可用性
有些場合對一致性非常敏感,比如銀行取款機,一旦系統故障就會拒絕服務,再如飛機上的控制系統,這個時候如果不能實時處理,那可是要命的。對計算機使用比較熟悉的朋友都知道,很多服務器操作系統都是不帶圖形界面的,只能靠命令行來處理,因為服務器要提高性能,保持可靠,會盡量避免加載不必要的模塊,這也是一個犧牲可用性的例子。
弱化分區容錯性
對于分布式系統來說,分區容錯是必然的,幸運的是這種情況出現的概率并不是很大。如果真的是大規模的服務不可用,那無論是什么樣的系統都是不能正常工作的。
Revert Finance“v3utils”合約被攻擊,90% 資產損失來自于單個賬戶:金色財經報道,AMM 流動性管理協議 Revert Finance 發推稱,“v3utils”合約被攻擊,其中有 90% 資金是從單個賬戶中盜取,被盜竊資產包括:22983.235188 枚 USDC、4106.316699 枚 USDT、485.5786287699002 枚 OP、0.18217977664322793 枚 WETH、36.59093198260223 枚 DAI、211.21463945524238 枚 WMATIC 與 22 枚 Premia。
大部分對該合約的授權已被取消,并對剩余易被攻擊資金進行白帽處理,但有一些沒有余額的地址仍被攻擊合約進行授權。Revert 提醒這些地址取消授權。接下來幾天團隊將發布關于此次攻擊事件的完整報告,并為被攻擊用戶進行賠償。[2023/2/20 12:17:03]
計算機系統的設計,有時候跟生活中的場景是很類似的,你不得不做出一些妥協以便保證自己最想要得到的結果。區塊鏈系統中,尤其是公有鏈系統,使用各種共識算法,優先的目的就是要保證整個系統的容錯能力,這也是設計為分布式或者去中心結構的目的之一。
3、拜占庭將軍問題
拜占庭將軍問題的經典描述是:
拜占庭的軍隊是由小分隊組成的,每個小分隊由一個將軍指揮,將軍們通過傳令兵來策劃一系列的行動。有些將軍是叛徒,他們會有意地妨礙忠誠的將軍達成一致的計劃。這個問題的目標是使忠誠的將軍達成一致的計劃,即使背叛的將軍一直在誘使他們采用糟糕的計劃。
已經證明,如果背叛的將軍超過了將軍總數的1/3,達成上述目標是不可能的。特別要注意的是,要把拜占庭將軍問題和兩軍問題區分開。兩軍問題的模型要比拜占庭將軍問題簡單,并且設立的前提場景也有差別,我們來看一幅示意圖:
如上圖所示,在此問題模型中,假設有兩支對抗的軍隊,這也就是所謂的兩軍。A軍被B軍隔開為兩個部分,分別是左A軍和右A軍。從戰斗力來說,A軍的兩個部分必須同時合力進攻才能打敗B軍,這就要求A軍的左右兩支分隊必須要協商好進攻時間和一些進攻的其他約定,協商就意味著要通信,通過兩邊的互相通信來保持進攻指令的一致性。
那么問題來了,左右兩邊的A軍要互相通信,就必須經過B軍的區域,這就很難保證通信是暢通的,兩邊必須要不斷發送回執來確認對方是否收到了消息,很顯然,從理論上來講,任何一次的回執都沒法真正確認雙方的消息接收是一致的。
比如左A軍發送了消息給右A軍,右A軍接收到了并且發送了確認回執給左A軍,可是確認回執被B軍阻截了,此時左A軍無法知道右A軍到底收到消息沒有,即便右A軍的回執成功到達了左A軍,可是若沒有左A軍的回執,右A軍同樣無法確認左A軍到底收到回執沒有。按照這種確認模式,只要有B軍的阻截存在,左右兩邊A軍就沒法在理論上保證總是能達成一致的消息確認。
我們可以看到,兩軍問題的關鍵點在于:兩點之間的信道傳輸不可靠。我們日常使用的大多數網絡通信軟件其實都會面臨這樣的問題,通信過程發生在互聯網,誰也沒法保證中間經過的“B軍”是可靠的,一般也只能通過有限次數的雙方回執來確認消息的到達,這也是一個不得已的折中方案。
值得注意的是,在這個問題模型中,并沒有去假設中間是否存在故意破壞者,也就是在兩軍的通信過程中,不考慮某一方可能叛變的情況。回到拜占庭將軍問題,其考慮的主要問題在于通信的各方存在故意破壞者或叛徒的情況下,大家如何來保持正確的一致性的問題。
拜占庭將軍問題的復雜性,可以用計算機容錯學里的概念來表述。
拜占庭容錯:這是最難處理的情況,指的是有一個節點壓根就不按照程序邏輯執行,對它的調用會返回隨意或者混亂的結果。要解決拜占庭式故障需要有同步網絡,并且故障節點必須小于1/3,通常只有某些特定領域才會考慮這種情況,通過高冗余來消除故障。
崩潰容錯:它比拜占庭容錯多了一個限制,那就是節點總是按照程序邏輯執行,結果是正確的,但是不保證消息返回的時間。不能及時返回消息的原因可能是節點崩潰后重啟了、網絡中斷了、異步網絡中的高延遲等。
遺漏容錯:它比崩潰容錯多了一個限制,就是一定要“非健忘”。非健忘是指這個節點崩潰之前能把狀態完整地保存在持久存儲上,啟動之后可以再次按照以前的狀態繼續執行和通信。比如最基本版本的Paxos,它要求節點必須把投票的號碼記錄到持久存儲中,一旦崩潰,修復之后必須繼續記住之前的投票號碼。
崩潰停止容錯:它比遺漏容錯多了一個故障發生后要停止響應的要求。簡單講,一旦發生故障,這個節點就不會再和其他節點有任何交互,就像它的名字描述的那樣,崩潰并且停止。
4、共識算法的目的
在有錯誤的進程存在并且有可能出現網絡分區的情況下,FLP定理堵死了我們在傳統計算機算法體系下提出解決方案的可能性。計算機科學家就想,如果我們把FLP定理的設定放松一點,問題是否有解呢?
由社會學和博弈論中得到啟發,科學家嘗試引入了以下機制。
BTC -arh999囤幣指數已進入定投區間,當前為0.5249:1月22日消息,BTC-ahr999囤幣指數走高至 0.5249,為去年6月14日以來新高,目前已進入定投區間,基于該指數進行投資的參考者請留意區間變化。
注:①<0.45時,為抄底區間;②0.45~1.2時,為定投區間;③ 1.2~5時,為等待起飛區間;④ >5時,未必是良好的
定投時機。[2023/1/22 11:25:58]
激勵機制。比如,在拜占庭將軍問題中給忠誠的將軍以獎勵。當背叛的將軍發現背叛行為沒有任何收益的時候,他們還有背叛的動機嗎?這里引進了博弈論的概念:我們不再把節點或者說將軍分成公正/惡意兩方,認為每一個節點的行為是由激勵機制決定的。正如兩千年前中國諸子百家熱烈爭論的話題:人之初,性本善焉,性本惡焉?我們認為,人之初,性無善無惡。性的善惡由后天的激勵機制決定。如果激勵機制設置得當,考慮到每個節點都有最大化自己利益的傾向,大部分的節點都會遵守規則,成為公正的節點。
隨機性。在拜占庭將軍問題中,決定下一步行動需要將軍們協調一致,確定統一的下一步計劃。在存在背叛將軍的條件下,忠誠的將軍的判斷可能被誤導。在傳統的中心化系統中,由權威性大的將軍做決定。在去中心化的系統中,研究者提出一種設想:是否能在所有的將軍中,隨機地指定一名將軍作決定呢?這個有點異想天開的設想為解決拜占庭將軍問題打開了一扇門。
根據什么規則指定做決定的將軍呢?對應到金融系統里,就是如何決定誰有記賬權。
根據每個節點的計算力來決定。誰的計算力強,解開某個謎題,就可以獲得記賬權。這是比特幣里用的PoW共識協議。
根據每個節點具有的資源來決定。所用到的資源不能被壟斷,誰投入的資源多,誰就可以獲得記賬權。這是PoS共識協議。
出于上面的考慮,科學家引入共識算法,試圖解決拜占庭將軍問題。分布式共識協議具有以下兩點屬性:
如果所有公正節點達成共識,共識過程終止;
最后達成的共識必須是公正的。
下面我們來談談共識算法的適用范圍。區塊鏈的組織方式一般有以下3種。
私有鏈:封閉生態的存儲網絡,所有節點都是可信任的,如某大型集團內部的多數公司。
聯盟鏈:半封閉生態的交易網絡,存在對等的不信任節點,如行業內部公司A、B、C。
公有鏈:開放生態的交易網絡,即所有人都可以參與交易,沒有任何限制和資格審核。
由于私有鏈是封閉生態的存儲網絡,因此使用傳統分布式一致性模型應該是最優的;由于聯盟行業鏈的半封閉、半開放特性,使用DelegatedProofof×××是最優的;對于公有鏈,PoW應該是最優的選擇。
常見共識算法一覽表:
Paxos算法
首先,Paxos算法解決的是非拜占庭將軍問題,也就是說僅僅是指分布式系統中的節點存在故障,但是不存在惡意節點的場景,在這種情況下如何達成共識。
1998年Lamport提出Paxos算法,后續又增添多個改進版本的Paxos,形成Paxos協議家族。Paxos協議家族有一個共同的特點就是不易于工程實現,Google的分布式鎖系統Chubby作為Paxos實現曾經遭遇到很多坑。
除了經典Paxos,以下均為Paxos的變種,基于CAP定律,側重了不同方向。
CheapPaxos
EgalitarianPaxos
FastPaxos
Multi-Paxos
ByzanetinePaxos
Paxos算法實在是太晦澀難懂,上面所列的Paxos算法分支就不詳細介紹了。如果要想了解一下經典Paxos算法的最初描述,可以去看一下Lamport的論文《PaxosMadeSimple》,在這個算法模型中,使用到了如下的角色:
看到這些角色,有沒有覺得很像現代的議會制度。Paxos正是這樣的一個模型,當然在計算機中這些所謂的“人”一般就是指節點,這些角色可以是不同的服務節點也可以是同一個服務節點兼任。提案發出后,就要爭取大多數的投票支持,當超過一半支持的時候,發送一半結果給所有人進行確認,也就是說Paxos能保證在超過一半的正常節點存在時,系統達成共識。提案過程還可以劃分不同的場景,如下所示:
單個提案者多個接收者:這種情況下,一致性容易達成,或者說肯定能達成,因為只有一個提案,要么達成,要么否決或者失敗。但是這種情況下,這個唯一的提案者如果出故障,則整個系統就失效了。
多個提案者單個接收者:這種情況下也容易達成共識,對于接收者,選擇一個作為決議即可,當然這種情況也屬于單點故障結構。
多個提案者多個接收者
多對多這種情況,首先是避免了單點故障,但是問題也變得復雜了,既然提案和接收者都有多個,那以哪個為準呢?并沒有特別玄妙的辦法,既然多個在一起不好解決,那還是得回到單個提案者上去,只不過增加個規則選出那么一個單個提案者來,大致可以有如下的兩個方案:
過去6個月從交易所撤出的價值100億美元的穩定幣:金色財經報道,在過去六個月中,價值近100億美元的穩定幣從交易所撤出,其中70%的撤出是由于BUSD的拋售。交易所的穩定幣余額在其峰值時價值接近45億美元。STBL是交易所地址上持有的硬幣總量,是一種虛擬資產,它匯總了Glassnode上支持的所有ERC20穩定幣的數據。包括的穩定幣有BUSD、GUSD、HSUD、DAI、USDP、EURS、SAI、sUSD、USDT和USDC。[2023/1/20 11:22:12]
與第一種情況靠近,也就是想個辦法選出一個提案者出來,約定在某一個時間段內,只允許一個提案通過,可以設置一些競爭規則或者按照一個時間序列的排列選擇,總之最后會選出一個提案者。
與第二種情況靠近,允許有多個提案者,但是當節點收到多份提案后,通過某個規則選出一份提案,也就是仍然保持只接收一份,規則可以有各種,比如根據提案序號排列或者根據提案時間等。
實際上,在網絡中,類似比特幣這種,必然是屬于多對多的這種情況,發送轉賬交易的節點不止一個,礦工不止一個,接收區塊進行驗證的節點當然也不止一個,Paxos中為了解決這樣的問題,引入了稱為“兩階段提交”的方案。
所謂兩階段,就是“準備”和“提交”兩個階段:準備階段解決大家對哪個提案進行投票的問題,提交階段解決確認最終值的問題。上述這個過程中,可能會一直有新的提案出現,因此類似于比特幣一樣,分隔一下時間,比如每隔10分鐘打包一次,而打包者只能有一個。
在提交階段,如果一個提案者在準備階段接收到大多數節點的回復,則會發出確認消息,如果再次收到大多數的回復,則保持原先的提案編號和內容;如果收到的消息中有更新的提案,則替換為更新的提案內容;如果沒有收到大多數的回復,則再次發出請求,等待其他節點的回復確認。當接收者發現提案號與自己目前保留的一致,則對提案進行確認。
就個人的理解,這種做法如果是在一個相對私有的環境中或者網絡環境比較好的情況下,效果會比較明顯,實際上,所謂的收到大多數的回應,這也是節點自身的一個評估,因為節點并沒有更好的辦法去判斷,到底算不算是大多數了,尤其是節點總數還不固定的情況下。
Raft算法
由于Paxos太難懂、太難以實現,Raft算法應運而生。其目的是在可靠性不輸于Paxos的情況下,盡可能簡單易懂。斯坦福大學的DiegoOngaro和JohnOusterhout以易理解為目標,重新設計了一個分布式一致性算法Raft,并于2013年底公開發布。Raft既明確定義了算法中每個環節的細節,也考慮到了整個算法的簡單性與完整性。
與Paxos相比,Raft更適合用來學習以及做工程實現。下面,筆者將以通俗易懂的方式來描述這個過程。
百花村村長一人負責對外事務。比如,縣和鄉兩級的公文來往,公糧征收,工務攤派,稅收等。
Raft是一個強Leader的共識協議。我們想象百花村是一個服務器集群,而這個集群的Leader就是村長,村里的每戶人家對應一個服務器,每戶人家都保存了一個數據副本。所有的數據副本都必須保證一致性。即上級官員下到村里視察時,從每戶人家獲得的信息應該是一樣的。
百花村村長通過村戶選舉產生。誰得的票數多誰就當選村長。村長有任期概念。任期是一直向上增長的:1,2,3,?,n,n1,?。
這里要處理的是平票的情況。在平票的情況下,該村村長選舉失敗,每戶人家被分配不同的睡眠值。在睡眠期間的村戶不能發起選舉,但是可以投票。而且只有選舉權,但是沒有被選舉權。第一個走出睡眠期的村戶發起新任期的選舉。
由于每戶人家有不同長度的睡眠期,這保證了選舉一定會選出一個村長,而不會僵持不下,不會出現每次選舉都平票的情況。一旦村長產生,任何針對百花村的“寫”必須經過村長。
村長每天都要在村里轉一圈,讓所有人都看見。表明村長身體健康,足以處理公務。
村長選舉出來后,要防止村長發生“故障”,必須定期檢測村長是否失效。一旦發現村長發生“故障”,就要重新選舉。
村長接收到上級命令,該命令數據處于未提交狀態,接著村長會并發向所有村戶發送命令,復制數據并等待接收響應,確保至少超過半數村戶接收到數據后再向上級確認數據已接收。一旦向上級發出數據接收Ack響應后,表明此時數據狀態進入“已提交”,村長再向村戶發通知告知該數據狀態已提交。
下面我們來測試各種異常情況。
異常情況1:上級命令到達前,村長掛了。這個很簡單,重新選舉村長。上級命令以及來自外面的請求會自動過時失效,他們會重發命令和請求。
異常情況2:村長接到上級命令,還沒有來得及傳達到各村戶就掛了。這個和異常情況1類似,重新選舉村長。上級命令以及來自外面的請求會自動過時失效。他們會重發命令和請求。
異常情況3:村長接到上級命令,已傳達到各村戶,但是各村戶尚未執行命令,村長就掛了。這種異常情況下,重新選舉村長。新村長選出后,由于已收到命令,就可以等待各村戶執行命令。上級命令以及來自外面的請求會自動過時失效。有可能,他們會重發命令和請求。Raft要求外部的請求可以自動去除重復。
在過去30天內,中心化交易所增加了48780枚BTC:金色財經報道,Watcher.Guru發推稱,在過去30天內,中心化交易所增加了48780枚BTC,約11.1億美元。[2022/8/4 12:02:25]
異常情況4:村長接到上級命令,已傳達到各村戶,各村戶執行了命令,但是村長并沒有收到通知,就在這時候村長掛了。這種情況類似上一種情況,新村長選出后,即可等待通知,完成剩下的任務。外部也會接到通知命令。
異常情況5:在命令執行過程中,村長身體不適,不能處理公務。因為百花村沒有收到村長的“心跳”,百花村的村戶就會自動選舉任村長。這個時候就出現2個村長。這個時候新村長就會接過老村長角色,繼續執行命令。即使原村長身體康復,也將成為普通村戶。
PBFT算法
1999年Castro和Liskov提出的PBFT是第一個得到廣泛應用的BFT算法。在PBFT算法中,至多可以容忍不超過系統全部節點數量的1/3的拜占庭節點“背叛”,即如果有超過2/3的節點正常,整個系統就可以正常工作。早期的拜占庭容錯算法或者基于同步系統的假設,或者由于性能太低而不能在實際系統中運作。
PBFT算法解決了原始拜占庭容錯算法效率不高的問題,將算法復雜度由指數級降低到多項式級,使得拜占庭容錯算法在實際系統應用中變得可行。也許就是出于效率的考慮,央行推出的區塊鏈數字票據交易平臺用的就是優化后的PBFT算法。騰訊的區塊鏈用的也是PBFT。
在PBFT算法中,每個副本有3個狀態:pre-prepare、prepared和commited。消息也有3種:pre-prepare、prepare和committed。收到pre-prepare消息并且接受就進入prepared狀態。收到commit消息并且接受就進入Committed狀態。下面以一個有4個節點/拷貝的例子說明,這個網絡內,僅允許1個拜占庭節點。
百花村小學舉行百米賽跑比賽,3年級第一組的選手只有4個人:Alice、Bob、Cathy和David。為了節省錢,比賽并沒有請裁判,而是在4個選手中隨機挑出一個做裁判,假設是Alice。眾所周知,百米跑的口令是:“各就各位,預備,跑!”
這里“各就各位”就是pre-prepare消息,選手接受了命令就會腳踩進助跑器,而這一動作被其他選手看到,就會認為該選手進入了prepared狀態。相當于發了一個prepare消息給其他選手。同理,預備就是prepare消息,選手接受了就是雙手撐起,身子呈弓形,而這一動作被其他選手看到,就會認為該選手進入了committed狀態。
假設A是公正的。Alice得到老師示意,3年級第一組準備比賽。Alice就喊:“各就各位!”老師的示意相當于一個外部消息請求。Alice收到這個消息,給消息編一個號,比如編為030101號。必須編號,因為比賽有一個規則,連續4次起跑失敗,整個組都被淘汰。B、C、D同學收到口令后,如果認為命令無誤,便都把腳踩進助跑器。
而這一個動作又相當于互相廣播了一個prepare消息。A、B、C、D選手互相看到對方的動作,如果確認多于f個人的狀態和自己應有的狀態相同,則認為大家進入prepared狀態。選手會將自己收到的pre-prepare和發送的prepare信息記錄下來。
假設A是公正的。Alice看到至少2個人進入prepare狀態,Alice就接著喊:“預備,跑!”。
接下來發生的事類似上一步:B、C、D同學收到口令后,如果認為命令無誤,便都雙手撐起,身子呈弓形。而這一個動作又相當于互相廣播了一個commit消息。
A、B、C、D選手互相看到對方的動作,如果確認多于f個人的狀態和自己應有的狀態相同,則認為大家進入committed狀態。當大家都確認進入Committed狀態后,就可以起跑了!
假設A是不公正的。A就會被換掉,重新選一個選手B發令。這時候,由于所有選手都記錄了自己的狀態和接受/發送的信息。那些換掉前已經是Committed狀態的選手,開始廣播commit消息,如果確認多于f個人的狀態和自己應有的狀態相同,則認為大家進入committed狀態。而對于換掉前是prepared和pre-prepare狀態的選手,則完全作廢以前的命令和狀態,重新開始。
PBFT算法主要有以下3個優點:
PBFT算法共識各節點由業務的參與方或者監管方組成,安全性與穩定性由業務相關方保證。
共識的時延大約在2?5秒,基本達到商用實時處理的要求。
共識效率高,可滿足高頻交易量的需求。
因為非常適合聯盟鏈的應用場景,PBFT及其改進算法因此成為目前使用最多的聯盟鏈共識算法。改進主要集中在:
修改底層網絡拓撲的要求,使用P2P網絡;
可以動態地調整節點數量;
減少協議使用的消息數量等。
不過PBFT仍然是依靠法定多數,一個節點一票,少數服從多數的方式,實現了拜占庭容錯。對于聯盟鏈而言,這個前提沒問題,甚至是優點所在。但是在公有鏈中,就有很大的問題。
工作量證明PoW
工作量證明機制隨著比特幣的流行而廣為人知。PoW協議簡述如下:
向所有的節點廣播新的交易;
每個節點把收到的交易放進塊中;
在每一輪中,一個被隨機選中的節點廣播它所保有的塊;
其他節點在驗證塊中的所有的交易正確無誤后接受該區塊;
其他節點將該區塊的哈希值放入下一個它們創建的區塊中,表示它們承認這個區塊的正確性。
節點們總是認為最長的鏈為合法的鏈,并努力去擴大這條鏈。如果兩個節點同時廣播各自挖出的區塊,其他節點以自己最先收到的區塊為準開始挖礦,但同時會保留另一個區塊。所以就會出現一些節點先收到A的區塊并在其上開始挖礦,同時保留著B的區塊以防止B的區塊所在的分支日后成為較長的分支。直到其中某個分支在下一個工作量證明中變得更長,之前那些在另一條分支上工作的節點就會轉向這條更長的鏈。
平均每10分鐘有一個節點找到一個區塊。如果兩個節點在同一個時間找到區塊,那么網絡將根據后續節點的決定來確定以哪個區塊構建總賬。從統計學角度講,一筆交易在6個區塊后被認為是明確確認且不可逆的。然而,核心開發者認為,需要120個區塊,才能充分保護網絡不受來自潛在更長的、已將新產生的幣花掉的區塊鏈的威脅。
生物學上有一個原理叫作“不利原理”,該原理可以幫助我們解釋工作量證明的過程。這個原理說,當兩只動物有合作的動機時,它們必須很有說服力地向對方表達善意。為了打消對方的疑慮,它們向對方表達友好時必須附上自己的代價,使得自己背叛對方時不得不付出昂貴的代價。換句話說,表達方式本身必須是對自己不利的。
定義可能很拗口,但是這是在歷史上經常發生的事:在中國歷史上,國家和國家之間簽訂盟約,為了表示自己對盟約的誠意,經常會互質。即互相送一個兒子去對方國家做人質。在這種情況下,為取得信任而付出的代價就是君主和兒子的親情,以及十幾年的養育。
比特幣的工作量證明很好地利用了不利原理解決了一個自己網絡里的社會問題:產生一個新區塊是建立在耗時耗力的巨大代價上的,所以當新區塊誕生后,某個礦工要么忽視它,繼續自己的新區塊尋找,要么接受它,在該區塊之后繼續自己的區塊的挖礦。顯然前者是不明智的,因為在比特幣網絡里,以最長鏈為合法鏈,這個礦工選擇忽視而另起爐灶,就不得不說服足夠多的礦工沿著他的路線走。
要是他選擇接受,不僅不會付出額外的辛苦,而且照樣可以繼續自己的更新區塊的挖礦,不會再出現你走你的我走我的,是一個全網良性建設。比特幣通過不利原理約束了節點行為,十分偉大,因為這種哲學可以用到如今互聯網建設的好多方面,比如防垃圾郵件、防DDoS攻擊。
PoW共識協議的優點是完全去中心化,節點自由進出。但是依賴機器進行數學運算來獲取記賬權,資源的消耗相比其他共識機制高,可監管性弱,同時每次達成共識需要全網共同參與運算,性能效率比較低,容錯性方面允許全網50%節點出錯。
目前比特幣已經吸引全球大部分的算力,其他再用PoW共識機制的區塊鏈應用很難獲得相同的算力來保障自身的安全。
挖礦造成大量的資源浪費。
共識達成的周期較長。
股權權益證明PoS
股權權益證明現在已經有了很多變種。最基本的概念就是選擇生成新的區塊的機會應和股權的大小成比例。股權可以是投入的資金,也可以是預先投入的其他資源。
PoS算法是針對PoW算法的缺點的改進。PoS由QuantumMechanic2011年在bitcointalk首先提出,后經Peercoin和NXT以不同思路實現。PoS不像PoW那樣,無論什么人,買了礦機,下載了軟件,就可以參與。PoS要求參與者預先放一些代幣在區塊鏈上,類似將財產存儲在銀行,這種模式會根據你持有數字貨幣的量和時間,分配給你相應的利息。用戶只有將一些利益放進鏈里,相當于押金,用戶才會更關注,做出的決定才會更理性。同時也可以引入獎懲機制,使節點的運行更可控,同時更好地防止攻擊。
PoS運作的機制大致如下:
加入PoS機制的都是持幣人,成為驗證者;
PoS算法在這些驗證者里挑一個給予權利生成新的區塊。挑選順序依據持幣的多少;
如在一定時間內,沒有生成區塊,PoS則挑選下一個驗證者,給予生成新區塊的權利;
以此類推,以區塊鏈中最長的鏈為準。
PoS和PoW有一個很大的區別:在PoS機制下,持幣是有利息的。眾所周知,比特幣是有數量限定的。由于有比特幣丟失問題,整體上來說,比特幣是減少的,也就是說比特幣是一個通縮的系統。在PoS模式下,引入了幣齡的概念,每個幣每天產生1幣齡。比如你持有100個幣,總共持有了10天,那么,此時你的幣齡就為1000,這個時候,如果你發現了一個PoS區塊,你的幣齡就會被清空為0。你每被清空365幣齡,你將會從區塊中獲得一定的利息。因此,PoS機制下不會產生通縮的情況。
和PoW相比,PoS不需要為了生成新區塊而大量的消耗電力,也一定程度上縮短了共識達成的時間。但缺點是:PoS還是需要挖礦。
委托權益人證明機制DPoS
委托權益人證明機制機制是PoS算法的改進。筆者試著以通俗易懂的方式來說明這個算法。
假設以下的場景:百花村旁有一座山叫區塊鏈山,屬村民集體所有。村外的A公司準備開發區塊鏈山的旅游資源。A公司和村民委員會聯合成立了百花旅游開發有限公司,簽了股份制合作協議。以下是春節假期期間發生在村民李大和柳五之間的對話:
李大:關于旅游開發區塊鏈山,村民委員會和A公司簽約了。
柳五:那我們有什么好處?
李大:我們都是區塊鏈旅游有限公司的股東了。
由于村民都是股東,所有村民就是區塊鏈山的權益所有人。
柳五:股東要干什么工作呢?
李大:關于區塊鏈的開發的重要決定,股東都要投票的。
柳五:那可不成。春節后我要出去打工,在哪兒還不一定呢。哪有時間回來投票。
李大:不要緊,我們可以推選幾個代表,比如王老師,他會一直留在村辦小學教書,不會走的,而且人又可靠,講信用。
柳五:我也推選王老師,代表我們在重大決議上投票。
王老師在這里就是委托權益人。DPoS算法中使用見證人機制解決中心化問題。總共有N個見證人對區塊進行簽名。DPoS消除了交易需要等待一定數量區塊被非信任節點驗證的時間消耗。通過減少確認的要求,DPoS算法大大提高了交易的速度。通過信任少量的誠信節點,可以去除區塊簽名過程中不必要的步驟。DPoS的區塊可以比PoW或者PoS容納更多的交易數量,從而使加密數字貨幣的交易速度接近像Visa和Mastercard這樣的中心化清算系統。
李大:我們集體推舉王老師的人,每年給王老師一點補償,因為代表我們參加A公司的董事會也很花時間,挺累人的。
柳五:成啊!
權益所有人為了見證人盡量長時間在線,要付給見證人一定的報酬。
柳五:我還準備推薦陶大媽。文化高,人也好,也會一直留在村里。
李大:陶大媽身體不好,還是不要干這個差事了。
見證人必須保證盡量在線。如果見證人錯過了簽署區塊鏈,就要被踢出董事會。不能擔任見證人的工作。
村民選舉出幾個見證人后??
柳五:這次怎么選出了賴大這家伙。這家伙一貫不干好事。我退出!
如果權益所有人不喜歡選出來的見證人,可以選擇賣出權益退場。
DPoS使得區塊鏈網絡保留了一些中心化系統的關鍵優勢,同時又能保證一定的去中心化。見證人機制使得交易只用等待少量誠信節點的響應,而不必等待其他非信任節點的響應。見證人機制有以下特點:
見證人的數量由權益所有者確定,至少需要確保11個見證人。
見證人必須盡量長時間在線,以便做出響應。
見證人代表權益所有人簽署和廣播新的區塊鏈。
見證人如果無法簽署區塊鏈,就將失去資格,也將失去這一部分的收入。
見證人無法簽署無效的交易,因為交易需要所有見證人都確認。
共識算法的社會學探討
對于分布式系統的拜占庭問題,從計算機科學的角度,FLP與CAP定理已經告訴我們無解。研究人員及科學家只有從其他地方尋找靈感。其實并不用花太多時間,他們就會發現,真實的人類世界就是一個分布式系統。如果科技暢銷書《三體》的世界真的存在,那么太陽系和三體人所在半人馬座的星球同時發生了爆炸,對于我們地球人而言,肯定是太陽系的爆炸先發生,因為光肯定是先到達地球。
而在三體人看來,他們會首先觀測到半人馬座的爆炸。對于同樣的事件,不同的系統接收到事件的順序是不一樣的。不同的系統運行速度也是不一樣的。再加上通信的信道是有問題的。在上面三體人的例子里,我們假設光線的傳遞是毫無障礙的。但是如果光線被傳播途中的黑洞給吞噬了,消息永遠接收不到怎么辦?
比特幣的天才之處在于參照人類社會的組織方式和運作方式,引入了共識機制。一個交易的成立與否,也就是分布式賬本的記賬權,經由特定共識機制達成的共識來決定。共識,是一個典型的社會學概念。本文中描述的各種共識算法,讀者應該都有似曾相識的感覺。
PoW,我們可以叫它“范進中舉”。范進用了大半輩子學習一種無用的八股文寫作,如同比特幣礦工用算力來算題,關鍵是算的題毫無意義。有朝一日,運氣好,就可以有權打包所有他認可的交易。
PoS是用戶要預先放入一些利益,這是不是很像我們現實世界中的股份制。人們把真金白銀兌換成股份,開始創業。誰的股份多,誰的話語權就大。
DPoS機制,特別像我們的董事會。選舉出代表,代表股東的利益。被選出的代表,一般來說,成熟老練、閱歷豐富。不但能快速地處理日常事務,同時也能很好地保護股東的利益。
Paxos、Raft、PBFT則很像我們生活中的操練隊列,通過互相間的消息、口令來達成一致。每排的排頭作為Leader,而每排的其余人都以排頭為目標,調整自己的行動。瑞波共識算法,初始狀態中有一個特殊節點列表,就像一個俱樂部,要接納一個新成員,必須由51%的該俱樂部會員投票通過。共識由核心成員的51%權力投票決定,外部人員則沒有影響力。
由于該俱樂部由“中心化”開始,它將一直是“中心化的”,而如果它開始腐化,股東們什么也做不了。與比特幣及點點幣一樣,瑞波系統將股東們與其投票權隔開,因此比其他系統更中心化。
如果我們去看Lamport關于分布式系統共識的論文,就會發現論文是以議員、法案和信使作為闡述理論的樣例,讀起來不太像一篇計算機論文。
在此可以做一個總結了。傳統的、純正的計算機算法對分布式系統的拜占庭問題已經無處著力了。所以在分布式系統的研究中引入了一些社會學的理論和概念,包括上述的博弈論,生物學原理,等等。我們可以把每一個計算機節點想象成一個單元。而計算機網絡就是一個個單元組成的社會,我們該如何給這個計算機節點組成的社會設計規則呢,以保證:
少量節點太慢,或者故障崩潰的情況下,整個網絡還能輸出正確的結果;
整個網絡的響應不能太慢。買一杯咖啡要等一小時是不可接受的;
計算機網絡出現分區的時候,仍然能夠穩定輸出正確的結果;
整個系統能夠穩定地運行,輸出穩定的結果。
我們可以借鑒人類歷史上的社會機制、激勵機制,達成上述的功能。我們有理由相信,互聯網或者分布式網絡系統與現實的社會運作有著千絲萬縷的聯系,正因為如此,區塊鏈的發展并不是冥冥之中的產物。
如今,整個區塊鏈生態內談論最多的共識算法無非是PoW和PoS。PoW存在速度慢、耗能高、對環境不友好以及易受規模經濟影響等問題,而PoS則被認為是很好的替代解決方案。
以太坊致力于完成從PoW到PoS的轉變,不僅是以太坊2.0生態建設中的重要一環,也是整個區塊鏈生態的偉大嘗試。作為以太坊的創始人,V神對于PoS有著自己的獨特看法與理解,如今,與V神面對面的機會來了...
5月20日,部20日公布第二批61個民族資產解凍類詐騙虛假項目和組織。在名單中,第42個項目“金磚數字貨幣項目”看起來“幣圈范兒”十足.
1900/1/1 0:00:00他們的故事全球幾乎無人知曉,但他們的名字卻是世界所有銀行共同銘記的噩夢。「Carbanak」,這個名稱無法直譯成中文的黑客組織,在5年時間內,橫掃全球銀行,攫取至少10億歐元.
1900/1/1 0:00:00據PeckShield數字資產護航系統初步統計顯示,DragonEx交易所共損失了價值6,028,283美元的數字資產,且已經有價值929,162美元的數字資產流入了交易所,目前尚有價值5.
1900/1/1 0:00:00近半個月來,星客交易所SLU平臺幣開始了逐步上漲之旅,漲幅200%,價格在1.3CNYT附近震蕩,目前仍然保持強勢的整理姿態,隨時準備再次上攻.
1900/1/1 0:00:002018年12月16日,由創業家i黑馬主辦,旗下產業媒體數字觀察承辦的2018企業服務產業獨角獸峰會在北京舉行.
1900/1/1 0:00:00Gate.io已對每一位提交用戶的虧損情況進行了統計和驗證,并對符合條件的用戶發放了補償。我們按照補償規則,為符合條件的用戶送出了共24萬USDT價值的GT,同時,每個符合條件的用戶均可獲得VI.
1900/1/1 0:00:00