區塊鏈擴充套件盲分配 (BABE) 是一種區塊生產引擎,其靈感來自另一個權益證明協議 Ouroboros Praos。 它可以單獨使用,因為它提供機率確定性,或者它可以與像 GRANDPA 這樣的確定性小工具結合使用。
BABE 是一種基於槽的演算法。 它將時間分解為多個紀元,每個紀元都被劃分為多個槽。 在 Polkadot 中,每個槽的長度為 6 秒,這是我們的目標區塊時間。 BABE 將選擇一個(或多個)作者在每個插槽中建立一個塊。
將作者分配到這些位置的一種方法是輪流。 然而,在迴圈模式中,攻擊者總是知道下一個作者是誰,並且可以使用該資訊來協調攻擊。 理想情況下,沒有人知道插槽作者是誰,直到他或她證明了這一點。
每個插槽可以有一個主要和第二作者(或“插槽領導者”)。 主要插槽領導者是隨機分配的。 但是,由於該函式是隨機的,因此有時會出現沒有領導者的插槽。 為了保證出塊時間一致,BABE 使用迴圈系統來分配二級時隙領導者。
主要插槽領導者
主要領導是根據可驗證隨機函式 (VRF) 的評估授予的。圍繞區塊鏈中的隨機數有很多炒作。長話短說,許多應用程式都依賴於隨機數生成,但是當所有鏈上操作都必須是確定性的並且可驗證。
VRF 生成一個偽隨機數以及它正確生成的證明。它們將一些引數(包括私鑰)作為輸入。我們的 VRF 需要一個 epoch 隨機種子(由所有節點事先商定)、一個時隙號和作者的私鑰。由於沒有兩個節點具有相同的私鑰,因此每個節點都可以為每個時隙生成唯一的偽隨機值。
每個作者為一個時代中的每個時隙評估其 VRF。對於輸出低於某個商定閾值的每個時隙,驗證者有權在該時隙中建立一個塊。由於隨機槽分配過程,可能有沒有主槽的槽和有多個主槽的槽。稍後我們將討論如何處理。
次插槽領導者
為了處理空槽,BABE 使用迴圈回退。 每個插槽都有一個次要領導者。 如果在槽開始時沒有人聲稱他們是主要的,那麼次要的將建立一個塊。 這種回退將確保每個插槽都有一個區塊作者,並有助於保證一致的區塊時間。
把 BABE 和 GRANDPA 帶到一起
到目前為止,我們有 GRANDPA 敲定鏈和 BABE 建立新塊。 BABE 的一些鏈可能有分叉,因為一個插槽可以有多個領導者。
選擇最佳擴充套件鏈的第一條規則很簡單:BABE 必須建立在 GRANDPA 最終確定的鏈上。 這是使用 GRANDPA 的要求之一。
使用 GRANDPA 的第二個更微妙的要求是區塊生產演算法必須有一種選擇“最佳”鏈的方法。 此屬性導致 BABE 具有機率終結性(因此,您可以在沒有 GRANDPA 的情況下使用它)。
BABE 中最好的鏈就是由主節點建立的區塊最多的鏈。
分叉在 BABE 中很常見。 正如 GRANPA 文章中所討論的,出塊是 O(n),這意味著作者只需將其塊廣播給所有人,而不需要每個人都向所有人傳送訊息(如在 GRANDPA 中)。 因此,並非每個人都會對未完成的鏈(影象中的黃色塊)有相同的看法。
該系統使我們能夠以有效的方式生成塊,並讓 GRANDPA 最終確定其中的一組。
我們根據時間分配時段,但我們沒有單一的時間檢視。 每臺計算機都有自己的時鐘。 我們不能使用集中式時間服務(稱為 NTP 伺服器),因為這是單點攻擊。 攻擊者可以攻擊 NTP 伺服器,要麼將其切斷,要麼控制以採取更肆無忌憚的行為,例如向不同節點發送不同時間。
如果您有興趣,請考慮以下場景:
我收到一條來自你的訊息,說“現在是 8:42:00”。 我的時鐘顯示現在是 8:42:03。 三件事之一是可能的:
1. 我們的時鐘是同步的,網路只用了 3 秒鐘就可以傳遞您的訊息。
2. 傳遞您的訊息實際上花了 1 秒鐘。 我們的時鐘有 2 秒不同步。
3. 你在騙我,你的時鐘不是這麼說的。
現在想象一下,當我的時鐘顯示 8:41:59 時,我收到了這條訊息。 如果我相信你誠實地告訴我你的時鐘說了什麼,那麼我知道我們不同步,我必須把我的時鐘調快。 我仍然不知道透過網路交付所需的時間,所以我不知道我們有多少不同步。
BABE 使用相對時間將插槽編號與單個計算機的時鐘對齊。 當一個節點收到一個塊時,它會檢查接收時間和與該塊相關聯的時隙號。 然後將時隙數與每個塊的時間相加以預測未來的時隙,並使用其資料中的中值。 請記住,驗證者知道他們將提前為其創作的插槽編號,因此他們可以根據此檢查傳入的塊。
到目前為止,我們已經討論了鏈是如何製造的(BABE)以及它們是如何最終確定的(GRANDPA)。 我們要解決的下一個問題是,我們如何讓人們以正確的方式執行這些協議? 本系列的最後一部分將討論執行時如何為執行 BABE 和 GRANDPA 提供激勵以及對錯誤的懲罰。