[轉]拜占庭故障 & Paxos 算法

1、拜占庭故障具體是什麼分類呢?
2、拜占庭故障出現在哪裏?出現在硬件中,還是軟件中,出現在操作系統中嗎?
比如,拜占庭故障會不會出現在雲計算中。

博客一:拜占庭故障(zz)
這個問題是在1982年由Lamport, Shostak, Pease 提出 ——The problem of reaching a consensus among distributed units if some of them give misleading answers. (在分佈式單元中的其中幾個成員給出錯誤訊息的條件下,使分佈式單元達到一致的難題。)The original problem(原始問題是關於幾個將軍策劃政變。其中有些將軍撒謊說可以支持一個具體的計劃,或者支持其他將軍告訴他們的話。) concerns generals plotting a coup. Some generals lie about whether they will support a particular plan and what other generals told them. What percentage of liars can a decision making algorithm tolerate and still correctly determine a consensus? (一個決策算法可以容忍多少百分比的騙子,然後仍然能夠正確確定共識?)

最後結論是:既要想容忍t個判國者,必須保證總的將軍的個數大於3t。(數學難題)

一、拜占庭將軍算法的背景:

對於系統壞掉的風險,可以這樣假設:我們的操作員可能會誤操作、可能會被賄賂或背叛,系統本身可能就有木馬程序,系統可能會被黑客或病毒佔領,我們自己開發的系統可能有漏洞,我們的開發人員可能會留下後門,這些都可以導致系統壞掉。因此,在這些假設在變成可能的殘酷現實中,拜占庭故障是應真正被採用的一種信息安全技術。   入侵容忍體系就是生存技術中的核心。如果我們的網絡和系統(操作系統,數據庫系統,雲計算)學會生存,那麼也就是建立起一個完善的入侵容忍體系。   入侵容忍的技術在這樣的假設空間中實現它的價值:個人的公開行爲在一定的概率下是可預知的,系統在一定的概率下能夠正確完成基本的功能。一定的概率並不是指全部,所以,可以允許有錯誤,因此,入侵容忍還有對糾錯理論的聯想:即利用糾錯碼可以在一個錯誤百出、但有信道容量的信道中準確無誤地傳輸數據,網絡系統就這樣在錯誤中“生存”下來的,這就是我們說的入侵容忍體系,它的生存技術有兩種實現方式:一是攻擊響應的入侵容忍方法,它不需要重新設計系統,可通過高效的檢測系統發現異常,利用資源配置系統調整系統資源,並對對錯誤進行修補(修補系統);二是攻擊遮蔽的入侵容忍方法,它需要重新設計整個系統,並通過冗餘、容錯技術,門檻密碼學技術及“拜占庭”技術來實現。-----------------------------------------------

二、算法介紹: “拜占庭”技術,起源於拜佔廷將軍問題,這是入侵容忍體系的一個基本理論問題。在1982年被提出的“拜佔廷將軍問題”在今天被許多學者看好,然而在商業上還沒有體現其價值。特別是中國的產業界把它放在了一個被遺忘的角落。

描述如下:  

幾個師包圍着敵人的一座城市。每一個師都由它自己的司令統帥,司令之間只能通過報信者互相通信。他們必須統一行動 。

某一位或幾位司令可能是叛徒,企圖破壞忠誠的司令們的統一行動 。

司令們必須有一個算法,使所有忠誠的司令能夠達成一致,而且少數幾個叛徒不能使忠誠的司令們做出錯誤的計劃,即判國的將軍雖然可以傳遞了虛假消息,也不會影響愛國的將軍得到正確的決策。   

拜佔廷將軍問題就是要讓愛國的將軍達成一致,而不是找叛國的將軍。

