V神親訴Serenity設計原理,帶你了解這項宏偉工程背後的獨具匠心!
編者按:本文來自Unitimes(ID:Uni-times)編者按:本文來自

Eth1.0 鏈的設計原理文檔見:
https://github.com/ethereum/wiki/wiki/Design-Rationale
二級標題
二級標題
二級標題
Serenity 設計原則
▲簡潔性:特別是由於加密經濟PoS 和二次分片(quadratic sharding) 在本質上很複雜,因此協議應該在其決策中盡可能地追求最大的簡潔性。這是非常重要的,因為這將能夠:
(i) 最大限度地減少開發成本,
(ii) 減少發生意外安全問題的風險,且
(iii) 使得協議設計人員更容易讓用戶確信參數選擇的合法性。
通過此鏈接[1]了解相關的背景信息。當我們為了實現特定級別的功能時,是無法避免一定的複雜性的。複雜性的優先級別是:Layer2 協議的複雜性> 客戶端實現的複雜性> 協議規範的複雜性。
▲輕客戶端的可驗證性:鑑於一些安全性假設(例如網絡延遲,攻擊者預算界限,只存在1/n或少數誠實的驗證者),驗證O© 數據(理想情況是只驗證信標鏈)的客戶端應該能夠獲得間接的保證,即整個系統的所有數據是可用且有效的,即使在受到51%攻擊的情況下(備註:這是“深度防禦性”方面的其中一個目標)。
二級標題
二級標題
二級標題
Layer1 與Layer2 的折衷
讀者可以先閱讀我之前的兩篇文章:Layer 1 Should Be Innovative in the Short Term but Less in the Long Term [2]和Sidechains vs Plasma vs Sharding [3]。
在任何區塊鏈協議設計中,在Layer1 (即共識層) 引入更多的特性,與構建一個更為簡潔的Layer1 協議並在Layer2 (即應用層) 上允許構建這些特性,這兩者之間各有折衷之處:
支持Layer2 的論據:
減少共識層的複雜性(參見上方提到的“簡潔性”);減少修改協議層的必要性(參見上方提到的“長期穩定性”):
--降低無法達成共識的風險;
--減少協議治理和政治風險方面的工作量
隨著時間的推移,擁有更多的靈活性和實現新想法的能力
支持Layer1的論據:
減少由於缺乏強制每個人升級到新協議(即硬分叉) 的機製而導致進展停滯的風險;
可能會降低整個系統的複雜度;
如果Layer1 不夠強大,那麼就不可能在Layer1 上搭建具有所需性能的Layer2 系統(參見上方提到的“充裕性”)
以太坊2.0的設計在很大程度上都是要致力於謹慎地在Layer1 和Layer2 之間保持平衡。這包括(i) 類似圖靈完備的、包含豐富狀態的代碼執行,(ii) 在數據有效性和計算方面的擴展性,以及(iii) 更快的區塊確認時間,這對於協議實現【充裕性】都是非常必要的,因為:
如果不實現(i),那就無法具有穩健的信任模型來搭建Layer2 應用程序。
如果不實現(ii),那擴展性將僅限於借助狀態通道或者Plasma 等技術實現,而這些技術在推廣以及資金鎖定和/或大規模退出方面存在挑戰。
如果不實現(iii),那就無法在不使用通道技術的情況下進行快速交易,而通道技術在推廣以及資金鎖定和/或大規模退出方面存在挑戰。
但以太坊2.0也將一些其他的特性有意地留給了Layer2 來實現:(i) 隱私性,(ii) 高級編程語言,(iii) 可擴展的狀態存儲,以及(iv) 簽名方案。這些特性留給Layer2 來實現,是因為這些方面都是快速創新的領域,現有的許多方案具有不同的特性,並且不可避免地要進行權衡,以獲得更好、更新的方案。比如:
簽名方案:Schnorr 簽名、BLS 簽名、Lamport 簽名等等
二級標題
參見:
https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ
https://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51
二級標題
二級標題
二級標題
為何使用Casper?
當前權益證明(PoS) 共識算法主要要三個陣營:
受到中本聰啟發的權益證明算法(比如Peercoin (點點幣)、NXT (未來幣)、Ouroboros (Cardano 的共識算法) 等實用的算法)
受到PBFT (實用拜占庭容錯) 啟發的權益證明算法(比如Tendermint、Casper FFG、Hotstuff 等算法)
CBC Casper (解釋詳見[4] 和[5])
在後兩個陣營存在一個問題,即是否使用以及如何使用保證金存款(質押金) 和Slashing (質押金罰沒)。這三種權益證明機制都優於工作量證明(PoW),但我們想在本文捍衛一下以太坊2.0使用的方法。
質押金罰沒(Slashing)
以太坊2.0 使用一種Slashing (質押金罰沒) 機制,即被檢測到行為不端的驗證者將會被懲罰,最輕微的懲罰是銷毀~1%的質押金,最嚴重的懲罰是銷毀驗證者的所有質押金。
我們通過以下幾個方面來為Slashing 機制的使用進行辯護:
如果同時擁有一個主節點和備份節點成為常態,那麼攻擊者就可以對區塊鍊網絡進行分區,並使所有驗證者的主節點和備份節點提交不同的區塊,從而導致兩個相互矛盾的區塊被敲定。 slashing 懲罰有助於在很大程度上抑制這種操作,降低發生這種情況的風險。
正文
正文
正文
共識算法的選擇
我們選擇Casper FFG 只是因為它是協議在實現確定性時可用的最簡單的算法。當前我們正在積極探索在以太坊2.0的階段3將之切換為CBC Casper。
二級標題
二級標題
二級標題
Sharding,或者說我們為何討厭超級節點?
對於Layer1 擴展而言,sharding (分片) 方式的一個主要替代方法就是使用超級節點(supernodes),超級節點要求每個共識節點都擁有一個強大的服務器,這樣該節點就能單獨地處理每一筆交易。
基於超級節點的擴展方式很方便,因為很容易實現:這與當前很多區塊鏈採取的方式一樣,除了需要進行更多的軟件設計工作來以一種更加並行化的方式進行構建。
我們不選擇這種使用超級節點的方式,主要理由如下:
驗證池中心化風險:在一個基於超級節點的系統中,運行一個節點將需要消耗一筆高昂的固定成本,這使得能夠參與進來的用戶數量受到限制。雖然有些人會反駁道“在大多數PoW 和PoS 加密貨幣中,共識是由5-20 個池子(礦池或驗證池) 控制的,而這些池子可以很好地運行節點。”但這種觀點的問題在於忽視了其中存在的中心化壓力風險,即便是財力雄厚的池子之間也存在這種風險。如果運行驗證者的固定成本相對於回報來說是非常高的,那更大的驗證池就能夠提供比小型驗證池更低廉的手續費,這將可能導致那些小型的驗證池被排擠並感受到進行合併的壓力。而在分片系統中,質押更多ETH 的驗證者將需要驗證更多的交易,因此成本並不是固定的。
二級標題
二級標題
安全模型
二級標題
安全模型
人們通常認為區塊鏈的安全性依賴於“大多數參與者是誠實的”這一假設,即≥50%的參與者將會誠實地遵循既定的協議,會為了個人的利益放棄叛變的機會。
事實上,(i) “大多數參與者是誠實的”這種假設並不切實際,因為參與者可能會“懶惰(lazy)”,在不驗證區塊的情況下簽署區塊(參見驗證者帶來的困境[9] 和比特幣SPV挖礦導致的分叉[10]),這都是非常普遍的叛變情況;但幸運的是,(ii) 區塊鏈通常會通過一些安全模型(而非假定大多數參與者將保持誠實) 來維護自身的安全特性。
一種常見的較為嚴苛的安全模型就是非協同的理性多數模式(uncoordinated rational majority),即參與者會按照自己的利益行事,但相互協同的參與者數量不會超過一定的比重(在簡單的PoW鏈中,這一比重為23.2% [11])。
另一個更為嚴苛的安全模式是應對最糟情況的模式,即當單個參與者控制了超過50%的算力或質押金時,此時的問題就變成了:
(1)在這種情況下,我們能保證驗證者在試圖破壞整條鏈時將付出非常高昂的成本嗎?
(2)我們可以無條件地保持哪些保證?
下表中展示了預計的安全特徵:

