拜占庭將軍問題#
如果你第一次看到這個名字,可能會覺得這是一個歷史人物遇到的一個打仗的問題。但其實完全不是,而是一個計算機學家提出來為了解決分佈式網絡的問題。
拜占庭將軍問題(Byzantine Generals Problem),是由萊斯利・蘭波特在其同名論文中提出的分佈式對等網絡通信容錯問題。
簡單介紹一下問題提出者:
萊斯利・蘭波特(Leslie Lamport),美國計算機科學家。也是排版系統 LaTeX 的開發者。2013 年,獲得圖靈獎。
開開腦洞#
在探尋拜占庭將軍問題這個複雜問題前,我想先給一個小問題來開開腦洞(適應下思維方式)。
有兩個守門童 A 和 B,有兩扇門 a 和 b,我們的目標是找到 a 和 b 中正確的門,已知:
- 我們可以各詢問 A 和 B 一個問題
- A 和 B 一個人說真話,一個人說假話
請問,如何問才能找到正確的門?
可以思考一下,還挺有意思的,其實只用問一個問題就可以得到答案。
答案:詢問 A:你認為 B 會說哪個門是正確的門?(正確答案就是 A 回答的另一扇門)
達成共識#
這個拜占庭將軍問題舉的例子比較複雜,希望能用一個簡單的例子來讓你理解:
一群好朋友(將軍)想要討論明天早上十點是否一起去公園,但是現在無法群聊,只能一對一的私聊,可以確定的是朋友內有想搗亂或破壞大家的關係(故意亂說),如何達成大家統一行動的目標(一起去或不去)?
比如,一共 9 個人,大家采用多數服從少數的原則,當四人同意去,四人不同意去,壞蛋跟同意的四人說同意去,跟不同意的四人說不同意去,雙方都以為自己勝利,會導致出現目標失敗。
上述的故事映射到計算機系統裡,將軍便成了計算機,而私聊就是通信系統。雖然上述的問題涉及了電子化的決策支持與信息安全,卻沒辦法單純的用密碼學與數字簽名來解決。因為電路錯誤仍可能影響整個加密過程,這不是密碼學與數字簽名算法在解決的問題。因此計算機就有可能將錯誤的結果提交去,亦可能導致錯誤的決策。
而在區塊鏈中,若出現了無法達成共識會出現分叉、宕機等問題。當一條鏈共識出現問題,將會對這條鏈造成信任危機也是致命打擊,所以在區塊鏈中共識算法是生態發展的底層基礎。
口頭協議#
其實共識算法在不斷進步,也有非常聰明的人在不斷提出新穎的解題思路。在本問題被提出的論文中,萊斯利・蘭波特已經提出了兩種解法,今天就分享口頭協議這個解法。
以下內容並不是原版解法,是根據個人理解的表達,若有錯誤希望理解
定義:
- 分為兩類,好人(希望統一),壞人(希望不統一)
- 提出提案的人自動作為領頭(將軍)
目標:
- 若領頭是好人,保證所有好人都執行領頭的提議
- 保證所有好人保持一致執行
失敗案例#
繼續按上面的去公園為基礎,這次是 a、b、c 3 人商討是否明天去公園,其中一人壞人。
b 提出去公園的想法,作為領隊。
(下方有圖解)
可能 1#
b 領隊不是壞人,c 是壞人
a 收到 b 去公園的想法,但是不知道 b 是否是好人,所以問 c:b 提議是去還是不去,c 反饋不去,所以 a 收到 1 個去,1 個不去。a 知道 b 和 c 中有一個壞人,但不知道是誰。
所以無法達成共識:失敗
可能 2#
b 領隊是壞人,a c 都是好人
a 收到 b 去提議,c 收到 b 不去的提議,此時 a 和 c 交換信息,都得到 1 個去,1 個不去。
所以無法達成共識
成功案例#
這次是 a、b、c、d 4 人商討是否明天去公園,其中一人壞人。
可能 1:#
領隊 c 是好人,提出明天不去公園,d 是壞人。
a 收到不去公園的意見後,詢問 b、d 領隊的意見是什麼,得到的是不去(b)和去(d)。
a 得到的是(不去、不去、去),選擇多數不去就行,b 同理結論是不去。
最後 a、b、c 都不去,達成目標 2,並且符合領隊的命令,達成目標 1.
可能 2:#
領隊 c 是壞人,對 a、b 說去,對 d 說不去。
a 收到去的提議後,詢問 b、d 領隊的意見是什麼,得到的是去(b)和不去(d)。
a 得到的是(去、去、不去),選擇多數去就行,b 同理結論是去。
d 收到不去的提議後,詢問 a、b 領隊的意見是什麼,得到的是去(a)和去(b)。
d 得到的是(不去、去、去),選擇多數去就行。
最後 a、b、d 都統一去了,達成目標 2,由於領隊是壞人,無需考慮目標 1。
其實,當時萊斯利・蘭波特提出口頭協議時就給出了結論,若有 n 人參與,m 人是壞人,那麼只有當 n > 3m 時才能達成共識。也就是說當有 2 人壞人時,需要一共 7 人才能達成共識,具體的推演過程可以看李永樂老師的視頻,很有意思。
當然區塊鏈中比特幣和以太坊都采用的 PoW(工作量證明)也非常出色的解決了共識問題,並且經過十幾年的穩定運行也證明了這種方法的可行性。但是 PoW 也有非常多被人詬病的問題,有機會再詳細研究一下 PoW 的底層邏輯。