我們的入侵容忍體系就是這樣,只要在衆多服務器上得到的正確的計算結果,,那麼我們就可以相信這個數據,而不需要去尋找到底誰是間諜。如果要容忍一個搗亂的服務器,在數量上究竟會需要幾個服務器?“拜佔廷將軍”問題可以爲我們解答這個問題:在進行混亂真實消息的傳播中,兩個將軍中一個判國,另一個肯定打敗仗,三個將軍中如果有一個判國,則判國的將軍一定有辦法讓兩個愛國的將軍不能達成一致,若再增加一個將軍,既4個將軍中如果只有一個判國,在不知道誰是判國者的情況下,存在一種算法使將軍們達成一致,實際上就是三個愛國的將軍能夠達成一致,而不管判國的將軍如何搗亂。既4個將軍的團體能夠容忍1個叛國將軍。同樣我們知道,當有t個判國者在搗亂而又無法找出他們的時候,存在一種算法或稱做彈性協議,通過這種協議,能夠保證愛國的將軍達成一致。如果我們把能夠容忍t個叛國者的協議叫t彈性協議,學者證明了,不存在3t個將軍下的t彈性協議而一定存在3t+1或以上將軍下的t彈性協議。就是說要有3t+1個或以上將軍才能保證愛國的將軍能夠達成一致。既要想容忍t個判國者,必須保證總的將軍的個數大於3t。   這樣看來,“拜佔廷將軍”問題應用於信息安全就是入侵容忍體系的重要技術基礎之一。以上講述的僅僅是“拜佔廷將軍”問題中簡化描述,加之以敘述的形式,就是一個描述性的推理,實際上“拜佔廷將軍”問題程序計算的方法是很複雜的。   據荊老師的介紹,作爲入侵容忍體系的理論問題,它可以應用在現實中。實驗室開發的CA入侵容忍資料庫系統就是應用的案例。當用戶查找證書的時候,如何保證得到的是最新的證書而不是過期的證書呢?如果一個服務器保留已經作廢的證書欺騙你會如何呢。利用拜佔廷法定數目團體系統,實驗室很好地解決了這個問題。即使 t個服務器搗亂,輸出舊的證書,系統利用拜佔廷協議,保證用戶一定能夠得到最新的證書。   由此看來,入侵容忍技術作爲網絡生存的重要技術,是保證網絡和系統安全的一個新的概念和思路。網絡的等級保護不僅僅是空間的,也應該是邏輯上的和技術上的。深層防禦就是在不同的地方,用不同的方式,建立多條防線,保護關鍵網絡,入侵容忍技術在這個方面就有這不俗的表現。   

最後對於如何更好的開發和利用生存技術、如何建立完善入侵容忍體系的問題,荊老師神情急切,他說,這應該是當前中國信息安全最需要的。-----------------------------------------------

英文解釋:這個問題是在1982年由Lamport, Shostak, Pease提出,後少人問津。爲了利於對“拜佔廷將軍”問題原意的理解和避免曲解,把英文解釋奉上: Byzantine General Problem ——The problem of reaching a consensus among distributed units if some of them give misleading answers. The original problem concerns generals plotting a coup. Some generals lie about whether they will support a particular plan and what other generals told them. What percentage of liars can a decision making algorithm tolerate and still correctly determine a consensus?

三。具體分析:

1。叛徒數大於或等於1/3,拜占庭問題不可解。

情況一:A,B,C三個司令,C是叛徒。A發消息給B,C“進攻”,C發消息給B“撤退”(因爲是叛徒)。B收到兩個矛盾的命令,無法作出決策。

情況二:A,B,C三個司令,A是叛徒。A發消息給B“進攻”,發消息給C“撤退”(因爲是叛徒)。B。C收到不同的命令。

2.用口頭信息,叛徒數少於1/3,拜占庭問題可解.

口頭信息三條件
傳送正確
接收者知道是誰發的
沉默(不發信息)可被檢測
什麼叫可解?
IC1:所有忠誠副官(B.C,指消息接受者)遵循同一命令。
IC2:若司令(A,消息)是忠誠的,所有忠誠副官遵循其命令

可以證明,多項式複雜性算法OM(m)可以解決拜占庭問題(L Lamport, R Shostak, and M Pease. The Byzantine generals problem. ACM Transactions on Programming Languages and Systems, 1982, 4(3))

如果記容忍t個叛國者的協議叫t彈性協議(即,在t彈性協議存在的情況下,可以勝利),則:
n如果記容忍t個叛國者的協議叫t彈性協議,則:
當n=3時,不存在1彈性協議
當n>=1,不存在t>=n/3的t彈性協議

發送者發送他的值給每個接收者
如果第i個接收者獲得的值是vi, 接收者i執行算法OM(m-1)發送vi給n-2個其他的接收者

第i個接收者會收到從不同n-1人發來的n-1個值, 取多數認同的值就可以 nOM(m),m>0

failure的分類:

1。內容failure:the content of the information delivered at the service interface deviates from implementing the system function.
2. 時間failure:the time of arrival or the duration of the information delivered at the service interface deviates from implementing the system function.
當時間和內容都發生錯誤時:
1。停止failure: when the service is halted, a special case of halt is silent failure, or simply silence, when no service at all is delivered at the service interface.
2. Erratic failure: when a service is delivered, but is erratic.胡說錯誤,哈哈

關於failure是否可以探測到,分兩種情況:
1. signaled failures: the system signals service failures to the users.
2. unsignaled failures: no warning from the system is given.

