Vitalik:以太坊 Serenity 設計依據綜述
今天是除夕,Unitimes 在這裡祝大家新年快樂!:) 今天我們為大家分享 Vitalik 撰文闡述以太坊 Serenity 階段的設計依據,希望讀者們在閱讀本文之後,能夠更進一步瞭解以太坊 Serenity 背後的開發者們是如何來設計這個全新的 PoS 區塊鏈網路。以來為正文內容:
閱讀本文之前,回顧一下以太坊1.0的設計依據,效果會更佳哦:
https://github.com/ethereum/wiki/wiki/Design-Rationale
1. 設計原則
● 簡單性 :由於與加密經濟學相關的權益證明 (PoS) 和二次分片 (quadratic sharding) 本身就很複雜,所以協議本身的決策過程應該儘可能簡化。這一點很重要,因為它不僅能夠(i)最小化開發成本,還能(ii)降低我們無法預見的安全風險,並(iii)使使用者更容易相信協議設計者,認同某種引數選擇是合理的。如果你想要更詳細地瞭解有關(iii)的哲學背景,請參見 https://radicalxchange.org/blog/posts/2018-11-26-4m9b8b/ 。當我們在具體的功能實現中不可避免要引入複雜性的時候,這種複雜性的首選順序會是:第2層協議>客戶端實現>協議規範 。
● 長期穩定性 :協議的底層部件在構建時應該儘可能地達到理想狀態。如此一來,在相當長的一段時間內我們便無需考慮對底層進行變動,而是把精力集中在更高的層面(比如客戶端實現或者第2層協議)上,去進行任意的創新。
● 充足性 :從本質上而言,我們應該能夠基於協議去構造儘可能多的任意類別的應用。
● 深度防禦性 :協議應該能夠在各種潛在的安全假設(比如網路延遲、故障計數、使用者動機等)下儘可能地持續運作
● 完全輕客戶端可驗證性 :給定某個假設(比如網路延遲、攻擊者的預算上限,1/N或者M/N的少數參與者是誠實的),驗證O©資料(理想情況下只需驗證信標鏈的資料)的客戶端應該能夠間接保證整個系統中的所有資料都是可用且有效的——即使在發生51%攻擊的情況下也是如此(請注意:這裡的51%攻擊案例是“深度防禦性”的一個子集)。
2. 為什麼選擇“最終化+保證金+罰款”模型呢?
對於諸如 Tendermint / Casper FFG / Casper CBC 這類具備傳統 BFT (拜占庭容錯) 風格的權益證明共識演算法來說,它們與其它共識演算法的競爭性及差異在於,這些演算法使用的都是基於鏈的演算法,比如點點幣 (Peercoin) 和未來幣 (NXT) 中都使用了這些演算法。
這些演算法肯定比工作量證明 (PoW) 更好。除此以外,我們認為傳統的 BFT 風格的系列演算法具有更強大的屬性,這同時也是它們擁有強烈需求的原因。
● 極其高昂的51%攻擊成本
我們希望能夠建立一個強硬的機制,即任何對權益證明區塊鏈發起51%攻擊的攻擊者都將要承擔昂貴的費用(比如數億美元),並且遭受攻擊的鏈條能夠從攻擊中快速恢復。這將使得攻擊/防禦推演的結果十分不利於攻擊者。事實上,發起攻擊的結果可能適得其反,因為價格上漲給合法的持幣者所帶來的收益遠遠超過了服務中斷所帶來的損失。
在BFT系列演算法中,最終化回滾攻擊將產生明確的證據,該證據可用於罰沒攻擊者的保證金,從而實現這一目標。此外,我們還可以通過在社群中協調發起一次包含誠實驗證者的少數軟分叉來規避51%審查攻擊。考慮到 Casper FFG 的運作機制,一旦少數派對鏈條發起了軟分叉,多數派將必須要作出分叉選擇:要麼切換到正確的分叉鏈,並且因為自身曾經的錯誤選擇損失一部分保證金,或者堅守攻擊鏈,並且為此損失絕大部分的保證金。
不具備最終化特性的共識演算法無法實現這些屬性。
● 驗證者線上率超過50%
Serenity 的分片使用了一種機制,即如果隨機抽樣的驗證者委員會中有2/3的成員對來自某個分片中的區塊進行簽名,那麼我們就認為該區塊已被接受。這種機制本身要求平均有大於或等於2/3的驗證者線上以接受任何分片區塊。但如果有超過50%的驗證者線上,那麼我們就可以得知:除非網路中存在顯然會違反協議規則的驗證者,否則我們將得到某種程度的保證,即區塊不會被回滾。因此,我們沒有理由不新增這麼一個特性。
● 解決驗證者的困境
所有區塊鏈都存在一個共同的問題,即驗證者沒有足夠的動力去實際驗證他們正在構建的區塊。因為在這個均衡中,如果(幾乎)每個人都是誠實的,那麼對於驗證者來說,這些交易根本不值得他們浪費計算資源去校驗。
而在分片鏈中,這些問題被進一步放大了。我們可以通過(利用保管證明 Proofs of Custody)對簽署無效或不可用資料的行為實施大額罰款來緩解這些問題。但是,在實際執行中,實施罰款不僅需要驗證者繳納安全保證金,還要求鎖定期限足夠長,以允許其他使用者校驗驗證者所宣告的資料,並在資料出現錯誤時對其發起質詢。
3. Casper激勵機制中的每個引數的設定標準是什麼?
● 基礎獎勵
--證明中指明正確的來源,獲得1/4獎勵
--證明中指明正確的時期檢查點,獲得1/4獎勵
--證明中指明正確的鏈頭,獲得1/4獎勵
--證明中指明正確的分片區塊,獲得1/4獎勵
在不同的情況中,實際獎勵的計算方式如下:如果 ? 是最大獎勵值,並且 ? 是執行所需操作的驗證者所佔的比例,那麼任何執行所需操作的驗證者都將獲得獎勵 ?*?。此外,任何未執行所需操作的驗證者將遭受罰款-?。制定這種“集體獎勵(即“如果有人表現得更好,那麼每個人都會表現得更好”)”方案的目的是設定破壞因子的界限(想了解破壞因子的定義及重要性,請參閱:
https://github.com/ethereum/research/raw/master/papers/discouragement/discouragement.pdf )
需要注意的是,我們還要進一步解決兩個難題:
1. 如果該證明被包含在區塊鏈內的時間延遲了,那麼獎勵將減少。這是為了激勵驗證者及時釋出證明。
2. 提議者將獲得他們所包含的任意證明的獎勵的1/8。這是為了鼓勵提議者充分監聽訊息,並儘可能多地接受這些訊息。
● 驗證者靜止漏洞
如果鏈條在 ???(time since finality,即達到最終化以後所經歷的時間。其中,??? > 4 個時期內未能保持最終化狀態,那麼參與這個過程的驗證者的獎勵將降為零,並且第二個懲罰機制將被載入,該懲罰與 ??? 成比例。這確保瞭如果超過1/3的驗證者陷入靜止狀態,那麼不線上的驗證者將會受到更嚴重的懲罰,並且懲罰隨著時間的推移呈二次方遞增。
► 如果你的離線行為將阻礙區塊的最終化程序的話,那麼你將會因為離線這一行為遭受更嚴重的懲罰
► 確保一旦發生超過1/3驗證者離線的情況,由於離線驗證者的保證金在不斷減少,最終驗證者的線上率會回升到2/3。
在當前的引數化條件下,如果區塊無法被最終敲定,那麼驗證者在2.6天后將損失1%的保證金,在8.4天后損失10%,在21天后損失50%,以此類推。這意味著,如果發生50%驗證者離線的情況,那麼區塊將在21天后重啟最終化程序。
● 罰沒和反相關懲罰
如果某個驗證者被指證刻意違反 Casper FFG 的罰沒條件,那麼該驗證者所承擔的罰款會是在與他們大致相同的時間內受到懲罰的驗證者的三倍。這麼做是出於以下幾個理由:
► 單個驗證者作惡只會對網路造成不良影響,但如果他們選擇與其他驗證者同流合汙,那麼這些隨波逐流的驗證者有必要接受嚴厲的教訓
►這一機制會對實際的攻擊行為實施嚴厲懲罰,但對那些可能是誠實的單個孤立故障節點只實施非常輕微的懲罰
►這一機制確保較小的驗證者所承擔的風險要比較大的驗證者的風險更少(在正常情況下,大型驗證者發生故障所造成的影響相當於一堆小型驗證者同時宕機的結果)
►這一機制能夠有效阻止驗證者“跟大隊走”
● 罰沒和反相關懲罰
如果某個驗證者被指證刻意違反 Casper FFG 的罰沒條件,那麼該驗證者所承擔的罰款會是在與他們大致相同的時間內受到懲罰的驗證者的三倍。這麼做是出於以下幾個理由:
► 單個驗證者作惡只會對網路造成不良影響,但如果他們選擇與其他驗證者同流合汙,那麼這些隨波逐流的驗證者有必要接受嚴厲的教訓
► 這一機制會對實際的攻擊行為實施嚴厲懲罰,但對那些可能是誠實的單個孤立故障節點只實施非常輕微的懲罰
► 這一機制確保較小的驗證者所承擔的風險要比較大的驗證者的風險更少(在正常情況下,大型驗證者發生故障所造成的影響相當於一堆小型驗證者同時宕機的結果)
► 這一機制能夠有效阻止驗證者“跟大隊走”
● 保管證明
當驗證者需要對某個資料為?,根為?的分片區塊進行證明時,驗證者需要計算出?'(其中,?'[?] =???(?[?], ????))以及新資料?'的根?'。然後,驗證者將釋出一部分?'作為他們所簽署的內容的一部分,並通過釋出 ℎ??ℎ(????) 的形式來提交種子。在一定時限內,網路中的其它節點可以對這些資訊進行質詢,並要求驗證者提供他們的????引數、完整的?′值以及 ? 和 ?' 的特定分支,以證明這些資料被正確構造。如果驗證者在質詢期開始之前提前釋出????引數,那麼他們將受到罰沒懲罰。
構建這種機制是為了緩解驗證者的雙重困境。在該困境中,驗證者可能會出於懶惰而拒絕驗證資料,並假設所有其他驗證者都是誠實的。如果大多數驗證者都這麼想的話,那麼很可能會導致公地悲劇,最終導致鏈條接受無效的區塊。而在這一機制中,如果驗證者試圖提交沒有經過他們親自處理的資料的話,那麼他們將無法計算出?'(如果他們嘗試外包給別人處理,那麼外包方可能會背叛他們,並導致他們遭受罰沒懲罰)。一旦這時有其它節點提出質詢,那麼這些驗證節點將無法正確迴應質詢。出於效率原因,驗證者首先只提交一部分?'。一旦驗證者釋出了他們的????引數,那麼任何人都可以重做並檢驗他們的計算結果。如果該?'值不正確,那麼檢驗者將會發動一系列質詢來炮轟該資料為?′且計算不正確的區塊。
4. 為什麼規模是32個ETH驗證者?
任何具備可審計容錯特性(即如果有兩個相互衝突的區塊被最終敲定,你可以分辨出是哪1/3節點作惡)的 BFT 共識演算法必須讓所有驗證者都參與其中。此外,由於技術原因,你還需要通過兩輪每個驗證者都參與的流程來最終敲定某條訊息。
這將使我們不得不考慮去中心化/最終化時間/開銷三者的權衡(原文詳見 https://medium.com/@VitalikButerin/parametrizing-casper-the-decentralization-finality-time-overhead-tradeoff-3f2011672735 ):假設?是網路中驗證者的數量,?是敲定區塊的時間,ω是每秒鐘所產生的訊息傳遞開銷,那麼我們可以得到:
舉個例子,如果我們能夠容忍每秒鐘傳送10條訊息的開銷,那麼在一個擁有10000個節點的網路中,其最終化時間至少為2000秒(約為33分鐘)。
在以太坊中,如果我們假設總 ETH 供應量約為 2^27 個ETH,那麼在 32 ETH 保證金規模的條件下,網路中最多有2^22個驗證者(這是在每個參與者都參與驗證的情況下;一般來說,我們認為參與驗證的 ETH 規模要減少10倍)。如果最終化時間為2個時期(即2 * 64 * 6 = 768秒),那麼這意味著每秒鐘所產生的最大訊息開銷將為 (2^22)/768 ≈ 5461。但我們可以容忍如此高的開銷。因為藉助於BLS聚合方案,我們可以將每個簽名的邊際大小減少到1位元,並將邊際驗證複雜度降低到一個 ECADD 操作。
出於另一個原因,64個時隙已經是安全範圍內的最小值:如果攻擊者操縱用於挑選提議者的隨機性,那麼這個數字仍然能夠提供足夠的空間以確保每個時期中至少存在一個誠實的提議者,從而充分確保區塊能夠實現最終化。我們的計算表明:目前程度的開銷是可以接受的,但更高的開銷將會增加執行節點的難度。最後,當前的驗證者保證金規模是實現分片交聯的理想選擇(詳見下文)。
5. 隨機抽樣?
在每個時期,每個分片都會產生新的交聯。這意味著,在一個由128個驗證者組成的隨機選擇池(即“委員會”)中,有2/3驗證者簽署了一個表示自最新的交聯以來所產生的所有資料都被包含在特定分片的雜湊。而之所以選擇128,是因為這個數是有效防禦攻擊的最小規模。我們需要防止佔比小於總驗證者集合1/3的攻擊者在隨機選擇的過程中佔據委員會的2/3(通過二項式定理計算,其概率為5.55∗[10^(−15)])。
由於網路中存在1024個分片,這意味著在每個時期獲取一次交聯,我們就需要有131072個驗證者,或者大約440萬ETH押注(實際上,如果ETH的押注規模小於此數,那麼交聯發生的概率會降低)。如果我們提高最小保證金規模,比如提高到1024 ETH,那麼這將意味著我們無法獲得足夠的驗證者來進行交聯,除非所有的ETH都押注進來。
6. LMD GHOST 分叉選擇規則
信標鏈使用的是 LMD GHOST 分叉選擇規則,具體的細節請參閱:
https://github.com/ethereum/eth2.0-specs/blob/master/specs/core/0_beacon-chain.md#beacon-chain-fork-choice-rule
LMD GHOST 分叉選擇規則包含來自所有驗證者的資訊,這些資訊在每個時隙內有成百上千條。這意味著在正常情況下,哪怕回滾一個區塊也幾乎是不可能的。此外,由於分叉選擇取決於所有的驗證者,因此,除非攻擊者控制了接近整個驗證者集合的50%比例,否則區塊根本不可能發生回滾。再者,攻擊者也無法再通過操縱隨機性來獲得領先的優勢。
7. 信標鏈/分片鏈結構
分片系統的結構的特點在於其具有一條能夠協調所有活動的中央“信標鏈”,以及分別位於1024個分片內的鏈條。分片通過“交聯”週期性地連線到信標鏈中。
(1)將分片內的所有區塊直接放入信標鏈中,並由委員會進行簽署
(2)不使用信標鏈,而是採用其它結構將分片鏈相互連線
第(1)種方案由於效率原因被否決了:我們希望分片內的出塊時間是6秒鐘,但是在信標鏈中每6秒進行1024個交聯將導致信標鏈內產生不可接受的高負載。
第(2)種方案由於過於複雜被否決了:具有分層分叉選擇特性的中心輪輻型信標鏈結構(先找到信標頭,然後基於信標鏈來計算哪些分片區塊是合格的,並由此確定分片鏈的頭部)在具體實現和推理上遠優於任何更復雜的結構。
本文翻譯:喏唄爾
原文作者:Vitalik Buterin
原文連結:
https://notes.ethereum.org/9l707paQQEeI-GPzVK02lA?view