請先閱讀最最最簡化的SCP。
來講聯邦投票(Federated Voting)的過程:投票、接受和確認(Voting, accepting, and confirming)。
在一輪聯邦投票中,一個節點可以選擇從投票給某個值 V 開始。我們用午餐吃什麼來舉例。
小安向周圍的人大喊(廣播)「我是小安,小浪和小黑是我的朋友(小安+小浪+小黑就是小安的仲裁切片),我投票(Voting)給排骨飯。」當小安這樣講時,表示承諾他從來不曾反對吃排骨飯,也永遠不會反對吃排骨飯(但最後吃不吃排骨飯就不一定了,有可能票數太少,後來跟別人吃其他食物)。
小安也會聽到身邊的人說他們要投給票什麼,小安只要聽到足夠多的人喊話,就可以根據這些人的朋友的朋友…找到朋友們組成的群體(仲裁)。
如果小安發現整群人都投票給排骨飯,他就會轉成接受排骨飯,並向周圍大喊「我是小安,小浪和小黑是我的朋友,我接受(Accepting)排骨飯。」
接受(Accepting)比單純的投票(Voting)提供了更強的保證。當小安投票給排骨飯時,他永遠不會投票給排骨飯以外的食物,但群內的其他人就不一定了。可是當小安接受排骨飯時,整個群體的人都不會接受排骨飯以外的食物。
當然,小安很有可能不會立即看到很多人同意他投的排骨飯,其他人可能會投票給肉羹麵、總匯三明治。但是還有另一種方式可以讓小安從單純的投票推進到接受。
小安可以接受另一個不同的食物,比如肉圓,即使小安沒有投票給肉圓,也沒有看到整個群體的人都投票給肉圓,但只要小安看到一些特別的朋友接受肉圓就行。
我們把這些特別的朋友取個專有名詞,叫做阻塞集(blocking set)。
阻塞集是從小安的每個朋友切片中選擇一個人來組成。顧名思義,它能夠阻止任何其他食物選項。如果這些人都接受肉圓,那麼將永遠不可能形成一個接受“不是肉圓”的群體,因此小安也接受肉圓是安全的。
小安有3個朋友切片。
小浪+老礦工+傑叔,是小安的阻塞集,它從小安的3個朋友切片中各挑了一個人。
小浪+艾瑪也是小安的阻塞集,因為艾瑪同時出現在小安的2個朋友切片中。
但是阻塞集不是一個完整的朋友群體。如果有人可以在小安的每個朋友切片中收買一個人(例如收買小浪跟艾瑪),那麼就很容易欺騙小安接受一個奇怪的食物(如毛鴨蛋!!)。所以接受肉圓並不是午餐投票的結束。相反的,小安必須確認(Confirming)它,也就是看到整個群體的人全都接受肉圓。如果走到這一步,其他人最終也都將確認相同的肉圓,因此小安就能把肉圓當作午餐投票結束的結果。
午餐吃什麼的聯邦投票
投票、接受和確認的過程構成了一輪完整的聯邦投票。恆星共識協議結合了許多這樣的回合來創建一個完整的共識系統。
這樣就結束了嗎?不,還沒。
共識系統的兩個最重要的屬性是安全性(safety)和活性(liveness)。如果每個參與者最終的決定都一樣,小安和小浪永遠不會吃不同的東西,那麼它就是“安全的”。剛剛描述的聯邦投票程序在某種意義上是安全的,如果有人確認吃陽春麵,則沒有其他人會確認吃披薩。
但“不會確認吃披薩”與“會確認吃陽春麵”是兩回事。可能人多嘴雜,有太多不同的美食被投票,都沒有達到“接受”門檻。拖到下午四點大家才決定午餐吃陽春麵,這樣就是缺乏“活性”。
恆星共識協議確保安全性和活性的方法是,對多種美食進行多次聯邦投票,直到一項美食通過SCP的各個投票階段。這部分我們留到提名與投票的篇幅再說明。