大型的分佈式多客戶端區塊鏈啟動事件並不常見。昨天(7 月30 日)是ETH 1.0 誕生5 週年:由此可見,如此重大的誕辰盛事更是少之又少。

ETH 2.0 測試網Medalla 於8 月4 日上線,這可能是今年晚些時候信標鏈正式推出前的唯一一次預演。

ETH 2.0 創世機制有一點(也就是我們所說的區塊鏈自引導流程)複雜。我打算詳細解釋一下。對於實際的技術規範,你可以參見我在“ETH 2.0 規範註解” 中的評論。

在下文中,“創世” 指的是信標鏈上線並開始處理見證消息(attestation)和區塊的起始時刻,也就是epoch 0 的slot 0 的開始。

(如果你不想看長文,可以直接跳轉到“場景”一節開始閱讀。)

驗證者保證金

這裡先介紹一下背景。只要向ETH 1.0 的合約發送32 ETH 的保證金以及其它一些數據,任何人都可以成為ETH 2.0 的驗證者。例如,你可以通過Lanchpad 門戶成為Medalla 測試網的驗證者。要注意的是,在Medalla 測試網上,我們使用的是Goerli 測試網ETH !不要嘗試將主網ETH 發送至合約。當然了,等到信標鏈正式上線時,我們將使用真正的主網ETH 。

保證金合約只會對 有效 保證金作出反應,即金額達32 ETH 及以上的單筆保證金、總計金額達32 ETH 及以上的多筆保證金(需要檢查額外的數據,例如,密碼學簽名)。任何無效或不足的保證金都會忽略不計。

信標鏈節點

在預創世階段,只有信標鏈節點會參與ETH 2.0 網絡;一旦創世之後,驗證者就可以立即參與共識機制。信標鏈節點維護系統狀態,並在點對點網絡上互相通信。

因此,在創世之前,會有一些信標鏈節點監聽ETH 1.0 ,並監控保證金合約中的有效保證金。實際上,信標鏈節點不需要一直監控ETH 1.0 :ETH 1.0 上的區塊是有時間戳的,因此在創世之前,節點隨時都能趕上進程。

眾所周知,ETH 1.0 鍊是可以回滾的,原本已經在鏈上的交易也可能因為區塊鏈改變而失效。這就是為什麼你將ETH 轉入交易所時,需要等待30 個區塊才能確保交易確認。回滾的範圍通常很小——只有1 至2 個區塊—— 但是當網絡遭受攻擊時,回滾的範圍會大得多。為了避免ETH 2.0 發生回滾,我們在同步ETH 1.0 時非常謹慎地保持14*1024 秒(約合4 個小時)的延遲。我稱之為對ETH 1.0 的“跟隨距離(follow distance)”。

何時?何人?

對於創世來說,最重要的兩個問題是“何時” 與“何人” ?具體來說,就是“創世會在何時發生?”以及“誰會成為創世驗證者?” 這兩個問題決定了信標鏈的創世狀態,其它狀態都源自創世狀態。

大致過程如下:

監控ETH 1.0 上的保證金流入情況。等過了足夠長的時間,有了足夠的保證金,創建創世狀態。兩天之後,通過觸發創世事件來啟動ETH 2.0。

具體來說,在步驟2 ,我們要找到第一個滿足以下兩個條件的ETH 1.0 區塊:(a)鎖定了足夠多的保證金;(b)區塊中的時間戳沒有過早。創世狀態由這個區塊決定。

影響“何時” 和“何人” 的三大主要參數設置如下:

MIN_GENESIS_TIME,指的是創世事件最早發生的時間。就Medalla 而言,就是Unix 時間1596546000 ,即, 北京時間8 月4 日晚9 點(週二)。 GENESIS_DELAY 是172800 秒,約合48 小時。這是從創建創世狀態到觸發創世事件之間的時間間隔。客戶端團隊可以利用這段時間將創世狀態刻錄到他們的信標鏈節點軟件中。這樣一來,那些不運行驗證者節點的信標鏈節點就不需要繼續監控ETH 1.0 鏈了。我們也有時間來組織創世直播和派對MIN_GENESIS_ACTIVE_VALIDATOR_COUNT 指的是在創建創世狀態之前,我們需要在ETH 1.0 保證金合約中鎖定的有效保證金的最低筆數。就Medalla(以及主網)而言,最少需要16384 名驗證者。

