The Science of the Blockchain筆記(三)
拜占庭協定
如同飛機上的感測器,系統一個節點即使崩潰也不會立即停止工作,他們有時會呈現出一種不穩定的狀態,行為表現為一種隨機的狀態。我們稱一個可能呈現任意行為的節點為拜占庭(Byzantine),該節點的表現包括以下形式:
- 根本不傳送任何訊息
- 向不同鄰居傳送不同且錯誤的訊息
- 謊報自己的輸入值
我們將一個存在拜占庭節點的系統中達成的共識(詳見The Science of the Blockchain筆記二)稱為拜占庭協定。該系統中所有非拜占庭節點稱為好節點(correct nodes),如果一個演算法可以在存在f個拜占庭節點的情況下正確工作,則稱該演算法為 f
根據上章對共識的定義我們可以發現在拜占庭協定中一致性(Agreement)和可終止性(Termination)顯然成立,下面來介紹有效性(Validity)如何保證。
有效性
定義 4.3(任何輸入有效性 Any-Input Validity) 最終的決策值必須是某個節點的輸入值。
定義 4.4(正確輸入有效性 Correct-Input Validity) 決策值必須是某個好節點的輸入值。
在一個存在拜占庭節點的系統,實現正確輸入有效性並不容易,因為一個拜占庭節點可以遵守協議,但是如果謊報它的輸入值,此時無法將其與一個好節點進行區分。於是我們需要一個新的定義來替代它。
定義 4.5(全部相同有效性 All-Same Validity) 如果所有好節點起始時具有相同的輸入值 v,則決策值也必須是 v。
根據全部相同有效性,我們可以發現如果決策值是布林型的,可以由該性質得到正確輸入有效性。但如果輸入值不是布林型的,全部相同有效性在很多場景下並不能真正有用。
定義 4.6 (中值有效性 Median Validity) 如果輸入值是有序的,比如實數值,可以使決策值接近所有正確輸入值的中值,以避免拜占庭異常。這裡,與中值的差距取決於拜占庭節點的個數 f。
定義 4.7(同步 Synchronous) 在同步(Synchronous)模式下,節點執行在同步輪次中。在每一輪,每個節點可能向其他節點發送一條訊息,接收其他節點發送的訊息,並進行某些本地計算。
定義 4.8(同步執行時 Synchronous Runtime) 再同步模式下,執行時(Runtime)可以簡單地等同於在最壞情況下演算法從開始到結束運行了多少輪。
接下來我們將嘗試設計一個演算法,使其可以容忍單個拜占庭節點。
有多少個拜占庭節點
演算法 4.9 拜占庭協定(f =1)
1: Code for node u, with input value x:
Round 1
2: Send tuple(u, x) to all other nodes
3: Receive tuple(v, y) from all other nodes v
4: Store all received tuple(v, y) in a set Su
Round 2
5: Send set Su to all other nodes
6: Receive sets Sv from all nodes v
7: T = set of tuple(v, y) seen in at least two sets Sv, including own Su
8: Let tuple(v, y) ∈ T be the tuple with the smallest value y
9: Decide on value y
評論:
- 拜占庭節點可能不遵守上述協議併發送語法上錯誤的訊息,這種訊息很容分辨並被丟棄,但是如果拜占庭節點發送訊息語法正確,內容卻是偽造的,這就難以分辨。
- 有些錯誤難以被輕易發現。如一個拜占庭節點想不同節點發送不同值。但有些錯誤可以而且必定能被檢測出來,如一個拜占庭節點發送一個集合 ,其中包含了他自己的值 ,這個元祖必然會被接收節點 從 中移去(演算法第 6 行)。
- 在此我們假定假節點不能偽造他們的源地址。
引理 4.10 如果
所有好節點都將得到同一個集合T。
證明: 由於
,
,所以我們至少有 3 個好節點。對於每個好節點,都會在第一輪中與另外兩個好節點進行一次通訊,同時也會在第二輪中通過另一好節點確認該值,於是每個好節點的值都將至少出現兩次,而拜占庭節點如果將一相同值傳送了超過兩次,那所有好節點也會收到該值超過兩次,於是被包含進最終的決策中,但如果拜占庭節點發送的值各不相同,那這些值都無法進入最終的決策。
定理 4.11 如果
演算法 4.9將能達成拜占庭協定。
證明: 由引理 4.10 可知該演算法能夠滿足任何輸入有效性,且該演算法將在兩輪後中止,並達成拜占庭協定。需要注意,拜占庭演算法需要達成全部輸入相同有效性,對於滿足任何輸入有效性的決策集合,演算法 4.9 在其第 8 行中通過從至少出現兩次的之中選擇最小值的方法,保證了最後可以得到全部相同有效性。
定理 4.12 如果網路中只包含 3 個節點,且其中一個為拜占庭節點,則該網路不能達成符合全部相同有效性的拜占庭協定。
證明: 為了達成全部相同有效性,一個好節點若是發現另一個節點的值與自己相同,就必須將決策值設定為自己的值。第三個節點可能不同意這個值,但是它可能是拜占庭節點。
定理 4.13 若一個有
個節點的網路中存在
個拜占庭節點,則該網路不能達成拜占庭協定。
證明: 採用反證法,假定存在這麼一個滿足條件的演算法,那麼根據該演算法我們可以在一個只有 3 個節點的網路中解決拜占庭問題,這與定理 4.12 矛盾,所以不存在這種演算法。
國王演算法
Algorithm 4.14 King Algorithm (for f < n/3)
1: x = my input value
2: for phase = 1 to f + 1 do
Round 1
3: Broadcast value(x)
Round 2
4: if some value(y) at least n − f times then
5: Broadcast propose(y)
6: end if
7: if some propose(z) received more than f times then
8: x = z
9: end if
Round 3
10: Let node v i be the predefined king of this phase i
11: The king v i broadcasts its current value w
12: if received strictly less than n − f propose(x) then
13: x = w
14: end if
15: end for
引理4.15 演算法4.14實現了全部相同有效性。
證明: 如果所有好節點初始時擁有相同的輸入值,則好節點們在第2輪都會提議這個值。所有好節點將會接收到至少n-f個提案,因此所有好的節點將保持這個值,並且不會切換到國王的值。這個結論對所有階段都適用。
引理4.16 在n>3f的情況下,如果一個好節點提議x,不會有其他好節點提議另一個值y(y≠x)。
證明: 採用反證法。假設一個好節點A提議x,並且有另一個好節點B提議y (y≠x)。注意到一個好節點只會在接收到n-f次包含同一個值的訊息之後才會提議這個值,並且最多隻有f個拜占庭節點發送x給A且發生y給B。我們可以推出下面的結論:A和B都從至少n-2f個好節點處接收到它所提議的值(x或y),且它們的訊息來源沒有交集。於是,網路中將至少存在2*(n-2f)+f=2n-3f個節點。由於3f<n,我們將得到2n-3f>2n-n=n,這與前提(網路中有n個節點)矛盾。
引理4.17 至少存在一個階段,該階段的國王是好節點。
證明: 演算法包含f+1個階段,每個階段的國王都不同。由於系統中只有f個拜占庭節點,因此至少一個國王是好節點。
引理4.18 當n>3f,如果某一輪的國王是好節點,所有的好節點們在這輪之後都不會改變它們的值v。
證明: 如果所有的好節點都將它們的值修改為國王的值,則所有好節點的值都相同。如果某個好節點沒有將它的值改為國王的值,說明它已經至少接收到某個值的提案n-f次,於是至少n-2f個好節點廣播了這個提案。這樣,所有的好節點都會接收到這個提議n-2f>f次(因為n>3f),所以所有好節點都會將它的值設定為這個提案的值,包括國王。注意到根據引理4.16,只有一個值可以被提議超過f次。根據引理4.15,沒有哪個節點會在這一輪之後改變它的值。
定理4.19 演算法4.14解決了拜占庭協定問題
證明: 若以下兩個條件之一被滿足,國王演算法將達成協定。條件一:所有好節點起始的值相同。條件二:在某個階段(該階段的國王為好節點)之後,所有好節點在同一個值上達成一致(根據引理4.17和引理4.18)。我們知道好節點將持續保持這個值(引理4.15)。演算法將確保在3*(f+1)輪之後終止。而根據引理4.15,全部相同有效性肯定成立。
評論:
- 演算法4.14需要f+1個預先指派好的國王。我們在之前假設:這些國王及其輪值king的順序,都是給定的。事實上,指派這些國王本身就是一個拜占庭協定任務。而且這個任務必須在國王演算法執行之前完成。
- 有沒有演算法可以在沒有國王的情況下實現拜占庭協定?有,請見後文。
- 我們能否在少於f+1輪內解決拜占庭協定(或至少是共識)?
“輪”數的下界
定理4.20 在網路中存在f個崩潰節點的情況下,一個同步演算法需要至少f+1輪來達成共識以判定網路中所有節點的最小輸入值。
證明: 反證法。假定存在某個演算法A,A可以在f輪以內解決共識問題。某個節點u1擁有最小的輸入值x,但是在第一輪中,u1在自己崩潰之前,只來得及將自己的訊息(包含它的輸入值x)僅僅發給了另外一個節點u2。不幸的是,在第二輪,唯一看到x的節點u2也僅將x傳送給了另一個節點u3,然後崩潰。這個過程不斷重複,於是在第f輪,只有節點u f+1知道最小的值x。由於演算法A在第f輪終止,節點u f+1將認為最小值是x,而所有其他存活的(好)節點則會接受某個比x大的值為最小值。於是演算法A沒有在第f輪達成共識。
評論:
- 我們也可以得到一個更一般的證明,不需要“判定最小值”這個限制。
- 某些拜占庭節點也可能僅僅崩潰,因此這個下界也對拜占庭協定問題成立。因此演算法4.14的執行效率是接近最優的。
- 到現在為止,我們所談到的拜占庭協定演算法都假定同步模式。那麼,拜占庭協定問題能在非同步模式下解決嗎?
非同步模式下的拜占庭演算法
Algoritnm 4.21 Asynchronous Byzantine Agreement(Ben-or,for f<n/9
1: xi∈{0,1} / input bit
2: r = 1 / round
3: decided = false
4: Broadcast propose(xi,r)
5: repeat
6: Wait until n−f propose messages of current round r arrived
7: if at least n − 2f propose messages contain the same value
x then
8: xi = x, decided = true
9: else if at least n − 4f propose messages contain the same
value x then
10: xi = x
11: else
12: choose xi randomly, with P r[xi = 0] = P r[xi = 1] = 1=2
13: end if
14: r = r + 1
15: Broadcast propose(xi,r)
16: until decided (see Line 8)
17: decision = xi
引理4.22 假設n>9f,當一個好節點在演算法第10行選擇了x,所有其他好節點都會在第10行選擇x
證明: 假設0和1都在第10行被選中,則節點個數至少為2·(n-4f)>n,矛盾!
定理4.23 f<n/9的情況下,演算法4.21可解決布林型拜占庭問題
證明: 有效性:若所有好節點輸入相同的值x,在第一輪就將達成一致,由此可見,我們滿足了全部相同有效性。若好節點輸入值不同,任意決策值都將符合有效性的要求。
一致性:假定u為第一個選定x的節點,且從Su處接受訊息。由於處在非同步模式,另一個節點v可能從Sv處接受到訊息。注意到,Su和Sv中至多有f個節點不同。考慮到拜占庭節點可能會撒謊,v還可能收到f條與u不同的訊息。u至少收到n-2f條包含x的訊息,則v至少收到n-2f-2f=n-4f條包含x的訊息。於是v(任一好節點)將在下一輪提議x。於是滿足一致性。
可終止性:由上,只要有一個好節點終止執行,則所有好節點將在下一輪終止執行。於是我們考慮最壞的情況,即所有好節點都進入第12行,隨機選擇xi。顯然我們希望好節點碰巧選擇了同一個值。根據概率公式計算的概率為2^-(n-f)+1。因此,在最壞的情況下,執行時間將隨節點數量n呈指數增長。
評論:
- 這個演算法證明了非同步拜占庭協定是可以達成的。但由於執行效率過低,該演算法沒有實際價值。