以太坊2.0 使用權益證明機制來保護網絡,也就是由許多叫做“驗證者” 的計算機線程來投票決定哪一個區塊能夠上鍊(即所謂的“attesting”,作見證),當然也會自己提出備選區塊。不過,驗證者不是僅僅只有“開” 和“關” 兩種狀態:從成為驗證者到退出驗證者的整個生命週期中,其狀態會經過多次轉換。本文會深入研究驗證者的生命週期,展示各階段和轉換過程的實質、如何觸發轉換,以及每種轉換的歷時 1。

先說明一下時間單位:

以太坊2.0 中的時間通常是用“epoch(時段)” 這種單位來度量的,1 個時段是384 秒,也就是六分半鐘。為便於理解,基於這一度量的時間我都轉化成了以分鐘、小時、天為單位,並在附錄的腳註中提供詳細信息。

驗證者生命週期概述

在深入細節以前,我們先來看看驗證者生命週期的概況、了解一下用於表述不同狀態的術語。

- 圖1:驗證者生命週期一覽-

各標籤所示的階段如下:

已存入保證金(Deposited):保證金要約已被以太坊1.0 區塊鏈打包等待激活(Pending):保證金要約被以太坊2.0 網絡接受活躍(Active):驗證者要見證區塊及提議區塊即將退出(Exiting):驗證者即將停止見證及提議區塊被罰沒(Slashing):因為作弊被抓,驗證者停止見證和提議區塊完全退出(Exited):驗證者完全退出,不再參與任一流程

也可由此定義出一種基本狀態:“正在見證(attesting)”,激活、主動退出及完全退出都在該狀態中,處於該狀態的驗證者被指望去見證及提議區塊。這個狀態是最重要的,在此狀態下,驗證者需要連接以太坊2.0 網絡、同步數據,以履行責任,避免被懲罰。

- 圖2:“正在見證” 狀態-

定義完了這些階段之後,我們就來詳細考察它們之間的轉換過程。

保證金存入階段

保證金要約被接受是驗證者生涯的開始;這個接受過程是在以太坊1.0 鏈上發生的,因為驗證者資金原本就放在以太坊1.0 鏈上。但1.0 鏈接受之時,2.0 鏈還不能感知到這筆存款。

驗證者的保證金存入階段大概要歷時7.5 個小時 2,以保證鏈重組影響到Eth1 交易的順序乃至保證金要約無效化的概率足夠小。這個階段完成後,驗證者就進入等待激活階段 3。

- 圖3:從保證金存入階段轉到等待激活階段-

等待激活階段

保證金在Eth1 鏈上存入足夠久之後,它就會被Eth2 鏈接受。這標誌著驗證者正式開始接受Eth2 的組織。假設一位驗證者存入了至少32 ETH 4,那麼TA 就可以開始作見證了。

等待激活的驗證者會組成一個隊列:在一個時間點,Eth2 鏈上能激活和能退出的驗證者數量都是一個比較小的數量(所以要排隊)5,以保證驗證者集合的穩定性。如果隊列是空的,那麼等待激活的驗證者會在大約25 分鐘以後激活 6;如果隊列很長,那可能要幾天甚至幾週才能激活。不過,排完隊之後,驗證者就可以直接激活、參與見證。

- 圖4:從等待激活到活躍階段-

活躍階段

一般來說,一名驗證者的絕大部分時間都處於這個階段。活躍驗證者大約每6 分鐘要發出一條見證消息,偶爾要自己提議區塊 7。驗證者會一直保持在活躍狀態,除非出現下列三種情況:

該驗證者因沒有及時發出見證消息而遭受懲罰,最終其餘額低於16 ETH該驗證者主動要求退出,方法是發送相應的一筆交易(在剛激活的9 天內不能發出此種交易)該驗證者被證明作惡

在前面兩種情況中,驗證者都會被加入退出隊列(一段時間內能離開活躍狀態的驗證者數量也是有限的,就跟能進入的驗證者數量受限一樣,大概是每幾分鐘可以離開1個)。

- 圖5:從激活狀態到即將離開-

在第三種情況下,驗證會被加入作惡者隊列,接受懲罰。

- 圖6:從激活狀態到被罰沒狀態-

值得注意的是,如果有需要,驗證者總是能夠發送額外的保證金要約(包含相同的驗證者信息)來“充值” 餘額(但是有效餘額的上限是32)。這樣就能避免驗證者余額低於16 然後被放到退出隊列裡去。

