鏈聞 ChainNews:

本文介紹:權益證明相對於傳統的共識算法,驗證節點可以存在和消失,甚至驗證節點的絕對數量也會隨着時間而增加或者縮小。因此固定模型就顯得很模棱兩可,在動態模型中,這種情況也不應該發生,那麼,如何解決吶?看看 V 神如何應對。

作者 | Vitalik Buterin

編譯 | nuszjj

在傳統的共識算法中,不論他們是同步,還是部分異步或是完全異步的網絡模型,又或者他們是通過簡單容錯,拜占庭容錯或者責任容錯的方式來設計,通常來說在一個協議中的模型包含固定的參與者,至少有些部分是嚴格按照協議施行的。

但是在權益證明中,驗證節點可以存在和消失,甚至驗證節點的絕對數量也會隨着時間而增加或者縮小。這一次設定的 80% 驗證節點也許會比另一次設定的 20% 驗證節點要少,那什麼是固定模型就顯得很模棱兩可,那麼在動態模型中,也許不應該有這種情況發生。那麼我們應該怎麼辦呢?

第一個需要解決的問題是同步的權益證明,也就是說,傳統的鏈狀權益並且不包含最終結果。使用這類算法的包括點點幣,NXT 類型的算法,DPOS,在 Manuve 白皮書中提到的首個算法,還有目前在運行的其他項目。這裏的問題很簡單,因爲不可能達到或者維持「經濟計算結果」;反而,目標很簡單,就是創建正反饋的機制,可以激勵驗證節點可以在有分叉的情況下,確定主要的區塊,並且隨着時間加強這條主鏈上區塊的權威。

如果是固定的驗證節點設置,分叉的規律很簡單:最長的鏈勝出。但是,如果驗證節點的設置是動態呢?那麼,我們需要避免的攻擊如下。

假設一條鏈將 1000 萬 ETH 作爲權益,但是其中有 450,000 (4.5%)被攻擊者控制。現在,假設攻擊者開始從某個區塊開始維護他們自己的私有鏈。他們不允許新的驗證節點進入他們的鏈,雖然他們確實包含了轉賬撤回的選項。隨着時間推移,最後這條鏈上唯一的權益抵押就只有攻擊者,也許會有一些例外。儘管這條鏈有少了很多的 ETH 權益抵押,但是看起來卻高質量很多,因爲區塊生產者會在 90% 的時間出現,但是在主鏈上的區塊生產者很顯然是用戶,並且會更加經常離線。因此,簡單的最長鏈模型也會進入這類攻擊。

爲了解決這個問題,我們使用在工作量證明中同樣的方法:我們不只是尋找最長的鏈,而是最長的,困難權重最大的鏈,在這種情況下,困難度等於在某個時刻權益抵押的 ETH 數量。

驗證節點設置現在可以隨意進出,甚至在隨着每個區塊進行完全地改變。不論這些節點設置發生了什麼,經濟環境仍然是同樣運行,爲最有可能獲勝的結果創造激勵,擁有越多 ETH 的鏈會比擁有更少 ETH 的勝出。

爲什麼上述案例是相對簡單的原因是權益證明的結構會獨立地對每個信息進行評估,並且懲罰錯誤,因此即使參與者的身份每毫秒交換一次,經濟模式也不會改變,因爲不論他們的歷史情況如何,每個人都有相同的激勵。以太坊最近的 Casper 設計,在另一方面,會懲罰這種含糊其辭的情況,也就是說驗證節點發送兩條互相沖突的信息。

在這個模型中,驗證節點設置改變的情況很難處理,因爲安全認證是在你假設驗證節點設置是不變的,但是實際情況是變化的。

一種可能性是簡單粗暴地讓節點設置每次只能改變少於 1%,因此來保證你可以維持一些程度的安全,只要每 33 個週期中有 1 個新的區塊可以完成。這實際上是可以的。但是這個方案卻不是讓人很滿意,並且我們可以在更完整分析這個問題後得出更好的結論。

