第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個是叛徒的話,情況會變得複雜很多,要套娃很多次才能最終得到結論。
“所以我才說,這種問題不需要自己真的推算,只要記住結論就行了。
“結論就是,當叛徒人數達到三分之一或者更多時,這個問題就不可解。
“反過來說,想要讓這個問題可解,就要把叛徒人數控制在少於三分之一的情況。
“套一下三個房間的人數,就一目瞭然了。 “『4人房間』,3人答題,所以只要有1名惡意自由人,這個問題就不可解。
“『8人房間』,7人答題,在房間中有3名惡意自由人的情況下,不可解。
“『13人房間』,12人答題,在房間中有4名惡意自由人的情況下不可解。”