但是探測本身也會有誤報,比如:
false alarm: signaling a failure when no failure has actually occurred.

failure本身也有一致性或者非一致性的問題:
consistent failure: the incorrect service is perceived identically by all system users.
inconsistent failures: some or all system users perceive the incorrect service differently, but some users may perceive a correct service;這個就是所說的byzantine failure:)

failure 的嚴重性:
1. outage duration
2. possibility of human lives being endangered
3. the type of information that may be unduly disclosed.
4. the extent of the corruption of data and the ability to recover from these corruptions
這裏寫圖片描述
下邊來說說拜占庭錯誤:
拜占庭錯誤是一個非一致的,不可檢測的內容錯誤;
也可以定義爲交互的非一致錯誤
看一個例子:
這裏寫圖片描述

假設三個節點以取中位數的方式同步,三個節點各自持有的數字分別位10 11 12, 但節點c出現了byzatine錯誤,所以他向節點b發送了錯誤的數字12,因爲節點b自己持有的數字位11,所以它只能在10 11 12中取中位數=11,但實際節點a和c最後決定的中位數是10;
節點c的錯誤導致了一個無辜的節點b做出了錯誤的決策;

假設多股軍隊計劃同時攻打某城池,這些軍隊的commande被一個將軍領導,但其中一個或幾個可能是叛徒,所以如果想獲得勝利,就一定要讓忠誠的commander同時發動進攻,但叛徒會用錯誤的信息擾亂進攻時間,避免的方式就是所有的commander共同交換信息,以判定叛徒;

該算法的目標是:
1。忠誠的commander遵守同樣的命令;
2。如果將軍也是忠誠的,所有忠誠的commander遵守該將軍發佈的命令;

算法的需求:
1。如果存在3m+1個unit,則可容錯1個unit的byzantine錯誤
2。至少m+1輪的消息傳遞
3。所有unit同步;

算法的假設:
1。不會丟失消息;
2。消息接收者知道誰是發送者
3。消息丟失可被探測;

算法開始:
1。將軍的命令被送到每個commander
2。每個接收者使用該命令或使用retreat狀態;

算法進行;
1。將軍的命令被髮布到每個節點;
2。每個接收者使用該命令或使用retreat狀態(如未收到任何命令),每個接受者如將軍般向其他n-2個commander繼續轉發命令(不發給自己和消息來源)
3。重複以上過程;最後得到命令集合{vi…..vj}

如爲了容一個錯,使用4個節點:
這裏寫圖片描述
unit2 將向節點3,4繼續轉發命令,同時也收到節點3,4轉發的命令,節點2在{v1 v31 v41}使用少數服從多數的方式獲取最終命令;
對於獲得一個共識的消息數量:3+2*3=9條
則對於4個節點或許4個共識而言,消息數量是 4*9=36條;
這裏寫圖片描述
對於一個能容2個錯的7節點系統來說
獲取一個共識的消息數量:6+6*(5+5*4)=156條
消息總數:7*156

 

Paxos 算法:https://baike.baidu.com/item/Paxos%20%E7%AE%97%E6%B3%95/10688635

 

比特幣如何達成共識 - 最長鏈的選擇

比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳本,那麼大家如何達成共識:確認哪一份纔是公認權威的總賬本呢?

比特幣沒有中心機構,幾乎所有的完整節點都有一份公共總帳本,那麼大家如何達成共識:確認哪一份纔是公認權威的總賬本呢?

爲什麼要遵守協議

這其實是一個經濟問題,在經濟活動中的每個人都是自私自利的,追求的是利益的最大化,一個節點工作量只有在其他的節點認同其是有效的(打包的新區塊,其他的節點只有驗證通過纔會加入到區塊鏈中,並在網絡上傳播),才能夠過得收益,
而只有遵守規則纔會得到其他的節點認同。
因此,基於逐利,節點就會自發的遵守協議。共識就是數以萬計的獨立節點遵守了簡單的規則(通過異步交互)自發形成的。

共識:共同遵守的協議規範

去中心化共識

工作量證明一篇,我們瞭解通過工作量證明來競爭記賬,權威的總帳本是怎麼達到共識的,沒有完全說清楚,今天補上,
實際上,比特幣的共識由所有節點的 4 個獨立過程相互作用而產生:

  1. 每個節點(挖礦節點)依據標準對每個交易進行獨立驗證
  2. 挖礦節點通過完成工作量證明,將交易記錄獨立打包進新區塊
  3. 每個節點獨立的對新區塊進行校驗並組裝進區塊鏈
  4. 每個節點對區塊鏈進行獨立選擇,在工作量證明機制下選擇累計工作量最大的區塊鏈

