接上一篇文章,XCMP的第三個階段:如何確保中繼鏈主鏈僅包含有效區塊。這涉及整個中繼鏈網路的安全。
中繼鏈由BABE擴充套件,這是一種分岔演算法,意味著中繼鏈可以同時選擇不同的出塊驗證者,且新的塊可能不是基於同一個父塊構建。同時,分配給中繼鏈的驗證者組,和,分配平行鏈的驗證者組都不是固定的,即使中繼鏈和平行鏈使用了相同的驗證者組,這些驗證者組也是從更大的組群裡被靈活隨機抽取分配的。
在這個基礎上,網路的狀態具有可變性的和多樣性:基於BABE會有很多的中繼鏈分支;基於隨機分配驗證者組會有不同意圖(誠實的或者惡意的)驗證者搭配比例來實行驗證檢查工作。
為了網路的穩定,波卡需要確保網路的可變性和多樣性最終能被正確的選擇,即確保最終被納入中繼主鏈的區塊都是被充分驗證是有效的、正確的。那麼,透過在最後確定中繼鏈有效來保證網路的安全,不如從開始確保每一個平行區塊的有效性。平行區塊被平行鏈驗證組確定了有效性後會被納入中繼鏈分支等待被Approve(審批),隨後跟隨確定了終態的中繼鏈分支,被選擇進入中繼鏈主鏈。
下面解釋如何確保平行區塊的有效性。
由上闡述可知,所有被最終態了的中繼主鏈上的平行區塊均應有效,且被批准(approved)。即平行鏈驗證組初步確認“有效”(上一篇講了),中繼鏈驗證組再次驗證並“批准”(這篇要說的)。
綜合來說,波卡用兩個主要元件來確保確定了終態的中繼鏈上不會有任何無效區塊存在:
ApprovalProcess
Dispute
具體過程如下:
當平行鏈的候選者區塊,被平行鏈驗證組確認有效後則被嵌入中繼鏈分支,此時該區塊就被稱為平行區塊。
隨後平行區塊被隨機選擇的中繼鏈驗證者組檢查。這個過程叫Approve process,該過程中,任何驗證者認為其檢查結果和平行鏈驗證者組提交的檢查結果不一致,都可以發起Dispute,即發起爭議,讓全網所有驗證者參與重新驗證,以確保平行區塊的有效性,保證中繼鏈網路的安全。爭議結束後,提交錯誤檢查資訊的驗證者會被懲罰,此處稱為惡意驗證者。
所以:
Approval process 再次驗證平行區塊的有效性,即使之前平行鏈驗證組已經驗證過了。是為了確保被嵌入中繼鏈分支的平行區塊中,僅有效的平行區塊被終態(被批准Approved);以及追究將不正確的區塊包含到中繼鏈分支上的驗證者。
Disputes 發生在Approve process裡,確保捕獲到每次包含無效區塊的驗證,即,阻止包含任何正在被爭議或輸掉爭議的平行區塊的中繼鏈分支,被GRANDPA共識確定終態。
一個用於檢測平行區塊狀態,一個用於檢測狀態。
分開說兩個元件
一. Approvalprocess
中繼鏈分支上有不正確的平行區塊並不是多麼嚴重的問題。
因為只要中繼鏈的終態裝置GRANDPA沒有對不正確的平行區塊進行終態確認,那麼錯誤的中繼鏈分支就可以被恢復,或者反轉為另一個可被消除的中繼鏈分支(因為動態分岔選擇規則可以讓誠實的驗證者忽略任何包含這個不正確塊的分支鏈)。
Approve Process 處理不正確區塊有三個步驟:
驗證者的檢測到疑似不正確的塊
驗證者發起dispute,讓疑似不正確的塊被所有驗證者檢查,
經過dispute後確定該塊是否正確
其中
第一個步驟:通知全節點不要包含這個塊,讓分支鏈回退。
第二個步驟:發起dispute程式。
第三個步驟:確定dispute後的結果,懲罰所有的惡意驗證者。
如果確定這個塊不正確/無效,那麼爭論(dispute)結果會被髮送到所有活躍的中繼鏈分支上,如此惡意驗證者會在它涉及的所有歷史分支中被懲罰,這對於阻止攻擊網路的企圖至關重要。
換言之,不可能存在惡意驗證攜帶自己的資金逃脫中繼鏈的懲罰,因為網路已經轉移到中繼鏈的另一個無攻擊意圖的分支,攻擊者會很容易被識別出來,不能改變網路資訊。
由上可得,一個平行區塊要被中繼連結受且納入終態,是其透過Approve process(檢查階段)後沒有Dispute(爭議),或者是經過dispute後有一個積極的結果。
為了實現這一點,需要檢查程式擁有足夠的誠實驗證者被選中來檢查平行區塊,以及他們不會被惡意驗證者對手干擾。最簡單的方法是每個驗證者都檢查所有平行區塊,但是這顯然太過消耗網路資源,不利於整體網路的擴充套件性。
所以波卡選擇用盡可能少的驗證者來檢查任何特定的平行區塊,這或多或少的犧牲了部分網路的安全性。因為如前文所說,這些驗證者是來自於一個更大的驗證者組(其中至少2/3是誠實的),也就是可能被選中的驗證者都會惡意的,都來自另外那1/3。但這已經是第二次隨機抽取。之前的Backed階段已經進行過一次。
在分配(Assignments)驗證者過程中,波卡透過VRFs選擇哪個驗證者對哪個平行區塊進行確認檢查,以及透過VRFs和分配延遲(assignment postponement)保證每一個平行塊接收足夠的隨機檢查,同時降低對手的勝算,以此增加檢查過程的準確度,以確保網路的安全性。這使得“drive by”(快速掃蕩)這樣的攻擊難以發生,因為延遲系統確保至少有一些最低數量的審批檢查者在工作。
以及如之前的文章提到的,平行區塊在之前被backed的時候(確認可以嵌入中繼鏈分支的時候),已經經歷過一輪這樣的隨機檢驗,兩輪隨機檢驗疊加也是降低錯誤驗證的概率。
透過VRF和delayTranche實現的驗證者分配(Assignments)平衡了以下幾點:
限制惡意驗證者對分配的預知
確保足夠的驗證者來檢查
相對公平地分配檢查者
補充:VRFs保證了有足夠的驗證者來檢查區塊,即超過延遲系統確保的最低數量。且,VRFs需要對手在攻擊時等待更長的時間,這個時間內可能有會有對手的驗證者妥協,這也有助於在幾乎沒有風險的情況下對抗惡意驗證者。在這種情況下,VRF允許減少backing checks但增加審批檢查,這使得波卡網路會更有效率。
使用VRF是因為在波卡里有理想數量的誠實驗證者可以自己簽名他們自己。惡意驗證者同樣在這種情況下會透過自己的檢查者去除掉自己塊,如果惡意驗證者自己洗掉了自己,則延遲系統此時就沒有意義,所以有些塊實際上沒有審批驗證者 ,甚至可能只有一個驗證者。
綜上所訴:
與考慮中繼鏈塊是否被證明相比,證明平行區塊是否被認證更有意義。
一箇中繼鏈區塊包含一個不正確的平行區塊,就會被回退。只有包含了被approved了的平行區塊的中繼鏈區塊才會才被稱為approved。任何特定中繼鏈區塊的有效性都是基於它先前塊的有效性,所以如果一箇中繼區塊的祖先包含錯誤的區塊,那麼這個中繼區塊是不會被終態化。
二. Dispute
每個dispute都源於兩個或多個驗證者之間的分歧。但是如果一個惡意區塊從未分發給誠實的驗證者,那麼就沒有人會對此發起dispute。這種情況甚至都不是對網路的攻擊,可以忽視。
dispute的發起者可能是該平行區塊的支持者之一(即分配給平行鏈的驗證者之一,之前驗證該平行區塊可“backed”),也可能是approval process裡的中繼鏈驗證者。此外,如果在支援階段發生dispute,即平行鏈驗證者驗證階段,則發起者必須將區塊的availability data提供給其他驗證者。如果在Approval process期間發生爭議,則該資料無需提供,被預設為可用。
一旦察覺到有需要被dispute的平行區塊,所有驗證者都有責任參與。dispute發起於鏈下,但在鏈上獲得獎勵。當任何一方(正確或錯誤)達到>2/3驗證者認可數時,dispute大致結束。該協議也可能被暫停,比如任何一方都沒有達到>2/3,當然這種情況只會發生在大多數驗證人出於某種原因而無法投票的情況下。此外,鏈上dispute將在得出結論後仍保持一定的開放時間,以接受批准投票,或再次被dispute。
所以,如果發起dispute的驗證者被證明錯誤了,它也會被懲罰。如果被證明正確,該發起驗證者獲得獎勵,之前的驗證者被懲罰。
另外,波卡需要阻止的攻擊場景,重要程度遞減:
中繼鏈的分支中包含的平行區塊是惡意的
中繼鏈分支支援的平行區塊是惡意的
附在中繼鏈上,但未被其任何分支支援的平行區塊是惡意的
這兩期有點細節化,謝謝大家耐心讀完,感謝大家和BML一起“快學習,慢賺錢”。我們心中有遠方,所以希望在行業初期搭建好每一個維度的基礎,包括對技術、對理念的深入瞭解。
訊息和熱點都是風,支撐我們走遠、走穩、走好的是對價值的理解,而價值是由多維度決定的。
作者:BluemountainLabs,來源:Bluemountain Labs