1. 程式人生 > >權益證明與錯誤的工程思維

權益證明與錯誤的工程思維

在這裡插入圖片描述 近期,許多權益證明(Proof-of-Stake, PoS)專案湧現出來。以太坊 Casper,卡爾達諾(Cardano)的 Ouroboros,等等。對權益證明協議日益高漲的興趣可能源於無限擴充套件區塊鏈的願望,再加上認定“工作量證明(Proof-of-Work, PoW)很 ‘浪費’ ”的錯誤觀念。

但是,關於權益證明協議,有件事還沒有得到足夠多的強調,就是它在處理完最惡劣的情況之後缺乏恢復能力 [作者注1]。舉個例子:導致網路中的大部分節點甚至所有節點掉線或是相互隔絕的極端情況。又或是偷盜/買賣私鑰的風險。

有人可能會認為,這些情況是很罕見的或是不可能出現的,但是,a)這些情況也許並不像你認為的那麼罕見以及 b)即便是發生的概率只有 0.1% 也意味著在長期中它 將會 發生——也就是 Nassim Taleb 所說的黑天鵝事件。

簡單點來說,這些事件幾乎不可能發生,但當它們發生的時候,結果通常是災難性的。我們人類常常低估影響巨大的長尾事件。例如,我們會有一種幻覺,覺得明天肯定是安全的,因為我們在過去 10 年或是 100 年間一直是安全的。

在設計協議的時候,仔細考慮長尾事件是非常重要的,尤其是該協議有潛力成為全球經濟的支柱時,數以百萬計的使用者和業務都會依賴它。

我們必須用對待核反應堆軟體的態度來對待比特幣軟體。在工程的意義上,這一級別的軟體是所謂的關鍵系統(Critical System)。有三種類型的關鍵系統:安全關鍵型、任務關鍵型以及業務關鍵型。比特幣符合三種特徵(丟錢可以是很要命的)。所以壓根不能允許犯錯。

有經驗的工程師在晚上也不會熟睡,即便系統具備了當前比特幣安全性的程度,離完美也還遠著呢。他們知道我們離災難永遠只有一步之遙,不管論文寫得多可靠、系統看來已經平穩運轉了多久。

過去已經出現了好幾個令人矚目的工程錯誤,清楚地證明了這種隱藏的危險。下面是一些例子:

1)協和飛機墜毀(2003)

協和號飛機(1976 ~ 2003)史上僅有的兩種超音速客機之一。協和飛機失事是由於起飛時候爆炸的輪胎撞擊油箱、造成連鎖反應而發生的。而協和號還一度被認為是“世界上最安全的飛機”之一。

2)挑戰者號失事(1986)

NASA(美國國家航空航天局)一開始估計失敗機率只有十萬分之一。Richard Feynman 領導研究發現32 度下 O 型環無法擴充套件。真正的機率非常接近於百分之一。誤差達到了一千倍!

3)福島核電站事故(2011)

日本是在防震技術和地震安全方面是最好的國家之一了。

然而,福島核電站事故還是在你可以稱之為災難的完美組合中發生了:日本有史以來最劇烈的 9 級大地震,再加上千年一遇的浪高15米的海嘯。

在組建關鍵系統時,考慮最糟糕的情形是絕對必要的;如果這些系統是世界範圍內的,這樣的考慮會變得更加重要。

然後,我們來解釋一下工作量證明和權益證明是如何處理網路隔離以及沒有預料到的斷聯的 [作者注2]。

直截了當地說,這些情況並不像人們想的那麼罕見:在……期間,……成功地劫持了 BGP 網路協議以阻止人們發推特。……

你也可以想象戰爭的情形——互相敵對的也許會想要端掉敵人的通訊基礎設施,這很有可能是第一個目標,因為不管是誰,有更好的通訊便佔了上風。

那麼,工作量證明系統或是權益證明在這種情況下有多強韌呢?我們來討論一些例子。

場景 1:一段時期,整個網路都被強制下線,然後重啟。

因為不同地區也許不會同時重啟並重新聯絡上其他人,很有可能最終結果就是從網路被黑之前的最後一個共同區塊開始,幾個地區形成他們自己獨立的鏈,因此分裂成了多條鏈。

跨鏈通訊重建的時候,各獨立鏈上的節點將聯絡上其他人。

在工作量證明中,節點會自動地自我組織並最終被吸引到單一的一條鏈上,就是累積了最多工作量證明(也是最安全的)的那條鏈。這個過程當然會很痛苦,因為一些鏈會被拋棄。但最終它會起作用,人們的行為也是確定的。

在權益證明協議中,節點不知道哪條鏈是更“對”的鏈。不像工作量證明,權益證明沒有客觀的尺度來評判兩條鏈中哪條更“真實”。人們的行為是不確定的;如果不引入一些武斷的規則,不可能實現自動化;但這些規則又會增加受攻擊的面。分裂可能會一直存在下去,因為一些權益證明協議不允許進行太深的回滾。

權益證明協議的設計者在“懲罰”惡意參與者上已經走得太遠。他們沒有考慮過所有節點都誠實地行動、但鏈卻分裂了的可能性!

