本文根據上海昇級共學系列活動中Patrick McCorry 的視頻演講內容整理
大家好,我是Patrick McCorry,今天我們探討的是以太坊PoS 機制中的投票協議,在開始之前,我想強調以太坊合併是一項工程壯舉。

以太坊合併真正令人興奮的是它允許大量的驗證者能夠活躍地參與決策過程中,協議目前有超過56 萬個驗證者。如果你在20 年前告訴某個研究共識協議的人,我們可以設計出一個超過50 萬名參與者的系統,他們會認為你瘋了,但今天我們做到了。
只要你有一台普通的計算機,你就可以參與這個協議,這種去中心化的程度鼓舞人心。協議需要關心驗證者,幫助他們積極地參與協議,而驗證者的唯一的工作就是提供交易排序服務。

驗證者選擇用戶的交易,進行排列,並將它們打包成一個區塊,然後將其發佈到網絡,最後所有驗證者共同決定全部交易的總順序。因此,所有的驗證者都可以獲得區塊的副本,按順序執行交易,然後計算數據庫的副本。現在讓我們深入了解以太坊中投票協議的工作原理。
Epochs 和Slots
Epoch 和Slot 在驗證者參與權益證明協議過程中扮演時間表的角色。一個Epoch 代表了權益證明協議的一個完整的回合,每個Epoch 都有32 個Slots,每個Slot 持續12 秒。每個Epoch 持續約6.4 分鐘,分為32 個Slot,每個Slot 12 秒。

每個Slot 都有一個驗證者委員會。該委員會共同努力,並在該時段內提出一個區塊。每隔12 秒,委員會就會提出一個區塊。一個Epoch 代表協議的一個回合,每個驗證者在每個Epoch 中正好被分配到一個Slot。

在上一個Epoch 結束時,我們將從區塊鏈中獲取一個隨機信標,我們今天不會談論它是如何工作的,我們需要知道的是所有的驗證者將根據隨機信標的輸出完成分配。一個Epoch 分配50 萬個驗證者,每個Slots 將有大約17000 個驗證者。所有Slot 中驗證者委員會的規模大致相同,並且會提前兩個Epoch 完成分配,也就是說我們能夠提前12 分鐘知道對於M+1 和M+2 之後的確切的時間表驗證者,驗證者們也有充足的時間查找他們被分配的Slot。驗證者要么進行提案區塊,或者對一個提案區塊進行投票。你可以積極地證明你參與了協議,這也是獲得獎勵的方式,每次投票時,你都會因此獲得相應的獎勵。

一個Slot 實際上也是一個非常嚴格的時間表。在一個委員會中,有一個區塊提議者,其餘委員會成員將根據提議的區塊進行投票。在前4 秒區塊提議者提出一個區塊,在接下來的4 秒內,每個驗證者都可以為提議區塊進行投票,然後在最後4 秒左右,所有委員會成員的投票會被聚合在一起,並發送給下一個Slot 的區塊提議者。Epoch、Slot 和驗證者委員會時間表的意義在於產生一個真正的規範鏈。

驗證者如何進行投票?
那麼驗證者在對什麼進行投票?投票協議如何運作?我們知道投票協議將決定哪條鍊是真正的區塊鏈。

當協議運行時,可能會出現分叉區塊。在左邊的圖片中,我們可以看到一個頂部區塊和一個底部區塊競爭,這時驗證者需要投票來決定接受哪個區塊。他們做出這個決定的方式是使用分叉選擇規則,在右側的圖片中,驗證者挑選了最長的頂部區塊,較短的底部區塊被拒絕。

一個驗證者實際上同時參與2 個投票協議,分別是最長鏈(Longest Chain)協議和檢查點(Checkpoint)協議。

在最長鏈投票中,每12 秒會有一個新的區塊。左圖中的驗證者正在為這些區塊投票,隨著時間的推移,我們確信這個區塊已經完成投票,但它可能會被逆轉。檢查點對於以太坊來說是非常獨特的,它的目標是在每一個Epoch 中,我們都應該嘗試從前兩個Epoch 選擇一個歷史區塊,並決定是否將其作為不可逆的檢查點。用戶的體驗就是:12 分鐘之後,可以絕對保證交易不會被撤銷。先讓我們看一下最長鍊錶決的工作原理:在最長鍊錶決中,每個區塊都是由一個Slot 提出,當區塊被提出時,委員會成員將遵循三個規則。