二級標題
二級標題
二級標題
Casper 設置的激勵機制
基本獎勵(Basic rewards)
在每個epoch 期間(在以太坊2.0中,每生成64個區塊(大約6.4分鐘) 稱為一個epoch),每個驗證者都要進行“證明(attestation)”,也即對鏈頭(head ) 進行投票簽名(鏈頭也就是頂端區塊)。如果驗證者的“證明”被包含在了鏈頭中,那該驗證者將獲得獎勵,這個獎勵由五個部分組成:
因“證明”被包含在頂端區塊中而獲得的獎勵;
因“證明”明確了正確的epoch 檢查點而獲得的獎勵(備註:每個epoch 期間的最後一個slot 被稱為checkpoint (檢查點),slot 為協議設定的生成一個區塊所需的時間( 6秒));
因“證明”明確了正確的鏈頭(頂端區塊) 而獲得的獎勵;
因“證明”被迅速地包含在鏈上而獲得的獎勵(如果“證明”是在1個slot之後就被包含在鏈上,那驗證者將獲得全部獎勵;如果在n 個slot 之後才被包含在鏈上,那獲得的獎勵將是全部獎勵的1/n);
因“證明”明確了正確的分片區塊而獲得的獎勵。
在每種情況下,實際獎勵的計算如下。如果B 是基本的獎勵,P 是執行所需“證明”操作的一部分驗證者,那麼任何執行了所需操作的驗證者所獲得的獎勵將是B*P,而任何本該執行相關操作但卻未進行該操作的驗證者將受到-B 的懲罰。這種“集體獎勵”機制的目標是“如果有人表現得更好,那每個人都表現得更好”,從而限制惡意破壞因素。 (參見本文[13] 查看有關惡意破壞因素的描述以及為何限制這些因素非常重要)
需要注意的是,上方第4點是一個例外;這種獎勵取決於“證明”被採納的延遲性,而不是取決於驗證者的行為,而且沒有懲罰的風險。
基本獎勵B 本身的計算方式是,其中D1...Dn 是驗證者質押金的規模,k 是一個常量。這是兩種常見模式的折中方案,這兩種常見的模式是(i) 設置固定的獎勵率,也即k*Di,(ii) 設置固定的總獎勵,也即。
反對(ii)的的主要論據是,這種模式將會使網絡更容易遭受“discouragement attacks”攻擊,詳見[13]。
達到收支平衡的在線時間
正文
正文
Inacivity leak
正文
假設存在兩種驗證者:(i) 發揮作用的在線驗證者,和(ii) 離線的驗證者,如果前一類驗證者部分是P,基本的獎勵是B,那麼在線驗證者預計將獲得的獎勵是:上方第1、2、3、5種情況下的獎勵B*4P + 上方第4種情況的獎勵7/8*B*(P+(P*(1-P))/2+(P * (1-P)^2)/3+...) (因為“證明”有可能會因為驗證者缺席而延遲被包含在鏈頭中) +區塊提議者獎勵1/8*B*P 。驗證者缺席(即本該參與驗證而實際上並未進行驗證) 將受到的懲罰是B*4。因此,如果所有其他驗證者都在線,那驗證者在線時將會獲得B*5 的獎勵,而離線時將會受到B*4 的懲罰,因此如果驗證者在線的時長為≥4/(4 + 5)≈44.44%,那驗證者將能夠處於不賠不賺(收支平衡) 的狀態。如果P=2/3 (即在線的驗證者佔所有驗證者總數的2/3),那驗證者將會因為在線而獲得的獎勵是≈B*(2/3*4.125+7/8*0.81 )≈B*3.46,或者將為因為在線時長≥53.6%而達到收支平衡的狀態。
但是,如果P 低於2/3 (即在線驗證者的數量低於總數的2/3),那針對離線的驗證者將會受到稱為“inactivity leak”的懲罰。
如果以太坊2.0鏈在超過4個epoch的期間都未能實現確定性(finality),那將會增加額外的懲罰,使得最大可能的獎勵是零(未能正確執行操作的驗證者受到懲罰),且還會增加第二個懲罰,此懲罰將會根據在多少個epoch期間未能實現finality 而成比例地增長。這是為了確保如果超過1/3 的驗證者下線,那這些離線的驗證者將會受到更為嚴重的懲罰,且這種懲罰會隨著時間的推移而成倍地增長。
這將帶來三個影響:
離線驗證者將會受到更嚴重的懲罰,因為此時驗證者的離線實際上會阻止區塊被敲定;
這意味著,如果50%的驗證者離線了,那區塊會在21天之後重新開始被finalize,因為21天之後,所有離線的驗證者已經損失了50%的質押金(16 ETH),而如果驗證者的質押金低於16 ETH 將被驅逐出驗證者行列。
正文
正文
正文
Slashing & 反相關性懲罰
如果驗證者被發現違反了Casper FFG 的slashing (罰沒) 條件,那該驗證者將受到懲罰(損失一部分質押金);如果大約在同一時間還有其他驗證者受到slashing 懲罰(具體來說,就是從該驗證者被懲罰的前18天到該驗證者退出驗證者行列的這段時間),那這種懲罰將是之前的三倍。這樣做有幾個目的:
這會對實際的攻擊行為進行嚴重地懲罰,但對可能並非惡意的單個獨立失誤採取非常輕微的懲罰;
BLS 簽名
正文
正文
我們使用驗證者抵押消息的簽名作為所有權證明,該簽名明確了簽名的密鑰以及其他重要的信息,比如取款密鑰。
二級標題
二級標題<- hash(seed,二級標題
隨機選擇驗證者
未來我們計劃使用VDF (可驗證延遲函數) 來進一步增加隨機性種子抵禦操控的魯棒性。
正文
正文
正文
由於打亂驗證者(shuffle) 就是一種置換,在每個epoch 期間,每個驗證者都會被指定為一個長期委員會的成員;
正文
正文
正文
交聯委員會
每個epoch (64個區塊,約6.4分鐘) 之後,信標鏈都會重新為每個分片鏈重組一個分片委員會(也即打亂驗證者)。對驗證者進行快速打亂,是為了確保如果攻擊者想要攻擊某條分片鏈,那該攻擊者將需要快速地破壞(控制) 該分片委員會。
正文
正文
正文
為了進一步維護網絡的穩定性,並不是所有的驗證者都會同時從n 時間段的長期委員會中輪換為n+1 時間段的長期委員會;而是每個驗證者的輪換都會有所延遲,直到下個時間段的某個隨機時間點再進行輪換。
二級標題
二級標題
LMD GHOST 分叉選擇規則會合併來自所有驗證者的信息,確保在正常情況下任何一個區塊都不可能會被逆轉。由於該分叉選擇規則依賴於所有的驗證者,這也確保了除非攻擊者控制了50%以上的驗證者,否則無法逆轉區塊,因為這種情況下攻擊者無法通過操控隨機性來獲得很大的優勢。
二級標題
二級標題
二級標題
信標鏈/分片鏈結構
以太坊2.0分片系統的結構包含一個協調所有活動的中心“信標鏈”,以及1024條分片鏈。每條分片鏈都會定期地通過交聯(crosslink) 的方式與信標鏈相連接。
這種分片結構的替代方案:
(1)通過委員會對分片區塊進行簽名,將所有分片區塊都直接地放入信標鏈中;
(2)不存在信標鏈,而是通過某種結構將所有的分片鏈連接起來。
上述第(1)種結構被捨棄的原因是:對分片鏈區塊設置一個6秒的時間(slot) 是可取的,但是每6秒在信標鏈上進行1024次交聯將會導致信標鏈承受非常高的負荷。
上訴第(2)中結構被捨棄的原因是:中心輻射型的信標鏈結構比任何復雜的構造都更容易實現和理解。
分片鏈的設計
每個分片都是一條半獨立的鏈,它可以比交聯聚合區塊更快遞處理區塊(目標是3-6秒)。這使得交易在被信標鏈(通過交聯的方式) 確認之前,能夠通過分片長期委員會快速地獲得一定程度的確認。
分片鏈結構是這樣的,每個區塊都由分片委員會的每個驗證者進行證明(attest),這保證了驗證的簡單性,並確保分片區塊獲得了程度相當高的確認;大多數處理較低價值的應用應該都可以依賴於單次確認。
在每個epoch 開啟時,每個分片區塊都包含了一個指向其父塊的pointer 和一個指向信標區塊的pointer。信標鍊和分片鏈之間的這種半緊密耦合是為了(i) 確保分片鏈知道有關其長期委員會的信息(因為此信息是由信標鏈生成的),同時(ii) 使驗證分片鏈區塊稱為一個決定哪條鏈才是規範信標鏈的可行方式。
分片鏈狀態(獎勵、懲罰、歷史累加器) 被故意設計成小於區塊大小,目的是確保如果欺詐證明有需要,分片鏈狀態可以完全被放入信標鏈之中(雖然這可能只會在階段2放寬限制,在階段2,每個單獨的執行環境的狀態將受到此大小的限制,但所有狀態合併起來將非常大,因此欺詐證明將需要默克爾證明)。
交聯數據
創建一個簡單的字節數組,可以對欺詐證明進行評估。
二級標題
二級標題
二級標題
驗證者生命週期
質押
驗證者通過發送一筆交易來進行ETH 質押(這筆交易會調用部署在Eth1.0 鏈上的抵押合約(deposit contract) 的一個函數) ,最終我們會在Eth2.0鏈上加入進行質押的方式。驗證者的這一操作明確了:
與用於對消息簽名的私鑰相對應的公鑰;
取款憑證(即公鑰哈希,當驗證者在完成驗證之後,公鑰哈希將用於提取資金)
這些值都是由簽名密鑰進行簽名的。將簽名密鑰(signing key) 和取款密鑰(withdrawal key) 分開,目的是讓更具安全風險的取款密鑰得更加安全(取款密鑰處於離線狀態,不會與任何質押池進行共享等等),而簽名密鑰則用於在每個epoch 期間對消息進行簽名。
激活
抵押合約(deposit contract) 中保留著所有質押的默克爾根(Merkle root)。一旦驗證者質押的默克爾根被包含在了Eth2.0 鏈中(通過Eth1.0 數據投票機制),Eth2.0 區塊提議者就可以提交一個該質押的默克爾證明,並啟動質押過程。
當某個驗證者往抵押合約中發送了一筆交易之後,就立即加入了驗證者登記表中,但該驗證者一開始處於未激活狀態。只有當至少4個epoch 之後,該驗證者才會被激活;驗證者之所以需要等待至少4個epoch (每個epoch 大約6.4分鐘),是為了確保RANDAO 沒有被操縱,且如果很多驗證者同時加入進來,那N 可能會超過4。
退出
如果Eth2.0中已經存在的驗證者總數是|V|,那每個epoch 期間能夠新加入的最大驗證者數量將是max(4, |V|/65536);如果更多的驗證者想要加入進來,那他們將需要排隊,系統將盡可能快地進行處理。
當某個驗證者從Eth2.0 系統中退出時(無論是通過發布一個自願退出消息,還是由於被罰沒而退出),那該驗證者也將需要進行排隊才能從系統中退出,每個epoch期間能夠退出的最大驗證者數量與上文所述的能夠新加入的最大驗證者數量一樣。
取款
之所以設置這種新加入/退出排隊的限制,是為了確保系統中的驗證者總數不會在任何兩個時間點之間變化太快,這確保了只要驗證者足夠頻繁地登入(如果驗證者總數≥262144,那驗證者保證能夠每1-2個月登入一次),那就能保證以太坊新舊兩條鏈之間依舊存在確定性。相關原理參考[17]和[18]。
取款
一旦驗證者成功地通過排隊退出了,還需要等待大約27小時的時間才能進行取款。這一等待時間有幾個作用:
這確保瞭如果該驗證者有不當行為,將有時間抓獲該不當行為,並對該驗證者進行罰沒(slashing);
這為對託管證明發起挑戰提供了時間。
正文
大多數基於驗證者余額的計算都使用驗證者的“有效餘額(effective balance,EB)”;唯一的例外就是有關增加或減少驗證者余額的計算。只有當驗證者的餘額B 低於EB 或者高於EB+1.5 時,EB 才會調整為等於floor(B)。這是為了確保有效餘額不會經常改變,減少每個epoch 期間重新計算狀態所需的hashing 量;平均而言,只需要更新余額,而每個驗證者只需相對更少地對有效餘額進行更新。
二級標題
二級標題
二級標題
分叉機制
Fork數據結構包含了(i) 當前的“fork ID”,(ii) 前一個“fork ID” 和(iii) 切換這兩個分叉的slot。當前區塊高度的fork ID 影響著所有消息的有效簽名;因此,使用一個fork ID 簽名的消息對於使用任何其他fork ID 的驗證函數無效。
通過在某個“fork slot” 增加一個狀態轉換就可以進行分叉。簽名驗證函數將使用消息所在的slot 的fork ID 來驗證該消息,這個fork ID 有可能是前一個fork ID,也有可能是當前的fork ID。
[1]:https://radicalxchange.org/blog/posts/2018-11-26-4m9b8b/
[2]:https://vitalik.ca/general/2018/08/26/layer_1.html
[3]:https://vitalik.ca/general/2019/06/12/plasma_vs_sharding.html
[4]:https://vitalik.ca/general/2018/12/05/cbc_casper.html
[5]:https://medium.com/@aditya.asgaonkar/casper-cbc-simplified-2370922f9aa6
[6]:https://eprint.iacr.org/2015/702.pdf
[7]:https://bitcoin.stackexchange.com/questions/38437/what-is-spv-mining-and-how-did-it-inadvertently-cause-the-fork-after-bip66-wa
[8]:https://twitter.com/VitalikButerin/status/1145576103089602560
[9]:https://eprint.iacr.org/2015/702.pdf
[10]:https://bitcoin.stackexchange.com/questions/38437/what-is-spv-mining-and-how-did-it-inadvertently-cause-the-fork-after-bip66-wa
[11]:https://arxiv.org/abs/1507.06183
[12]:https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding
[13]:https://ethresear.ch/t/censorship-detectors-via-99-fault-tolerant-consensus/2878
[14]:https://github.com/ethereum/research/raw/master/papers/discouragement/discouragement.pdf
[15]:https://link.springer.com/content/pdf/10.1007%2F978-3-642-32009-5_1.pdf
[16]:https://github.com/ethereum/eth2.0-specs/blob/master/specs/core/0_fork-choice.md
[17]:https://ethresear.ch/t/rate-limiting-entry-exits-not-withdrawals/4942
[18]:https://ethresear.ch/t/weak-subjectivity-under-the-exit-queue-model/5187


