如何應對 51% 攻擊是過去十年來討論很多話題,在史丹佛區塊鏈大會上,以太坊聯合創始人 Vitalik Buterin 發表了題為《越過 51% 攻擊》的演講,他首先介紹了不同類型的 51% 攻擊,例如最常見的回滾交易攻擊,此外還有審查攻擊、輕客戶端攻擊、勸阻攻擊,以及最嚴重的覆巢式攻擊,他認為這對工作量證明(PoW)加密貨幣仍是一個很大威脅。而 99% 容錯共識、及時性檢測器(TD)等技術來檢測攻擊鏈以及審查攻擊,可以使權益證明(PoS)貨幣基本消除 51% 攻擊帶來的威脅。他還稱,「與其讓攻擊者針對 PoW,我們的目標是讓鏈轉向 PoS。」

2 月 19 日到 21 日,由高性能隱私區塊鏈 Findora 團隊成員、應用加密學小組(Applied Crypto Group) 成員、Bulltetproofs 證明機制提出者 Dan Boneh 與 Benedikt Bünz 聯席舉辦,邀請了包括 Vitalik Buterin、 Ben Fisch 等來自知名美國院校,以及 Facebook、瑞波、Visa 等機構的行業知名人物。PANews 作為官方合作媒體,參與本次活動的報導。

以下是 Vitalik 演講實錄,由巴比特編譯。

51% 攻擊能做什麼?51% 攻擊有不同的種類,它們可以對不同的應用執行不同的操作,並產生不同的結果和後果。你可能熟悉的一種 51% 攻擊是回滾區塊。你進行了一筆交易,把錢發送到了一家交易所,然後用這些幣換取了另一個幣,你提走這些換得的幣,然後進行一次 51% 攻擊,恢復你的存款交易……

這就是過去 10 年來,我們一直在討論的主要的 51% 攻擊類型,也是我們考慮最多的一類。

一、其他類型的 51% 攻擊

 交易審查攻擊

實際上,交易審查也是另一種 51% 攻擊!鑑於 layer 2 協議和 DeFi 都是最近的大趨勢,交易審查變得尤其危險。在很多 layer 2 協議的環境中(包括 plasma、通道、通用狀態通道、閃電網絡、Optimistic Rollup、交互計算、TruBit 等),審查就意味著盜竊!

因此,如果你能夠審查挑戰交易,那麼你就可以從人們那裡偷到錢。這不適用於 zk Rollup,但這種攻擊確實適用於人們現在正在考慮的絕大多數協議。在 DeFi 的背景下,審查尤其危險,因為它是一種工具,你可以通過它操縱市場,然後獲取價值。

如果你能審查每一筆接觸 Uniswap 的以太坊區塊鏈交易,然後等待一天,那麼以太幣的價格可能會有點波動,我就能從這次攻擊中提取出大量的套利價值。

可以說,審查是危險的,在 DeFi 協議和 layer 2 協議中,交易審查也可以被視為與盜竊相等。

輕客戶端攻擊

很多人都在運行輕客戶端,如果你運行的是輕客戶端,那麼 51% 攻擊可能會導致這些輕客戶端接受包含完全無效交易區塊的鏈。錯誤的簽名、格式錯誤的交易、未經授權的簽名(從一個賬戶中竊取資金並將其轉移到其他帳戶),他們可以得到網絡接受的可用區塊。

數據不可用攻擊

這裡誰熟悉數據可用性問題?好吧,雖然不是所有人,但有很多人了解了它。這裡的想法是,你可以在發佈區塊頭(block header)的地方創建一條鏈。輕客戶端可以看到這條鏈,但不能在區塊體(block bodies)中發布部分或全部數據。這是糟糕的,原因是,如果數據沒有發布,那麼它可能是正確的,也可能不是,而且又沒有辦法生成證據向其他人證明它可能是正確的,並且你拒絕了人們可能要創建未來交易的信息。也就是說,不可用的區塊也是很危險的。

勸阻攻擊

