看懂「拜占庭容錯」,也就看懂了區塊鏈的核心技術

2021-09-22 23:23:53 字數 2600 閱讀 9453

「拜占庭將軍問題」模型中,對於將軍們(節點)有兩個預設的假設: 

假設1的含義是:所有節點對命令的解析和執行是一樣的,這個命令必須是乙個確定性的命令,不能存在隨機性,也不能依賴節點自身的狀態。(這個命令不能是心情好就攻擊敵人,心情不好就原地休息。)

假設2的含義是:忠誠的將軍需要判斷接收到的命令是不是正確的。這個判斷命令的方法是整個拜占庭容錯技術的核心。

對於將軍們的通訊過程,在「拜占庭將軍問題」中也是有預設假設的:點對點通訊是沒問題的。也就是說,在這裡,我們假設a將軍要給b將軍一條命令x,那麼派出去的傳令兵一定會準確的把命令x傳遞給b將軍。

有了上述假設,我們來看看將軍們面臨的核心問題是什麼。

我們考慮4個將軍的情況,同時假設4個將軍中最多只有1個背叛者。當4個將軍a、b、c、d把敵人包圍了之後,必須協商乙個統一的時間去發起進攻。這時,a將軍派出了3個傳令兵,分別告訴b、c、d將軍,下午1點準時發起進攻。到了下午1點,a、c、d三個將軍發起了進攻,殲滅了敵人,同時他們三個發現b是背叛的。雖然b背叛了,但是對最終任務沒有影響。

但如果a是背叛的,會發生什麼情況?a派出3個傳令兵,分別告訴b、c、d將軍在下午1點、2點、3點發起進攻。於是,到了下午1點,b將軍去攻擊敵人,由於寡不敵眾,全軍覆沒;2點,c將軍全軍覆沒;3點,d將軍全軍覆沒。

因為對於忠誠的將軍來說,他不知道誰是背叛者,所以,他不能完全相信接收到的命令,他必須對命令做出判斷。在2023年,著名的pbft演算法出現了。這個演算法說起來也不難理解,他的核心思想是:對於每乙個收到命令的將軍,都要去詢問其他人,他們收到的命令是什麼。

回到剛才的第二種情況(a是背叛者),a派出3個傳令兵,分別告訴b、c、d將軍在下午1點、2點、3點發起進攻。b將軍派出傳令兵去告訴c和d兩位將軍,b收到的命令是下午1點進攻。c也同樣派出了傳令兵分別告訴b和d兩位將軍,c收到的命令是下午2點進攻。d也同樣告訴b和c兩位將軍,d收到的命令是下午3點進攻。於是,b得到了3條指令:a命令b下午1點進攻,a命令c下午2點進攻,a命令d下午3點進攻。b很容易判斷出來,a是背叛者(因為b知道最多只有乙個背叛者)。c和d也能做出同樣的判斷。因此這次進攻時間的協商是無效的。

採用了這種辦法以後,另一種情況又會怎樣?當b是背叛者,a將軍派出了3個傳令兵,分別告訴b、c、d將軍,下午1點準時發起進攻。b告訴c說b收到的命令是下午2點,b告訴d說收到的命令是下午2點,c和d分別告訴另外2個將軍,a告訴他們的命令是下午1點。

於是,c、d收到的訊息都是兩個1點,乙個2點。對於c、d而言,不需要判斷是a和b誰是背叛者——他們只需要執行收到多的那個命令就可以了。

如果a是忠誠的,那麼b是背叛的,這種情況下對於a來說,他知道自己是忠誠的,他發出的命令,至少有2個將軍會執行,所以下午1點,a、c、d三個將軍一起去進攻,有3個將軍一起發起攻擊,敵人被殲滅了。如果b是忠誠的,那麼b會收到兩個1點乙個2點,b也會執行收到多的命令,於是b、c、d三個將軍一起去進攻,有3個將軍一起發起攻擊,敵人被殲滅了。不管怎樣,按照這種方式執行,結果是沒問題的。

採用pbft方法,本質上就是利用通訊次數換取信用。每個命令的執行都需要節點間兩兩互動去核驗訊息,通訊代價是非常高的。通常採用pbft演算法,節點間的通訊複雜度是節點數的平方級的。

注意,上面所討論的所有情況裡,還有乙個假設:所有傳遞的訊息都是口頭訊息。意思就是,a告訴b下午1點進攻,b可能告訴c說「a命令我下午2點進攻」。如果採用了書寫的訊息,那麼情況是不一樣的。a派傳令兵給b一張紙,a將軍用自己獨特的筆跡寫的「下午1點進攻」,然後要求b把這張紙傳給c,b在紙上用自己獨特的筆跡簽名表示同意,然後b傳給c,c也簽名表示同意,然後d也同意,最後簽過所有名的紙再給每個人看一眼,就可以讓所有節點一致了。這種採用書面簽名訊息的情況,對演算法要求簡單得多。但是,採用書面訊息的前提是:每個將軍都知道其他將軍的筆跡是什麼樣的,並且無法模仿其他將軍的筆跡。 

在pbft的基礎上,又出現了很多變種演算法,這些演算法往往都帶有一些額外的假設。

但是,對於不同型別的應用場景,有些假設是合理的,有些假設則是不合理的。例如,在類似位元幣的代幣轉賬系統中,不能認為客戶端是忠誠的,因為客戶端很可能會發起雙花交易。因此,當企業希望使用區塊鏈技術改進自己的業務或者開展新業務的時候,一定要選擇適合自己業務的區塊鏈技術和系統。

看懂「拜占庭容錯」,也就看懂了區塊鏈的核心技術

拜占庭將軍問題 模型中,對於將軍們 節點 有兩個預設的假設 假設1的含義是 所有節點對命令的解析和執行是一樣的,這個命令必須是乙個確定性的命令,不能存在隨機性,也不能依賴節點自身的狀態。這個命令不能是心情好就攻擊敵人,心情不好就原地休息。假設2的含義是 忠誠的將軍需要判斷接收到的命令是不是正確的。這...

看懂區塊鏈網域名稱系列(一)

網域名稱是什麼 這個問題大部分人都知道,最開始ip協議出來了,每個上網的裝置,服務端和終端,都有乙個ip位址。但是如果你說你做了乙個東西給別人分享,由於 ip位址的辨識度不高,讓別人記住乙個ip位址,是比較費勁的事情。為了簡化這個記憶,就出現了網域名稱網域名稱系統dns。簡單來說,dns 就是乙個超...

區塊鏈共識演算法 二 拜占庭容錯演算法 BFT

1.拜占庭將軍問題簡介 拜占庭將軍問題 byzantine generals problem 主要指分布式對等網路節點間的通訊容錯問題。2.bft簡介 bft byzantine fault tolerance 即拜占庭容錯,是分布式計算領域的容錯技術,拜占庭容錯 於拜占庭將軍問題。拜占庭將軍問題是...