場景 2:部分網路與主網隔離開來。

可以證明,這種情況的結果跟我們在場景 1 中看到的情形相似。各分割槽將繼續運轉,就好像一切都運轉良好那樣——除了“活動的”保證金節點的數量在每一個孤立的分割槽中都變得更少。各分割槽重新聯絡上主網時,困惑就隨之而來。節點不知道哪條鏈是正確的鏈。

場景 1 與場景 2 的一個主要的區別在於,場景 2 發生的機率會更高。流量重定向總比完全關閉流量容易——我們已經看過這種事發生了。這種型別的分割槽可以小到一個小鎮。可以想象這種事情每幾年就會發生一次,甚至比這還頻繁。

場景 3:在另一些最壞的情景中,比如私鑰被盜,權益證明協議也會更糟糕。

財富分佈常常服從冪分佈(Power Laws,或說少數支配定律),沒有理由認為加密貨幣會是例外。“1% 的加密貨幣持有者”,屈指可數的幾個人,可能掌控著全部貨幣供給的很大一部分,甚至絕大多數。

這些最富有的 PoS 權益所有者的私鑰可能會因為機巧的社會工程學攻擊(綁架、拷打、勒索,等等)而被偷走。通過偷盜私鑰而不是在公開市場上租借或是購買貨幣,攻擊者避免了貨幣價格的上升。奇怪的是,在考慮這種攻擊途徑的時候,權益證明協議的設計者常常假設在公開市場上購買貨幣是唯一一種掌控大多數控制權的方式,因此錯誤地斷定攻擊權益證明貨幣的成本僅僅由其市場價格決定。偷盜私鑰可以乾脆地躲開“防禦”並顯著地降低攻擊成本。

(此類攻擊的一個變種是從以前的大額權益所有者處購買舊金鑰,這些人可能不再對加密貨幣感興趣了。)

在工作量證明中,這等同於控制絕大多數的算力。

一個控制絕大多數算力的人在工作量證明系統裡能做什麼呢?他可以嘗試雙花(Double-spend)或是重寫歷史。但要雙花的話,他得消耗掉一大筆錢。獲得絕大多數的控制力僅僅是第一步。即便在這種場景下,就像它聽起來那麼糟糕的時候,協議還是會像預期中那樣起作用,只有一條鏈可以被認為是有效的(即便 SPV(Simplified Payment Verification,簡化交易驗證)節點會覺得困惑——這也是我們一般鼓勵執行全節點的原因)。重寫歷史要消耗的金額會跟天文數字一樣大,所以丟失使用者餘額的風險不高。使用者可以選擇等待災難過去然後採取行動改變工作量證明演算法。

總而言之,這是非常讓人討厭的情況。但我們可以看到獲得絕大多數的算力在工作量證明中不會讓攻擊者獲得無限的權力。你必須控制絕大多數算力並且花錢去發動攻擊。我們可以認為這是一種 雙層保護機制。當攻擊發生的時候,人們的行為還是確定的,以及,不會對哪條鏈是有效的感到困惑。此種在敵意環境下的恢復能力沒有得到足夠多的重視。

相反,獲得權益證明系統中的絕大多數權益會給你不受限制的權力。不像在工作量證明系統中,你可以雙花而無需消耗任何額外的金錢。你也可以 a)重寫歷史,如果協議沒有檢查點(Checkpoint) 或是 b)導致無從調解的鏈分裂,如果協議有檢查點的話(比如 Casper)。改變權益證明演算法不會有什麼幫助,因為實際上沒有轉換的成本,不像投資在硬體中那樣。

總結一下,進入安全領域,工作量證明會帶來兩種利益:

工作量證明保護未來:當鏈分裂的時候,它會給我們一個客觀的機制,一種可自動化的方式來解決衝突,無需手動的人工干預,也無需信任第三方;

工作量證明保護過去:掌控絕大多數算力仍要消耗鉅額的時間和金錢去重寫歷史,所以賬戶餘額基本上是安全的。

權益證明沒有辦法提供這兩種東西。權益證明的支持者也許會生成檢查點可以緩解問題 #2,但實際上檢查點只會將問題從一個地方轉移到另一個地方。檢查點是一箇中心化的方案,會開啟另一個潘多拉盒子 [作者注3]。

結論是,具備正確的思維對比特幣和區塊鏈協議發展來說是非常重要的。它們理應是能夠適配最高級別工程的關鍵系統。

權益證明建立在有缺陷的並且是幼稚的假設上,它們在最糟糕的情形下會迅速崩潰。權益證明是往錯誤的方向邁出的一步:它會降低而不是提高防禦的質量。

作者注 1:一些早期對權益證明的分析:Andrew Poelstra, “論權益與共識”

作者注 2:網路隔離是一個重要的研究領域。看看 Ethan Heilman 在這個領域的工作

作者注 3:檢查點可以用一種去中心化的方式來實現,但它們會導致一些問題,要求完全的中心化解決方案,所以實際上檢查點就是中心化的。