勸阻攻擊(Discouragement attack)是一個術語,它指惡意破壞其他參與者,導致其他參與者失去收入,並驅使他們與你合謀,或者被迫退出。1/3 以上算力的自私挖礦就是這樣的一個例子。也就是說,51% 攻擊也是非常強大的勸阻攻擊。

關於區塊鏈的不可篡改性

所以說,51% 攻擊是非常強大的,這類攻擊對於區塊鏈的不可篡改性而言是個威脅。

誰還記得這個?一家交易所被盜走了一堆錢,他們考慮推動比特幣區塊鍊為期一天的逆轉,以便拿回這些錢。如果這樣的事情是可能的,那麼區塊鏈內部的東西就可能被還原,區塊鏈就失去了其成為區塊鏈的關鍵屬性,這是可怕的。

另外,51% 攻擊不是民主的,它們是富豪統治的,所以作為一種民主方法,對他們而言是沒有什麼好處的。

二、現實中發生過的 51% 攻擊,以及最糟糕的 51% 攻擊場景

在現實當中,51% 攻擊是可以完成的,這是一張來自 2015 年香港比特幣擴容大會的照片。在這張照片當中,掌控比特幣 90% 算力的一些人坐在了一起,擺出了一副 “我擁有權力” 的姿態,哈哈。

51% 攻擊是可以完成的,例如 ETC、Bitcoin Gold 等都遭遇過 51% 攻擊,我肯定我漏說了 1-2 個,這些攻擊都是已經發生的。

覆巢式攻擊(Spawn camp attack)

實際是,我們目前所看到的 51% 攻擊,並不是最糟糕的。對於這類攻擊來說,覆巢式攻擊(Spawn camp attack)是最糟糕的噩夢場景。基本上,你需要獲得足夠的硬件來攻擊一條鏈,等它恢復之後,然後再次進行攻擊,因為你仍然持有這些硬件。最後,社區會受夠了這種折磨,他們會更換工作量證明(PoW)算法,由於在短時間內他們沒有辦法構建 ASIC,所以你只需要租用大量的 CPU 和 GPU 算力繼續攻擊, 然後,這條鏈就死了,除非他們切換到權益證明(PoS) 或者完全變成中心化的東西。

三、權益證明(PoS)算法能打破這個循環嗎?

這是我在 2016 年寫的一篇博文,我試圖描述什麼是權益證明(PoS) 背後的哲學,以及為什麼這是我們應該期待存在的,它為什麼是一件有意義的事情。權益證明(PoS) 中存在一種不對稱性,它與工作量證明(PoW)是不同的,在工作量證明(PoW)中,你只有獎勵,因此你對參與攻擊或者不參與攻擊的懲罰,只有區塊獎勵這部分。而在權益證明(PoS) 系統中,你的攻擊是可以被檢測到的,你失去的存款遠遠大於你可以被罰沒的質押金。

它們被放入 Casper CBC 和一系列其他基於安全存款和罰沒的權益證明(PoS) 算法中。從理論上來講,這種設計的目標是使 51% 攻擊變得極其昂貴。基本上,你要攻擊一條 PoS 鏈,你需要購買一堆的幣,你需要控制系統中超過 50% 以上的幣,然後當你被抓住要攻擊時,你就會遭遇罰沒,如果你想再次發動攻擊,你必須購買更多的幣,因為你一直在購買,那麼不斷上漲的幣價,最終會導致你破產,因此,從這個角度來看,與其讓攻擊者針對 PoW,我們的目標是讓鏈轉向 PoS。

其它類型的攻擊呢?

現在我們來討論第一個問題,PoS 如何解決其它類型的攻擊呢?到目前為止,我們一直在關注終局性逆轉。這在拜占庭的容錯共識理論中是相當普遍的。基本思想是,如果 2/3 的一方站在一邊,另外 1/3 站在另一邊…1/3 的驗證者必鬚髮出兩條相互矛盾的消息,你可以檢測到並懲罰它們。不過,這是關於逆轉的攻擊。

數據無效、數據不可用、審查以及惡意破壞?