共識最終目的是保證比特幣不停的在工作量最大的區塊鏈上運轉,工作量最大的區塊鏈就是權威的公共總帳本。

第 1 2 3 步在比特幣如何挖礦-工作量證明一篇有提到過,下面着重講第 4 步。

最長鏈的選擇

先來一個定義,把累計了最多難度的區塊鏈。在一般情況下,也是包含最多區塊的那個鏈稱爲主鏈
每一個(挖礦)節點總是選擇並嘗試延長主鏈。

分叉

當有兩名礦工在幾乎在相同的時間內,各自都算得了工作量證明解,便立即傳播自己的“獲勝”區塊到網絡中,先是傳播給鄰近的節點而後傳播到整個網絡。每個收到有效區塊的節點都會將其併入並延長區塊鏈。
當這個兩個區塊傳播時,一些節點首先收到#3458A, 一些節點首先收到#3458B,這兩個候選區塊(通常這兩個候選區塊會包含幾乎相同的交易)都是主鏈的延伸,分叉就會產生,這時分叉出有競爭關係的兩條鏈,如圖:
分叉
兩個塊都收到的節點,會把其中有更多工作量的一條會繼續作爲主鏈,另一條作爲備用鏈保存(保存是因爲備用鏈將來可能會超過主鏈難度稱爲新主鏈)。

分叉解決

收到#3458A 的(挖礦)節點,會立刻以這個區塊爲父區塊來產生新的候選區塊,並嘗試尋找這個候選區塊的工作量證明解。同樣地,接受#3458B 區塊的節點會以這個區塊爲鏈的頂點開始生成新塊,延長這個鏈(下面稱爲 B 鏈)。
這時總會有一方搶先發現工作量證明解並將其傳播出去,假設以#3458B 爲父區塊的工作量證明首先解出,如圖:
分叉

當原本以#3458A 爲父區塊求解的節點在收到#3458B, #3459B 之後,會立刻將 B 鏈作爲主鏈(因爲#3458A 爲頂點的鏈已經不是最長鏈了)繼續挖礦。

節點也有可能先收到#3459B,再收到#3458B,收到#3459B 時,會被認爲是“孤塊“(因爲還找不到#3459B 的父塊#3458B)保存在孤塊池中,一旦收到父塊#3458B 時,節點就會將孤塊從孤塊池中取出,並且連接到它的父區塊,讓它作爲區塊鏈的一部分。

比特幣將區塊間隔設計爲 10 分鐘,是在更快速的交易確認和更低的分叉概率間作出的妥協。更短的區塊產生間隔會讓交易確認更快地完成,也會導致更加頻繁地區塊鏈分叉。與之相對地,長的間隔會減少分叉數量,卻會導致更長的確認時間。

比特幣如何挖礦(挖礦原理)-工作量證明

在區塊鏈記賬原理一篇,我們瞭解到記賬是把交易記錄、交易時間、賬本序號、上一個Hash值等信息計算Hash打包的過程。 我們知道所有的計算和存貯是需要消耗計算機資源的,既然要付出成本,那節點爲什麼還要參與記賬呢?在中本聰(比特幣之父)的設計裏,完成記賬的節點可以獲得系統給與的一定數量的比特幣獎勵,這個獎勵的過程也就是比特幣的發行過程,因此大家形象的把記賬稱爲“挖礦”,本文將詳細討論這個過程。

在 區塊鏈記賬原理 一篇,我們瞭解到記賬是把交易記錄、交易時間、賬本序號、上一個 Hash 值等信息計算 Hash 打包的過程。
我們知道所有的計算和存貯是需要消耗計算機資源的,既然要付出成本,那節點爲什麼還要參與記賬呢?在中本聰(比特幣之父)的設計裏,完成記賬的節點可以獲得系統給與的一定數量的比特幣獎勵,這個獎勵的過程也就是比特幣的發行過程,因此大家形象的把記賬稱爲“挖礦”,本文將詳細討論這個過程。

記賬工作

由於記賬是有獎勵的,每次記賬都可以給自己憑空增加一定數量的個比特幣(當前是 12.5 比特幣,博文寫作時每個比特幣是 4 萬人民幣以上,大家可以算算多少錢),因此就出現大家爭相記賬,大家一起記賬就會引起問題:出現記賬不一致的問題,比特幣系統引入工作量證明來解決這個問題,規則如下:

  • 一段時間內(10 分鐘左右,具體時間會與密碼學難題難度相互影響)只有一人可以記賬成功
  • 通過解決密碼學難題(即工作量證明)競爭獲得唯一記賬權
  • 其他節點複製記賬結果