從Medalla 測試網啟動中學到的教訓:雖然我們有時間組織派對了,但44 個小時對確保啟動節點狀態良好、升級後的客戶端軟件能包含所有必要信息、終端用戶易於使用來說,還是有點趕。我們有可能會提高主網的GENESIS_DELEY。

場景

創世狀態是在首個滿足以下兩個條件的ETH 1.0 區塊的基礎上生成的:

這個區塊創建時,驗證者人數不得低於16384 (MIN_GENESIS_ACTIVE_VALIDATOR_COUNT)。時間戳沒有過早(不早於MIN_GENESIS_TIME - GENESIS_DELAY)。

根據上述兩個條件的滿足順序,創世流程可以通過以下兩種方式完成:

1. 先達到最低保證金要求

在這種情況下,條件1 先得到滿足。在最早創世時間之前,我們已經獲得了足夠多的保證金。

根據MIN_GENESIS_TIME - GENESIS_DELAY(最早創世時間減去創世時延)可知,Medalla 的條件2 時間點是北京時間8 月2 日晚9:00(週日)。

我們用來觸發創世事件的ETH 1.0 區塊必須在這個時間點之後挖出。假設這個區塊在北京時間8 月2 日晚9:00:05 (9 點過後5 秒)挖出。

如果保證金合約收到了至少16384 筆有效保證金(包括這個區塊裡面的所有保證金交易),那麼保證金合約中收到的所有保證金也都包含在創世狀態中。因此,ETH 2.0 鏈上有超過16384 名創世驗證者。 (在Altona 測試網上,我們將MIN_GENESIS_ACTIVE_VALIDATOR_COUNT 設置為640 ,但是最後的創世驗證者有685 位。)

這個ETH 1.0 區塊會觸發創世狀態的計算。 Medalla 創世事件將在這個區塊的時間戳的48 小時後準時發生。接著上文的例子,就是北京時間8 月4 日晚9:00:05 。

- 紅色區塊就是首個滿足上述兩個條件的ETH 1.0 區塊-

要注意的一點是,考慮到ETH 1.0 跟隨距離,我們實際上要等待4 小時之後才能獲得創世狀態。也就是說,在當前場景下,我們要等到北京時間8 月2 日下午5 : 00 才能獲得創世狀態。

總結

如果先達到最低保證金要求,創世事件將在最早創世時間的幾秒後觸發。在創世事件觸發的48 個小時之前完成註冊的驗證者都將包含在創世狀態中。

2. 後達到最低保證金要求

在這種情況下,條件2 先得到滿足。由於保證金流入速度較慢,沒有在指定時間達到最低要求。

在這種情況下,我們用來觸發創世事件的ETH 1.0 區塊必須包含第16384 筆有效保證金。假設這個區塊在北京時間8 月5 日晚8:34:56 挖出。

現在,信標鏈狀態將包含16384 名驗證者以及這個區塊中其它有效保證金。因此,如果這個區塊包含多筆保證金,那麼信標鏈狀態中包含的保證金將略高於最低要求。

創世時間是該區塊的時間戳的48 小時後。接著上文的例子,就是北京時間8 月7 日晚8:34:56。

- 紅色區塊就是首個滿足上述條件的ETH 1.0 區塊-

再強調一遍,考慮到ETH 1.0 跟隨距離,我們要等到這個ETH 1.0 區塊挖出4 小時後才能獲得創世狀態。

總結

如果保證金流入速度較慢,創世事件將在包含第16384 筆有效保證金的ETH 1.0 區塊挖出後的第48 小時觸發。創世狀態將包含至少16834 名驗證者,還可能因為這個ETH1.0 區塊中包含的保證金交易數量(使驗證者總數超過16834 個)而稍有增加。

結論

本文已經介紹了ETH 2.0 創世機制的基本內容。

如果你想成為Medalla 測試網上的創世驗證者,請務必在北京時間8 月2 日晚9:00 將保證金發送至保證金合約!

如果你沒有在創世狀態確定前提交保證金,你就只能按照質押時間排隊等待,等到創世後才能加入驗證者集合。排隊時間可能需要幾小時或幾天。