讓我們一點一點解決,我們不會在意數據的有效性,我們將注意到,如果你有數據可用性的保證,並且保證如果一個區塊是區塊鏈的一部分,那麼該區塊中的所有數據都可以由網絡中的一個節點下載。如果你有審查阻力,你發布了一個區塊,那麼它最終會被包含在內,從這兩件事中,你得到了有效性。原因是交互計算、 Rollup 和這些現有協議。基本上,對於 Rollup,你在鏈上發布所有數據,然後鏈保證其可用性,你有一些欺詐證明,並保證如果某些計算無效,那麼你可以發布一個不可審查的欺詐證明,並得到鏈上處理。所以數據的有效性並不是那麼重要的,因為第一層(layer 1)和第二層(layer 2)的欺詐證明可以解決這個問題。

如果你不能審查別人的區塊,那麼你就不能阻止它們被納入區塊鏈。因此,只要激勵措施的懲罰是有效控制的,那麼惡意破壞 (Griefing) 也不會是什麼大問題。

我們可以歸結為兩件事:數據可用性攻擊和審查攻擊。

數據無效和數據不可用

這是我在 2017 年和 musalbas 等人共同撰寫的一篇論文,我在其中描述了一種基本上允許區塊鏈客戶端不實際下載所有數據的情況下,驗證區塊鏈數據可用性的方案。

這個方案的簡單稻草人版本是這樣的:檢查一個區塊是否可用最愚蠢的方法就是下載完整的東西。但在這裡,我們假設一個可擴展的、可能是分片的區塊鏈,其中有超過 2 MB/秒的數據會被上傳到鏈上,而客戶端將無法下載所有的內容。對於一個想要檢查數據可用性的客戶端,我們要做的就是隨機抽樣測試。它會隨機選擇一些數據片段,比如 30 個片段、40 個片段、80 個片段……它會隨機選擇位置,要求提供這些位置的 merkle 證明,只要你收到你接受的所有位置的有效回复,那你就會接受該區塊,將其視為有效的。

如果你接受使用此方案的區塊,那麼你很可能知道該區塊是有效的。如果只有不到 50% 的數據可用,比如這里左邊的所有數據都可用,這裡右邊的所有數據都可用,那麼至少有一個檢查將很有可能是失敗的。

通過這種方案,攻擊者就能夠欺騙少數特定的客戶端。但是,如果攻擊者欺騙了足夠多的客戶端,以至於它們下載的子葉數據占到了總數據的一半,那麼這些客戶端就可以繼續從那裡重建數據。

這並不能證明區塊是完全可用的,它可能缺少了一部分,但它確實證明至少有一半的區塊是可用的。如果我們有一些技術可以從 50% 的數據中恢復整個數據塊,那就太好了。

擦除編碼(Erasure coding)

這就是擦除編碼的用武之地,所以我們要取數據,假設它是一個多項式求值,我們將在更多的點上求值相同的多項式,現在,任何 50% 的數據都足以恢復所有數據。有了這個方案之後,你就可以驗證區塊是有用的,並且區塊是潛在非常大的尺寸下是可用的,同時個人要下載 20-200 KB 的數據。

這是第一部分。這包括數據可用性攻擊,它是以太坊 2.0 分片解決方案的一部分,這至少允許我們賦予分片區塊鏈同樣的可用性保證。

證明正確性

那如何證明一個根(root)是此擦除編碼的根呢?你如何證明自己沒有把垃圾數據卡在裡面?你可以使用欺詐證明,例如這個 2D 的,如果你編碼錯誤,然後有人可以做一個簡短的欺詐證明,你可以將它廣播到網絡,然後網絡就可以拒絕該區塊。這個 2D 方案是在 2017 年開始研究的。最近則有一些關於編碼 merkle 樹的東西,你在 merkle 樹中編碼每一個 level ,這有很好的特性。也有一些方法不依賴於欺詐證明,比如使用 STARK 或 SNARK 來證明 merkle 根的計算是正確的,而另一種可能則涉及多項式承諾—— 你會得到你的數據,你會把它解釋為多項式的求值,你會計算出多項式,然後你在一大堆點上做一大堆多項式承諾的 opening(開口),你的數據可用性檢查將是要求 80 個位置而不是 80 個 opening(開口),或者如果你使用聰明的代數得到某種多開口(multi-opening),你就可以獲得更高的效率。

