中本聰創建比特幣之前,需要在去中心化網絡中解決拜佔庭將軍問題,現有的算法和協議都是基於中心化網絡的解決方案。中本聰創造性的使用了POW共識算法來解決這個問題,那麼到底什麼是拜佔庭將軍問題?
美國計算機科學家萊斯利·蘭伯特(Leslie Lamport)在1982年提出拜佔庭將軍問題,老爺子當年在研究分布式系統容錯性的時候,為了方便理解編了一個拜佔庭將軍的故事,論文發表後,該故事廣為流傳。
嘗到甜頭後,1989年在解決這個拜佔庭問題上設計了一種稱為Paxos的容錯算法,繼續用這種敘事風格編了一個古希臘島嶼Paxos的政府會議臨時議員面臨的問題,不過在發表的時候審稿人需要老爺子把Paxos島的內容換掉,要不就拒絕發表。這麼一弄,等到很多人用paxos算法實現分布式系統的時候,文章才最終發表。文章發表的時間到完成時間足足用了8年。
由於在分布式計算系統的突出貢獻而獲得了2013年圖靈獎。老爺子在微軟公司任職期間獲得了該獎項,這使他成為微軟研究團隊中第五位獲得該獎項的成員。
那麼,拜佔庭將軍問題在分布式計算系統中,到底是什麼問題?為了易於理解,讓我們看看簡版故事的原型:
在很久很久以前,拜佔庭是東羅馬帝國的首都。那個時候羅馬帝國國土遼闊,為了防禦目的,因此每個軍隊都分隔很遠,將軍與將軍之間只能靠信使傳遞消息。 在打仗的時候,拜佔庭軍隊內所有將軍必需達成一致的共識,才能更好地贏得勝利。但是,在軍隊內有可能存有叛徒,擾亂將軍們的決定。 這時候,在已知有成員不可靠的情況下,其餘忠誠的將軍需要在不受叛徒或間諜的影響下達成一致的協議。
我們很容易從上面找到2個問題
1、信使的信息來源的問題,是否可靠?在計算機網絡中,我們可以理解我網絡通道的穩定性。
2、軍隊所有將軍是否達成某一個目標(一致進攻或撤退),如果出現叛徒的情況下如何實現?在分布式計算機網絡中,如何保證所有計算機的一致性,又要允許節點計算機的故障或錯誤。
第1個問題在計算機稱為網絡通道問題,如果我們傳遞消息的信道的可靠的,那麼問題可解。然而,是否真有這樣的通道嗎?
假如,
A將軍向B將軍派出通信兵,A要知道B是否收到信息
則,
A必須要求B給自己傳輸一個回執,說「我收到了,同意明天10點準時進攻」。
然,
B已經發送這條信息,B也不能確定A就一定會在這個時間進攻。
因為,
B發出的回執A並不一定能夠收到,所以A需要再給B發出一個回執說「我收到了」。
網絡通道問題在於系統永遠需要一個「回執」,更糟糕的是,通信兵的信息如果纂改,那麼目前現實並不存在一個可以一定勝利的通信協議。但這個問題又必須解決,有沒有一種相對可靠的通信協議來解決大部分問題呢?
有的,這就是基於信息網際網路的TCP/IP協議。TCP協議中A向B發出一個隨機數x,B收到x後發給A另一個隨機數y以及x+1作為答覆,這樣A就知道B已經收到了,然後A再發回y+1給B,這樣B就知道A已經收到了。這樣,A和B之間就建立了一個可靠的連接,彼此相信對方已經收到並確認信息。但是,A和B之間的通道的會出現丟失、監聽或篡改的情況(我們上不了Google/Facebook這類情況,你懂的),但這已經是相對可控的解決方案了,完美的解決這個問題需要量子糾纏技術了。
第2個問題,如何在有叛徒的情況下還能保持一致性,將軍們達成同一個目標?這個就是老爺子提出的拜佔庭將軍問題,也稱為拜佔庭容錯。
假設1:
將軍總數有3個(A、B、C),其中叛徒將軍有1個(B):
A將軍派出通信兵,B叛徒收到信息後,回復不同的命令,則對於C將軍收到兩個相反的消息,也無從判斷誰是叛徒,系統無法達成一致。
B叛徒派出通信兵,發送兩個相反的信息給另外的A、C將軍,另外2個收到相反的信息,無法判斷究竟誰是叛徒,系統無法達成一致。
假設2:
將軍總數有4個(A、C、D),其中叛徒將軍有1個(B):
A\C\D任何一個將軍派送通信兵,B同樣作惡,但是收到的信息結果很容易找出那個是叛徒(計算機或節點出現問題),從而快速達成共識。
B叛徒派出通信兵,發送不同信息給另外3個,但其他三個將軍之間進行通信後,他們自己也能達成一個共識。
老爺子給出算法就是計算機網絡節點(計算機或機房)總數是N,叛徒數量為F(出現錯誤的節點),則當N>=3F+1時,共識才能達成,這就是BFT算法。拜佔庭容錯算法解決的是基於網絡通信(大致)可靠的前提下,網絡節點可能出現故障的情況下達成一致性。
1999年,由castro和liskov提出PBFT是第一個得到廣泛應用的BFT算法,只要系統有2/3的節點是正常工作的,則可保證一致性。
在一個存在錯誤的分布式系統中,需要尋找一個算法和協議,使得整個網絡滿足以下三個屬性:
1)一致性
2)正確性
3)可結束性
實際情況,根據不同的假設條件,有不同的算法和協議設計出來,這些算法和協議各有優勢和局限,假設條件有以下幾種情況:
1)故障模型:非拜佔庭故障/拜佔庭故障
2)通信類型:同步/異步
3)通信網絡連接:節點之間直連數
4)信息發送身份:實名/匿名
5)通信通道穩定:可靠/不可靠
6)消息認證:認證/非認證
依據條件設計出來的這些算法如Paxos、Raft 、PBFT、DBFT、都是為了解決拜佔庭容錯,這些算法目前大部分應用在私有鏈和聯盟鏈當中,需要基於中心化可控的網絡系統中,而中本聰在比特幣去中心化網絡中創造性的引入了「工作量證明(POW : Proof of Work)」來解決這個問題。