第一,他們是否及時接收到了區塊,Slot 有嚴格的時間表,他們必須在規定時間內投票。如果沒有收到某一個區塊的提案,就無法為它投票。在這種情況下,驗證者最終會為前一個區塊進行投票,他們要么為得到最多投票的下一個區塊投票,要么為提議者投票,獲得最多投票的區塊最終被保留。最後有一個特殊的規則叫做區塊提議增強。如果一個區塊在Slot 中被提議,我們會給他一些額外的投票,這是三個分叉選擇規則之一,即我們應該總是投票給獲得最多投票的區塊鏈。

第二個規則是驗證者有嚴格的時間限制,他們必須在某個截止日期之前投票。第三個規則是區塊提議增強試圖為最新的區塊添加臨時優勢。即使前一個區塊有更多的投票,我們應該投票給這個Slot 的最新區塊,因此獲得了這種臨時的優勢。最新的區塊並非是最終的,只是遵循最長鍊錶決。一般的歷史區塊可以從最長的鏈轉換。當最長的鏈成為歷史區塊後,他們永遠不會被逆轉。因此區塊鏈的頂端是不穩定的,歷史區塊被永久化確認。檢查點協議的重點並非是對現在的檢查點投票,而是為下一個潛在檢查點投票。這是一個兩輪協議,我們為潛在的檢查點投票,然後讓它成為我們的新基點。

我們稱之為源投票和目標投票,目標投票是選擇最新的檢查點候選者。我們運行投票協議,以決定下一個潛在的檢查點。我們嘗試決定目標投票,在這個時期內,我們將決定第65 個區塊有可能成為檢查點。之前被投票支持的是潛在候選人。源投票是我們之前投票支持的潛在檢查點候選者,投票協議運行一個Epoch,在這32 個Slot 中,我們都在為目標投票。我們知道源之後,都在為同一個目標投票。這將在一個Epoch 中運行,每個驗證者都會投票。當一個新的Epoch 出現時,投票協議就完成了M+1 個Epoch。然後我們可以通過查看結果來看接下來會發生什麼。第33 個區塊是否成為下一個檢查點?第65 個區塊是否成為下一個潛在檢查點?我們評估的方式是查看前兩個投票輪。在投票中,我們可以假設它獲得了絕大多數投票,所有驗證者都投票支持第33 個區塊成為下一個潛在的檢查點。然後在M+1 個Epoch 中,我們再次可以假設所有驗證者都投票支持第65 個區塊。因此投票協議連續兩輪成功,那麼第33 個區塊將成為檢查點。在M+2 個Epoch 中,我們有檢查點、源檢查和目標檢查。

我們正在運行投票協議,在運行成功的情況下,第65 個區塊將成為下一個檢查點,第67 個區塊將成為源投票,然後第83 個區塊將成為我們可以進行下一個潛在檢查點的區塊。檢查點的選擇始終落後於2 個或1 個Epoch,在這一個檢查點確認之後,我們開始等待下一個潛在的檢查點。這兩個連續的輪次保證了驗證者已經兩次投票支持潛在的檢查點,他們確定了潛在檢查點,並且投票支持它成為檢查點,這允許我們驗證所有50 萬個驗證者對區塊鏈具有一致視圖,並且他們都應用完全相同的選擇規則。
如果驗證者有不同的分叉選擇規則會發生什麼?如果他們得到一個提案區塊,他們對其應用規則,但是有些驗證者認為該區塊無效,其他驗證者認為該區塊有效。他們對該區塊存在分歧,那麼分叉選擇規則會發生什麼?共識錯誤確實會發生,它們每隔幾年就會發生,它們在比特幣和以太坊上都發生過,並且通常會導致區塊鏈分叉。在最好的情況下,如果少於1/3 的驗證者運行有錯誤的軟件,則非常好,大多數驗證者運行良好的軟件,那麼所有的事情都會繼續保持一致。運行錯誤軟件和錯誤的分叉選擇規則並對區塊鏈產生分歧的是少數驗證者。

如果區塊32 已經被確認,但是區塊32 是無效的,他們卻仍然投票支持它。如果有任何錯誤的軟件,這些驗證者只會受到輕微的懲罰,例如失去一部分獎勵,但不會損失全部獎勵。現在短期的問題是當一半的驗證者投票支持一個區塊,而另一半的驗證者投票支持另一個區塊時該如何解決。因為他們有兩個不同的選擇規則,沒有任何一個獲得多數投票,所以問題在於兩個區塊鏈都將繼續存在並繼續構建。