這些方案的好處是,它們不依賴於欺詐證明,因此用於驗證區塊數據的方案已被發表了,它們不再有任何額外的內置延遲假設。

分片:越過委員會

目前存在的分片區塊鏈,通常會依賴於委員會,其想法是,你有一大堆節點,你隨機抽取一些節點,你需要其中的大多數或絕大多數節點在某個區塊上簽名,以便網絡接受該區塊是有效的。

問題是,任何一種基於委員會的方案,都將受到超過某個閾值不良行為者的審查。如果我們要談論抵抗 51% 攻擊,那麼我們就要談論一個系統,在這個系統中,即使大多數人開始攻擊,那麼少數人應該能夠繼續操作系統本身。

固定閾值的分片方案,並不能真正幫助到你。所以這裡的解決方案是,協議需要更充分地依賴一組數據可用性檢查方案,而不是依賴於委員會。

關於審查

在場的各位,有哪些人想阻止審查呢?可以,有很多人,所以,現狀不是很好。這是 nrryuya 的一篇文章,他在形式化驗證以太坊方面做了一些工作,他寫了一篇文章說,在目前的以太坊 2.0 設計中,有一些策略可以讓大多數人審查區塊,這種審查與單區塊延遲是不可區分的,很難去確定誰該負責。

這裡的攻擊是相當卑鄙的,攻擊者攻擊一些驗證者,並使它們為另一個區塊投票,使用其他驗證者為自己的區塊投票,該區塊實際上包含了要審查的內容… 但他們自己的選票不足以超過 51%,所以他們試圖審查的內容,實際上永遠不會被包含在內。這是多層次的間接作用。在以太坊 1.0 和以太坊 2.0 中,一個進行 51% 攻擊的惡意方可以進行審查,而當審查力度足夠大時,就很難確定是否需要對此採取措施。

納入叔塊

這是我們目前能做的最基本的事情:納入叔塊。這裡的想法是,在以太坊 1.0 中,不屬於區塊鏈的區塊可以稍後被包含進來,而新的方案則是,我們添加了協議規則,該規則表示叔塊中的交易也會被處理。

所以,你就有了這樣一條區塊鏈,其中,叔塊也被納入在裡面。

想法:及時性檢測器(TD)

想像一下,如果我們至少可以有在線的客戶端,那麼在網絡上的客戶端可以下載東西,並定期與其它客戶端通信。讓它們檢查是否看到一個區塊準時到達。

如果它們看到某個區塊是按時到達的,並且它們看到該區塊在很長一段時間內沒有被某條鏈接受,那麼該區塊將自動被取消資格。如果一個區塊沒有準時到達,那麼你可以用它來進行 51% 回滾攻擊。

它的思路是,客戶端在本地檢測到某個區塊是否在它應該到達的時候到達,並將其用作確定要遵循鏈的信息。

不是每個節點都能遵循協議的,因為離線節點也會存在。除非 51% 攻擊正在進行中,否則如果沒有攻擊發生,那麼獲勝的區塊鏈將是一條好的鏈,如果攻擊正在發生,而你又處於離線狀態,那麼你幾乎必須檢查社交層,看看發生了什麼,但只有少數參與者會這樣做,其他人會有一個相當明確的共識。

問題:邊緣攻擊

如果你生成一個區塊,無論該區塊的定義是什麼,它都能準時到達,一些節點將看到它在不同的時間到達。因此,節點可能不同意一個區塊 “是否被審查太久”,以及一個區塊 “是否按時發布”,它們可能不同意這些時間參數。

而攻擊者可以利用這一點,導致其他人在攻擊是否發生的問題上,產生長期的分歧,並帶來很多治理問題。所以,這就要求我們有更好的及時性檢測器(TD)。

改進版及時性檢測器(TD)

我們回到拜占庭將軍問題,回到 1982 年由萊斯利·蘭伯特 (Leslie Lamport) 撰寫的論文。事實證明,這篇論文包含了一個算法,而人們並沒有真正去談論這個算法,但他們可能應該多談一些。它把這句話用不可偽造的書面信息(指數字簽名)抽像地隱藏起來。蘭伯特聲稱,他有一個共識算法,可以容忍高達 99% 的錯誤攻擊者(即 99% 容錯共識)。