也許有人會本能地想起另一個想法「爲了維持可持續性,我們可以等驗證節點 A 來確認驗證節點 B,然後讓驗證節點 B 從那兒開始。」爲了想明白這些是怎麼運作的,想想以下的算法:

每個區塊必須要包含下個區塊驗證節點的哈希值。

對於將要有效的區塊,它必須指出一個有效的母區塊,並且證明(例如,有足夠多的相同序列號的 COMMIT)母區塊已經完成。也就是說,每個區塊都必須要完成。

這裏要注意區塊之間發生的共識,也就是說,會有「產生區塊 1,完成區塊 1,產生區塊 2,完成區塊 2。。。」這樣的順序,不想我們其他的算法,甚至在之前區塊共識完成之前新的區塊也會在生成。在這種情況下爲了出現分叉,就需要在某個區塊高度,區塊發生分散,所以我們可以使用我們的安全認證方法來展示在這個區塊高度的 1/3 驗證節點可以削減。

但是,如果我們嘗試將這個應用到「交織共識」模型中,產生新區塊和完成舊區塊可以同時完成,這也是 Casper 最新版中的案例,但是有一個挑戰。因爲並不是 100% 確定共識會在每一個週期都達成,我們不能簡單地讓在第 N 輪的區塊成爲第 N+1 輪的驗證節點;如果第 N 輪沒有最終完成,那麼 N 輪就會有 2 個競爭的候選人,你會遇到通過兩個不相連的驗證節點完成 2 個有衝突的鏈。

那麼如果我們通過使用第 N50 輪來確定地(N+1)50 輪的驗證節點,來解決這個問題,並且希望每 50 輪你總是完成至少一次。但是,這也會有問題:

所以如果我們想要交織共識,我們還需要做什麼?首先,需要注意狀態轉移功能其實是有關於是否給定區塊有無完成的部分信息:如果一個區塊已經完成,那麼證據就可以及時上傳到鏈上,或許也不會,但是如果一個區塊沒有完成,那麼這個證據就絕對不會被上傳。我們可以將這個「是或者可能」的預言是完成。

讓我們來利用這個特性。如果預言機說可能,我們就不改變驗證節點設置;如果它說是的,那麼我們就進行改變。

不幸地是,事情沒有這麼簡單。

這裏的問題在於我們不能立刻對是否有共識這件事情達成共識,所以某人可以通過兩組不同的驗證節點設置來生成母子區塊。

所以從這我們就可以得到我們的解決方案。我們會保留以上的結構,但是我們將增加條款,每個區塊都必須同時被之前的和新的認證節點完成。也就是說,在任何情況下,我們之前會需要從 2/3 活躍的驗證節點中獲得某種類型的信息,現在,我們需要從舊的驗證器集合的大約 2/3 和新的驗證程序集的 2/3 中得到這個消息。

現在,讓我們看看如果對於給定區塊是否完成有爭議的情況。

證明這個可行很容易。給定任何母區塊,子區塊只可以擁有兩種可能的驗證節點:由母區塊本身的驗證節點,還有母區塊加入的爲那個區塊服務的驗證節點。如果有 2 個子區塊,並且都完成了,那麼母區塊中的 1/3 驗證節點都會被削減。如果其中有子區塊沒有完成,那麼任何子區塊中的驗證節點都不會改變,因此證明邏輯就轉移到任何確實完成驗證的衍生鏈。

我們如何才能將這個和其他共識機制結合呢,包括之前說過的各種共識和分叉選擇機制?以上所說的機制在任何鏈上有檢驗的模型中都可以運行,不論檢驗是否互相直接跟從,或者之間是否有區塊。所以的問題在於,給定一個檢查點,如果這個檢查點完成了檢驗,那麼它可以創造子檢查點,反映出已經完成或者沒有完成。

對於分叉選擇原則,我們不通過計算單個驗證節點,而是選擇之前驗證節點的最少 commit 以及更新驗證節點的 commit。這就是我們需要的所有資源。

更多精彩內容,關注鏈聞 ChainNews 公衆號(id:chainnewscom),或者來微博@ 鏈聞 ChainNews 與我們互動!轉載請註明版權和原文鏈接!

來源鏈接:medium.com