如果在第4 個Epoch 之後沒有新的檢查點,那麼協議就會進入緊急模式。灰色委員會成員質疑為什麼藍色投票支持錯誤的區塊,這不遵循規則。而藍色委員會則說為什麼他們投票支持黃色的區塊,這不遵循我的規則。他們兩個意見不一致,而且現在他們的分歧持續時間太長,協議會進入緊急狀態,因為它無法完成區塊,因為兩個大的驗證者集合彼此不同意,他們最終陷入爭鬥。在黃色的區塊鏈中,他們認為自己是正確的,並且會懲罰驗證者者。在藍色的區塊鏈中,他們會說他們沒有投票支持我們的區塊,所以他們是不活躍的。
黃色驗證者現在投票給正確的區塊鏈,但是會受到懲罰,因為他們互相爭鬥,觸發了所謂的非活動洩漏。如果有2 組驗證者,他們存在分歧,並且他們完全同時導致2 個不同的區塊鏈,最終他們會踢掉其他驗證者。所以如果你考慮藍色區塊鏈,他們最終會從他們的區塊鏈中刪除黃色驗證者,這導致了所謂的活動洩漏,如果你在不活動的時候不投票給我區塊鏈中的區塊,我會懲罰你,最終你將不再有重要的投票,活動記分牌可以用於計算投票份額。

從上圖中可以看到,如果你總是離線,不參與投票,懲罰的程度會直線上升,直到失去你在黃色區塊鏈的所有份額。當然如果你在大部分時間內都在線,只會失去一些資金,但不會失去所有。現在解決這個問題的唯一方法是,如果存在兩個不同的分叉,他們只是放棄了其中的一個分叉,可能會有一個永久的分裂。就像比特幣分叉產生了比特幣現金,以太坊分叉產生了以太坊經典。他們不同意彼此,然後他們會投票給不同的區塊,最後他們會互相排斥,以不同的方式拓展下去。所以這真的很酷,因為如果我不同意你的觀點,我會分叉區塊鏈,改變規則,最終我會把你從我的區塊鏈上踢出去。

所以作為志願者,我必須從中挑選一個。我必須決定我想屬於哪個區塊,我不能兩個都投。然後真正的關鍵是如果他們有不同的選擇規則,會怎樣?

如果bug 被最終確定,那麼它將永遠留在區塊鏈中,無法逆轉,這時就需要人們的協調來解決這個問題。這是一個非常糟糕的情況。這就是為什麼我們提倡去中心化和多樣性。

作為一個驗證者,如果我正在運行軟件,我們要確保沒有一組大於1/3 的驗證者在運行有問題的軟件。如果只有三分之一的驗證者有bug,那麼它們可以被忽略一段時間。它們不會影響系統,系統可以繼續前進。所以在運行一個客戶端時,因為如果所有客戶端都有bug,那麼你不會觸發活動洩漏,你也不會失去資金。
所以最後只剩下4 分鐘了。我來快速地回顧一下投票規則。
只有一個條件是所有驗證者都必須滿足的,那就是slashing 條件。只要你不違反這一條規則,那麼你可以隨心所欲地投票。
如果你違反了這個條件,你將被逐出權益證明協議。

讓我們來現在回顧一下投票的全過程。正常情況下,你只需為每個新區塊投票。你對區塊32、64 進行投票,這是正常的投票。

也許你投了一票,你離線了一段時間,你回到線上,然後你投票給一對新的區塊。沒關係,離線是被允許的。

也許你投票給第96 個區塊,目標投票是下一個潛在的檢查點,但是存在分歧,然後你可以投票給新的目標,這並沒有違反規則,因為如果有分歧,來源不會改變,而是輸入新目標。所以有三種投票方式是完全可以接受的。

如果目標投票失敗並且無法就下一個潛在的檢查點達成一致,那麼當你離線後重啟時,不能投同樣的票。

每個Epoch 只能投一票,這實際上是那個Epoch 的目標投票。如果能夠重複投票,就會存在遠程攻擊。例如你投了第64 個區塊和第96 個區塊一票。後來你想試著逆轉歷史,想選擇一個非常古老的區塊,跳過所有最近的區塊進行投票。

本文分享了Epoch 和Slot 的概述,兩種不同的投票協議,以及圍繞投票的規則,你還可以探索很多其他有趣的話題。