這個算法是有效的,它的優點是,只要你有同步性假設,它就可以工作,不僅是在做共識的礦工和驗證者之間,而且是在礦工和客戶端之間,以及客戶端和其它客戶端之間。它對誰應該在線有一個更強的假設,其使用這個假設來獲得更高程度的容錯,但它是一個非常危險的假設,我們不願意自己去做。

我將描述單個證明者的版本。在這裡,假設一個證明者是誠實的,然後一共有 n 個證明者,我們就只需要 1/n 的證明者是誠實的。

這裡的想法是,假設一個區塊被發布,然後客戶端和證明者有一個期限,他們需要在這個期限之前接收該區塊,以便認為該區塊是準時的。對於客戶端來說,最後期限是 t,對於證明者來說,最後期限則是 t+δ。所以這裡的提議者將發布一個區塊 b,我們假設提議者有點邪惡,其試圖進行邊緣攻擊,節點 1 在截止日期之前看到它,節點 2 也在截止日期之前看到它。證明者發送了該區塊,但是由於網絡同步性假設,如果有一個節點接受了該區塊,那麼這意味著證明者保證在他們的截止日期之前接受該區塊,因為區塊可以被發送給證明者。如果哪怕一個客戶端認為某個區塊是及時的,那麼證明者也會保證在他們的截止日期之前看到它,因此證明者會添加他們自己的簽名,並且由於網絡同步性,另一個客戶端將在一個簽名區塊的截止日期之前,看到該區塊加上一個簽名。

將其擴展到多個證明者的方法是簡單的,你有很多證明者,客戶端將是 t+δ*k。我在 eth.research 上有一篇文章是專門講這方面的研究的,所以如果你想了解更多的細節,請隨時查看。講講大概的想法,你有一組攻擊者,每個攻擊者都可以將截止日期延遲一點,因此如果一個攻擊者接收到一個區塊,那麼只要網絡延遲低於你的δ參數,它就會將一個區塊的及時性傳播到網絡的其餘部分。

有趣的事實

如果你有這種及時性檢測器,你會按照自聲明的時間順序處理所有及時區塊,就是這樣。唯一的問題是,它需要很長的區塊時間,如果你想處理驗證者的存款、取款和罰沒,那這可能是一個有趣的協議,但它不是運行區塊鏈的最佳協議。

更好的說法是,你可以使用及時性檢測器檢測攻擊鏈以及審查攻擊。

四、總結

反審查技術不如其他技術完美,因為它確實依賴於網絡和客戶端之間的同步假設,你可以將此持續時間設置為你想要的任何時間,但它與你願意容忍的審查級別有關。你可以保證在線節點集之間的一致性,在發生攻擊的情況下,你可以就 “一條鍊是否是攻擊鏈”,以及其他所有事情達成共識。你可以將此作為部分社會共識的開始,以確定恢復的方式,這有助於你為攻擊者分配更強程度的懲罰,因為你可以更可靠地確定攻擊者是誰。

一般來說,如果攻擊者發布了一條不可用的鏈,那麼數據可用性檢查將捕獲它,如果其發布了無效區塊,那麼欺詐證明可以捕獲它,如果你對區塊進行長時間的審查,那麼這條鏈將自動被網絡忽略。如果你審查了一個中等時間的區塊,那麼你可以使用及時性檢測器來乾淨地處理它,如果攻擊者試圖不參與或破壞委員會,則相應就不使用委員會。

好了,我們有了一系列的工具,它們基本上可以大大降低我們對 51% 攻擊的恐懼感,或者能夠忽略它們,或者從中恢復過來。謝謝大家。


熱門市場動態與新聞傳送門:

區塊客致力於發掘和整理各種與區塊鏈技術有關的內容,只要與區塊鏈或區塊客網站有關的合作和/或建議,我們都非常歡迎。請您發電郵至 [email protected] 與我們聯繫。