第313章拜占庭容錯算法
蔡志遠繼續解釋道:
「比如,現在一共有五名將軍,其中兩名將軍認為應該進攻,而另外兩名將軍認為應該撤退。
「這時候,第五名將軍是個叛徒,他告訴進攻的將軍『我也會進攻』,又告訴撤退的將軍『我也會撤退』。
「于是,想要進攻的將軍認為,現在有三支軍隊同意進攻,超過了半數,所以明天應該進攻。
「而想要撤退的將軍認為明天應該撤退。
「最后的結果,就是兩個將軍進攻,兩個將軍撤退,導致戰爭失敗。
「這就是『去中心化』所帶來的問題,因為這五個將軍都是平級的,沒有一個擁有絕對權限的指揮者,所以在互相商量策略的過程中,就會產生這樣的問題。」
鄭杰恍然點頭:「原來如此!那這個辦法怎么解決呢?也沒辦法驗證具體是哪個將軍在說謊吧?」
蔡志遠解釋道:「其實要解決這個問題很簡單:多問幾遍就行了。
「假設我是其中一名將軍a,而將軍b告訴我他要和我一起進攻。
「如果我信了,那就有可能會被騙,因為將軍b有可能是叛徒,他可能只跟我說了進攻,跟別人說了撤退。
「所以,這時候我應該再去問將軍c,我問他:『將軍b跟你說的是進攻還是撤退?』
「然后我再去挨個問其他所有的將軍,匯總將軍b給他們說的所有信息。
「其他將軍告訴我的『將軍b給他們的信息』也不一定真實,因為其他將軍里面可能也有叛徒,可能存在『將軍b跟他們說進攻,他們卻告訴我將軍b說了撤退』這種情況。
「所以,我挨個問一遍『將軍b對你們說了什么』,如果『進攻』比較多,那我就把將軍b的意見記為『進攻』;
「然后再挨個問一遍『將軍c對你們說了什么』,如果『撤退』比較多,那我就把將軍c的意見記為『撤退』。
「就這樣,我通過反復套娃的方式,不斷地排除少數派答案,最后得出的結論,就是更準確的『多數派答案』。
「在滿足『拜占庭容錯』的情況下,我們強制要求所有將軍都遵守這一套策略,并且必須堅決執行最終的結論。
「那我們就可以確保大家一起進攻或者一起撤退。」
鄭杰有些困惑:「在滿足『拜占庭容錯』的情況下?也就是蔡哥你之前說過的,叛徒人數必須少于三分之一?」
蔡志遠點了點頭:「是的。
「我們用3名將軍的情況來舉個例子:
「假設3名將軍里面,將軍c是叛徒,故意傳遞錯誤的信息。
「將軍a會首先向將軍b和c說『進攻』。
「但是將軍b接到命令之后無法確認將軍a是不是叛徒,所以他要先問將軍c,『將軍a給你的命令是什么』,而將軍c是叛徒,所以會故意說『將軍a給我的命令是撤退』。
「因為只有三個將軍,所以將軍b就無法判斷將軍a和將軍c到底哪個是叛徒,因為『進攻』和『撤退』的命令各一票,無法形成多數。
「同理,將軍b在執行這個策略的時候,也沒法判斷將軍a和將軍c哪個是叛徒。
「這是最簡單的一種情況,如果將軍的數量變多,比如同時有7個將軍,其中有2個是叛徒的話,情況會變得復雜很多,要套娃很多次才能最終得到結論。
「所以我才說,這種問題不需要自己真的推算,只要記住結論就行了。
「結論就是,當叛徒人數達到三分之一或者更多時,這個問題就不可解。
「反過來說,想要讓這個問題可解,就要把叛徒人數控制在少于三分之一的情況。
「套一下三個房間的人數,就一目了然了。