不過在進行工作量證明之前,記賬節點會做進行如下準備工作:

  • 收集廣播中還沒有被記錄賬本的原始交易信息
  • 檢查每個交易信息中付款地址有沒有足夠的餘額
  • 驗證交易是否有正確的簽名
  • 把驗證通過的交易信息進行打包記錄
  • 添加一個獎勵交易:給自己的地址增加 12.5 比特幣

如果節點爭奪記賬權成功的話,就可以得到 12.5 比特幣的獎勵。

工作量證明

{% post_link whatbc 區塊鏈記賬原理 %}我們瞭解到,每次記賬的時候會把上一個塊的 Hash 值和當前的賬頁信息一起作爲原始信息進行 Hash。
如果僅僅是這樣,顯然每個人都可以很輕鬆的完成記賬。
爲了保證 10 分鐘左右只有一個人可以記賬,就必須要提高記賬的難度,使得 Hash 的結果必須以若干個 0 開頭。同時爲了滿足這個條件,在進行 Hash 時引入一個隨機數變量。

用僞代碼表示一下:

Hash(上一個Hash值,交易記錄集) = 456635BCD
Hash(上一個Hash值,交易記錄集,隨機數) = 0000aFD635BCD

我們知道改變 Hash 的原始信息的任何一部分,Hash 值也會隨之不斷的變化,因此在運算 Hash 時,不斷的改變隨機數的值,總可以找到一個隨機數使的 Hash 的結果以若干個 0 開頭(下文把這個過程稱爲猜謎),率先找到隨機數的節點就獲得此次記賬的唯一記賬權。

計算量分析

(這部分可選閱讀)我們簡單分析下記賬難度有多大,
Hash 值是由數字和大小寫字母構成的字符串,每一位有 62 種可能性(可能爲 26 個大寫字母、26 個小寫字母,10 個數字中任一個),假設任何一個字符出現的概率是均等的,那麼第一位爲 0 的概率是 1/62(其他位出現什麼字符先不管),理論上需要嘗試 62 次 Hash 運算纔會出現一次第一位爲 0 的情況,如果前兩 2 位爲 0,就得嘗試 62 的平方次 Hash 運算,以 n 個 0 開頭就需要嘗試 62 的 n 次方次運算。我們結合當前實際區塊#493050 信息來看看:

區塊#493050

注:數據來源於 https://blockchain.info
我們可以看到 Hash 值以 18 個 0 開頭,理論上需要嘗試 62 的 18 次方次,這個數是非常非常巨大的,我已經算不清楚了,應該是億億級別以上了。如此大的計算量需要投入大量的計算設備、電力等,
目前應該沒有單礦工獨立參與挖礦了,基本都是由礦工聯合起來組成礦池進行挖礦(礦池裏的礦工按算力百分比來分收益)。

從經濟的角度講,只有挖礦還有收益(比特幣價格不斷上漲也讓收益變大),就會有新的礦工加入,從而加劇競爭,提高算力難度,挖礦就需要耗費更多的運算和電力,相互作用引起最終成本會接近收益。

題外話:國內由於電力成本較低,相對收益更高,中國的算力佔整個網絡的一半以上

驗證

在節點成功找到滿足的 Hash 值之後,會馬上對全網進行廣播打包區塊,網絡的節點收到廣播打包區塊,會立刻對其進行驗證。

如果驗證通過,則表明已經有節點成功挖出區塊,自己就不再競爭當前區塊打包,而是選擇接受這個區塊,記錄到自己的賬本中,然後進行下一個區塊的競爭猜謎。
網絡中只有最快解謎的區塊,纔會添加的賬本中,其他的節點進行復制,這樣就保證了整個賬本的唯一性。

假如節點有任何的作弊行爲,都會導致網絡的節點驗證不通過,直接丟棄其打包的區塊,這個區塊就無法記錄到總賬本中,作弊的節點耗費的成本就白費了,因此在巨大的挖礦成本下,也使得礦工自覺自願的遵守比特幣系統的共識協議,也就確保了整個系統的安全。

進階閱讀比特幣區塊結構 Merkle 樹及簡單支付驗證分析,可以詳細瞭解區塊結構如何驗證交易。

說明

礦工的收益其實不僅僅包含新發行的 12.5 比特幣獎勵,同時還有交易費收益(本文忽略一些細節是爲了讓主幹更清晰)。

有興趣的同學可以看看圖中區塊都包含了那些信息,紅箭頭標示出的是本文涉及的信息。

本文中有提到共識協議,比特幣共識協議主要是由工作量證明和最長鏈機制 兩部分組成,請閱讀比特幣如何達成共識 - 最長鏈的選擇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章