原文標題:《以太坊 2.0 slash 機制詳解》
撰文:InfStones
slash 意為大幅削減,是 PoS 共識公鏈常用的對作惡驗證人的懲罰機制,以太坊 2.0 的 slash 規則可能是目前所有 PoS 公鏈中最復雜的一個。通過研讀以太坊 2.0 設計規范與源代碼,對其 slash 規則做如下解讀,
slash 的種類
slash 一般指對嚴重作惡行為的懲罰,而非對普通離線節點的懲罰,后者一般被稱為 inactivity penalties,在一般的 PoS 公有鏈中,一般只有「雙簽」類行為會觸發 slash,而在以太坊 2.0 中則特定為下列行為:
- 在同一個 slot 中提議兩個沖突的區塊;
- 在同一個 slot 中投給兩個沖突的區塊;
- 投票與歷史投票沖突,
行為 a, b 會造成區塊鏈上不必要的分叉,行為 c 則是企圖篡改歷史。
slash 后驗證者狀態
slash 后,驗證者將被強制進入驗證者退出隊列,然后退出。
驗證者將立刻被扣除 有效余額 /128 作為罰金。如果有效余額是 32ETH,則為 0.25ETH,(需要注意,原設定懲罰量為 有效余額 /32 也即 1ETH,只是在信標鏈階段暫時下調至原值的四分之一)
8192 個 epoch (約 36 天)后,驗證者賬戶允許提款(在以太坊 2.0 支持交易功能后),
允許提款前,被 slash 的節點將在每個 epoch 開始收到 3 倍于在線獎勵的懲罰。
被 slash 的驗證者不被允許再次回到驗證者隊列,只能重建新的驗證者并重新質押。
多節點同時 slash 的情形
有效余額 /128 的懲罰和每個 epoch 的不在線懲罰之外,還會在被 slash 的 epoch 和允許取款的 epoch 中間一半的位置,也就是被 slash 后 4096 個 epoch 時再受到一次額外懲罰,
該懲罰比例與這期間所有被 slash 的驗證人總余額與全網活躍驗證人總余額的比例成正比,
原設定正比系數為 3,當前信標鏈階段暫時下調至原值的三分之一也即系數為 1,也就是說之后多節點 slash 的額外懲罰會變為當前的 3 倍,
因此,一個驗證人節點 slash 后會受到三次懲罰:
- 立刻被扣除有效余額 /128 (之后會調為有效余額 /32)
- 每個 epoch 的開始受到懲罰(當前數據每天約 0.009ETH)
- 多節點同時 slash 的額外懲罰
舉報獎勵
slash 機制不光對觸發 slash 的節點有懲罰,對舉報 slash 的「舉報人」也會有獎勵,正常來講會獎勵分為兩部分,一是獎勵提交 slash 的「舉報人」,金額較大(目前約 0.1ETH),一是獎勵打包 slash 區塊的出塊者,金額較小(目前約 0.025ETH),目前來看大多數情況下兩部分獎勵都是直接轉移給出塊者,
觸發 slash 的原因
除非有意為之,大部分過失 slash 發生的情形都是因為在兩臺服務器上運行了相同的驗證人密鑰,也即兩臺服務器運行同一個節點。「一用一備」是傳統服務器冗余防宕機的通用做法,很可惜在有 slash 機制的 PoS 公鏈節點運行問題上,不能如此簡單地處理。
InfStones CEO Jonathan Shi 曾在公開演講中提到:在區塊鏈領域里安全性不等于可靠性。在傳統互聯網中,安全性和可靠性并不矛盾,可以通過增加系統冗余的方式提高安全性和可靠性,但在區塊鏈中,如果對出塊節點做冗余性設計,則很有可能造成多個節點同時出塊,導致雙重簽名;但若不對節點做冗余性設計,就會出現單點故障,如果這個節點掉線,則會導致整個系統服務宕機,影響系統的可靠性。
此外,客戶端一般默認有 slash 保護歷史記錄,該記錄通過記錄所有歷史的 attestation 和 proposal 記錄來預防 slash。如果在運行過程中不慎刪除該記錄,也有可能導致 slash 問題。
質押并建立一個驗證人節點,只是第一步也是最簡單的一步。