即將退出階段

雖然主動退出的驗證者表達了停止驗證的意願(不論是自願還是被迫的),但是,他們是不能立即退出的。相反,雖然處於即將退出狀態,他們還是要照常承擔職責,跟活躍狀態時候一樣要見證和提議區塊。這樣保證了網絡的穩定性,避免了驗證者立即退出會造成的衝擊。

就像驗證者想激活的時候有個等待激活狀態和隊列,想要退出的驗證者也有一個隊列,一段時間裡僅允許少量驗證者退出。同樣地,主動退出階段要花費的時間取決於排在前面的驗證者有多少。

- 圖7:從正在退出到完全退出-

被罰沒狀態

驗證者違反協議後被抓,就要立即被罰沒1 ETH(從其餘額中扣除),然後進入被罰沒狀態,這跟即將退出狀態類似,但是還要遭受懲罰。這一點我們在下文的“完全退出” 部分討論。

- 圖8:從被罰沒到完全退出-

處於即將離開狀態乃至已經完全退出的驗證者,都有可能被罰沒(驗證者完全退出到可以取出資金以前有一段間隔,在此期間是可以被罰沒的)。這樣能防止作惡的驗證者利用正常的退出機制、在作惡被發現以前逃之夭夭。結果就是狀態模型變得更加複雜:

- 圖9:補充罰沒條件之後-

完全退出

轉到完全退出狀態之時,驗證者就正式結束了自己的工作,不再需要見證和提議區塊,也不再需要緊跟Eth2 區塊鏈的實時動態了。

轉成完成退出狀態之後,大概還有一天的延遲 8,之後才能取出驗證者余額。不過,如果一個驗證者是從被罰沒狀態中完全退出的,那還要接受兩項額外的懲罰。

第一項,從完全退出到能夠取款的間隔會長得多,要36 天 9。第二項,在這36 天期間,系統還會根據該驗證者作惡被抓的時間點前後18 天內被罰沒的驗證者數量對該驗證者施加進一步的懲罰。那麼該驗證者的有效餘額損失比例 10 將如下圖所示:

- 圖10:被罰沒的有效餘額與同期被罰沒的驗證者比例的關係-

36 天的周期走完,被罰沒驗證者剩下的餘額就能拿走了。

從這個生命流程圖中可以看出,沒有額外的機制讓一個完全退出的驗證者重新激活。因此,一旦某個驗證者退出,其資金就會一直休眠,等待驗證者前來取走。不過,Eth2 Phase 0 時候,資金是不能轉賬的—— 因此所有完全退出的驗證者的資金都仍保存在質押系統中,直至開啟轉賬功能。沒有轉賬功能,是因為用戶帳戶模式還未引入。

補充後的驗證者生命流程

把上面所有詳細信息補充到流程圖中,可以得到一個完整的圖:

- 圖11:補充後的驗證者生命流程圖-

請細看其中補充的條件、各階段的歷時、轉換過程,這些細節對成功運行Eth2 驗證設施非常關鍵。從初始化保證金到取出保證金,這個生命流程圖點出了各階段可能發生的情況,也為驗證者在全時段中的表現提供了清晰的解釋。

注1:要注意的的是,以太坊2.0 的規範沒有一個顯式的狀態機,因此,各階段的名稱都是作者為便於描述而給出的。

注2:1024 個以太坊1.0 區塊的時間加上32 個以太坊2.0 的時段。

注3:這裡假設驗證者存夠了32 ETH。如果沒有存夠,則該驗證者會一直停留在保證金存入階段,直到該驗證者另外發起保證金要約,使其餘額超過32 ETH。

注4:如果不到32 ETH,那還可以另外再存入,提高該驗證者的餘額。

注5:每個時段有(激活驗證者數量+ 主動退出驗證者數量+ 被罰沒驗證者數量)/63356 個名額,下限是4 個。

注6:即4 個時段的長度。

注7:每一個驗證者都需要在一個時段中的某個時隙(slot)發出見證消息,而每一個時隙都會有一名驗證者被隨機選中作為區塊提議者。

注8:256 個時段。

注9:8192 個時段。

注10:注意,罰沒力度最高是100% 的有效餘額,但有效餘額的上限是32 ETH,無論該驗證者的實際餘額是多少。