分片技術是以太坊(ETH)生態中被誤解較多的概念之一,這篇文章解釋了分片提供了哪些特定的屬性,它與其他不分片的技術有什麼不同。本文出自以太坊創辦人 Vitalik Buterin(V神)《Demystifying the Technical Properties of Sharding: Why it is Great》, 由 PANews , 去中心化金融社區 編譯及整理。
(背景補充:科普 | 作為以太坊可擴展性未來,分片 (Sharding) 是什麽?有沒有潛在風險?)
分片是以太坊可擴展性的未來,它將是幫助生態系統支持每秒數千筆交易的關鍵,它還允許世界上的大部分地區可以以負擔得起的成本定期使用該平台。然而,它也是以太坊生態系統和更廣泛的區塊鏈生態系統中被誤解較多的概念之一。
它指的是一組具有非常特定屬性的思想,但現在它經常被與具有安全性較弱屬性的技術合併在一起。這篇文章的目的是解釋分片提供了哪些特定的屬性,它與其他不分片的技術有什麼不同,以及一個分片系統必須做出哪些犧牲來實現這些屬性。
以太坊分片版本的眾多描述之一。原始圖由 Hsiao-wei Wang 繪製,Quantstamp 設計。
可擴展性三難困境
描述分片的最佳方式應該是從計劃並啟發解決方案的問題陳述開始:可擴展性三難困境。
可擴展性三難困境表示區塊鏈試圖擁有三個屬性,如果堅持使用「簡單」技術,那麼我們只能獲得這三個中的兩個。這三個屬性分別是:
- 可擴展性:比起單個普通節點驗證的交易數量,鏈可以處理更多的交易。
- 去中心化:鏈可以在不依賴於一小群大型中心化參與者的情況下運行。這通常被解釋為當我們不能用一個普通筆記本電腦加入到一組節點時,就不應該對該節點有任何信任。
- 安全性:鏈可以抵抗大部分對參與節點的攻擊。(理想情況是 50%;超過 25% 就還好,5% 絕對不行)。
現在我們來看看這三類「簡單解決方案」,通常只能得到其中的兩個:
- 傳統區塊鏈:包括比特幣、pre-PoS/分片以太坊、萊特幣和其他類似的鏈。它們依賴於每個參與者運行一個完整的節點來驗證每個交易,因此它們具有去中心化和安全性,但沒有可擴展性。
- 高 TPS 鏈:包括 DPoS 家族,也包括許多其他類似的。它們依賴於少數節點(通常是10-100個)來維持彼此之間的共識,用戶必須信任其中的大多數節點。這是具有可擴展性和安全性的,但它不是去中心化的。
- 多鏈生態系統:這是指「橫向擴展」的一般概念,通過在不同的鏈上運行不同的應用程式,並使用跨鏈通信協議在它們之間進行通信。這是去中心化和可擴展的,但它並不安全,因為攻擊者只需要在眾多鏈中的一個里獲得多數共識節點即可破壞該鏈並可能引起連鎖反應,對其他鏈中的應用程序也會造成巨大損害。
分片是一種可以同時滿足這三種需求的技術。一個分片區塊鏈是:
- 可擴展:它可以處理比單個節點多得多的交易。
- 去中心化:它完全可以在普通筆記本電腦上「生存」,不依賴任何「超級節點」。
- 安全:攻擊者無法以少量資源攻擊系統的一小部分;他們只能試圖控制和攻擊整個事物。
本文的其餘部分將描述分片區塊鏈是如何做到這一點的。
延伸閱讀:科普 | 作為以太坊可擴展性未來,分片 (Sharding) 是什麽?有沒有潛在風險?
通過隨機抽樣進行分片
最易理解的分片是通過隨機抽樣進行的分片。與我們在以太坊生態系統中構建的分片形式相比,通過隨機抽樣的分片有更薄弱的信任屬性,但它使用了更簡單的技術。
其核心思想如下。假設我們有一個包含大量(例如 10000 個)驗證者的權益證明鏈,並且同時有大量(例如 100 個)需要驗證的區塊。沒有一台計算機能夠強大到在下一組區塊進入之前驗證所有這些區塊。
因此,我們所做的就是將驗證工作隨機地進行拆分。我們隨機打亂驗證者列表,讓已打亂列表中的前 100 個驗證者來驗證第一個區塊,讓已打亂列表中的後 100 個驗證者來驗證第二個區塊,以此類推。這種被隨機選擇來驗證一個區塊(或執行一些其他任務) 的一組驗證者被稱為委員會。
當驗證者驗證一個區塊時,他們會發布一個簽名來證明他們已經這樣做了的事實。其他所有人,不再驗證 100 個完整的區塊,現在只驗證 10000 個簽名,這樣工作量會小得多,尤其是使用 BLS signature aggregation。每個區塊不是通過相同的 P2P 網路廣播,而是在不同的子網上廣播,節點只需要加入它們負責(或出於其他原因感興趣)的區塊對應的子網。
試想一下,如果每個節點的計算能力都增加了 2 倍會發生什麼?因為每個節點現在可以安全地多驗證 2 倍的簽名,所以我們可以減少最低質押存款規模,以支持 2 倍多的驗證者;屆時,我們就可以建立 200 個委員會,而不是 100 個。同時,每個 slot 可以驗證 200 個區塊,而不是 100 個。此外,每個單獨的區塊可以是原來的兩倍大。因此,我們將擁有 2 倍大小的 2 倍區塊,或多於 4 倍的鏈容量。
我們可以引入一些數學術語來討論發生了什麼。使用大 O 表示法,我們用 “O(C)” 表示單個節點的計算能力。傳統的區塊鏈可以處理 O(C) 大小的區塊。如上所述的分片鏈可以並行處理 O(C) 個區塊(每個節點間接驗證每個區塊的代價是O(1),因為每個節點只需要驗證固定數量的簽名),每個區塊的容量為 O(C),因此分片鏈的總容量為 O(C2)。這就是為什麼我們稱這種類型的分片為二次分片,而這種效應也是為什麼我們認為從長遠來看,分片是擴展區塊鏈的最佳方式的關鍵原因。
常見問題:分成 100 個委員會和分成 100 個獨立的鏈有什麼不同?
有兩個關鍵的區別:
– 隨機抽樣可以防止攻擊者將他們的火力集中在一個分片上。
在 100 條鏈的多鏈生態系統中,攻擊者只需佔總質押的大約 0.5% 就能造成破壞。在一個分片區塊鏈中,攻擊者必須擁有接近整個質押的 30-40% 才能完成同樣的操作(換句話說,鏈具有共享安全性)。當然,他們可以等待,直到他們幸運地在一個分片中隨機獲得 51%,儘管他們擁有少於總質押的 50%,但對於擁有遠低於 51% 的攻擊者來說,這將成倍增加。如果攻擊者的低於 30%,那這件事幾乎是不可能的。
-緊密耦合:即使一個分片出現一個壞區塊,整個鏈也會重組以避開它。
有一種社會合約(在本文檔後面的章節中,我們將描述一些技術上實施這種合約的方法),就是一個分片中有一個壞區塊的鏈都是不可接受的,應該在發現它時立即丟棄它。從鏈內應用程式的角度來看,這確保了完美的安全性:合約 A 可以依賴於合約 B,因為如果合約 B 由於鏈上的攻擊而行為不當,整個歷史都將被恢復,包括合約 A 中由於合約 B 的故障而行為不當的交易。
這兩種差異都確保了分片為應用程式創建了一個環境,該環境保持單鏈環境的關鍵安全特性,而多鏈生態系統根本無法做到這一點。
使用更好的安全模型改進分片
比特幣圈子裡一個常見的說法,也是我完全同意的說法是,像比特幣(或以太坊)這樣的區塊鏈並不完全依賴於誠實的多數假設。如果對這樣的區塊鏈進行 51% 攻擊,那麼攻擊者可以做一些很討厭的事情,比如恢復或審查交易,但他們不能插入無效的交易。即使他們恢復或審查交易,運行普通節點的用戶也可以很容易地檢測到這種行為,因此,如果社群希望通過分叉來協調解決攻擊,從而消除攻擊者的權力,那麼他們可以時迅速做到這一點。
缺乏這種額外的安全性是更加中心化的高 TPS 鏈的一個關鍵弱點。這樣的鏈沒有,也不可能有常規用戶運行節點的文化,所以主要節點和生態系統的參與者可以更容易地聚集在一起,並強加實施一個社群非常不喜歡的協議更改。
更糟糕的是,用戶的節點將默認接受它。一段時間後,用戶會注意到,但那時強制協議更改已成為既成事實:拒絕更改的協調負擔將落在用戶身上,他們將不得不做出痛苦的決定。
理想情況下,我們希望有一種分片形式,可以避免 51% 的有效性信任假設,並保留傳統區塊鏈通過充分驗證獲得的強大安全壁壘。這正是我們在過去幾年中所做的大部分研究。
計算的可擴展驗證
我們可以將 51%-attack-proof 的可擴展驗證問題分解為兩種情況:
– 驗證計算:假設我們擁有計算的所有輸入,檢查某些計算是否正確完成。
– 驗證數據可用性:檢查計算輸入本身是否以某種形式被存儲,如果真的需要,可以下載它們;這種檢查應該在不實際下載整個輸入本身的情況下執行(因為數據可能太大,無法下載每個區塊)。
在區塊鏈中驗證一個區塊時,其中包括計算和數據可用性檢查:我們需要確信區塊中的交易是有效的,並且區塊中聲明的新狀態根哈希是執行這些交易的正確結果,但是我們還需要確信區塊中已經發布了足夠的數據,以便下載該數據的用戶可以計算狀態並繼續處理區塊鏈。第二部分是一個非常微妙但非常重要的概念,稱為數據可用性問題;稍後再詳細說明。
可擴展的驗證計算相對容易;具體有兩類技術:欺詐證明和 ZK-SNARK。
兩種技術可以簡單描述如下:
-欺詐證明是一個接受計算結果的系統,需要一個有質押存款的人簽署一個消息,內容為「我證明,如果你用輸入 X 進行計算 C,你會得到輸出 Y」。在默認情況下,我們信任這些消息,但我們也為其他已質押存款的人提供了挑戰的機會(帶有簽名的消息表示「我不同意,輸出是Z」)。只在有挑戰時,所有節點才會運行計算。雙方中任何一方的錯誤都將失去他們的存款,並且所有的計算都取決於該計算的結果將被重新計算。
– ZK-SNARK 是一種加密證明形式,它直接證明了「對輸入 X 執行計算 C 會得到輸出 Y」的說法。這個證明在密碼學上是「合理的」:如果 C(x) 不等於 Y,在計算上就不可能做出有效的證明。即使運行 C 本身需要大量時間,證明也可以快速驗證。
基於欺詐證明的計算是可擴展的,因為「在正常情況下」,我們可以用驗證單個簽名來取代運行複雜的計算。有一種例外情況,由於存在挑戰,我們必須鏈上驗證計算,但這種例外情況非常罕見,因為觸發它非常昂貴。ZK-SNARK 在概念上更簡單——它們只是用更便宜的證明驗證取代了計算 —— 但它們工作原理背後的數學原理要複雜得多。
有一類半可擴展系統,它只對計算進行可擴展的驗證,同時仍需要每個節點對所有數據進行驗證。這可以通過使用一組壓縮技巧來實現計算代替大多數數據。這是 rollup 的領域。
延伸閱讀:V神點名:ZK Rollups或成以太坊主要Layer 2方案!比Optimistic快
數據可用性的可擴展驗證更加困難
欺詐證明不能用於驗證數據的可用性。計算的欺詐證明依賴於這樣一個事實:在提交原始訴求的那一刻,計算的輸入就在鏈上發布了;因此,如果有人質疑,質疑執行發生在與原始執行發生的完全相同的「環境」中。
在檢查數據可用性的情況下,我們不能這樣做,因為問題恰恰在於需要檢查的數據太多,無法將其發佈到鏈上。因此,數據可用性的防欺詐方案遇到了一個關鍵問題:有人可以聲稱「數據 X 是可用的」,但不發布它,等待挑戰,然後發布數據 X,使挑戰者在網絡的其他部分看來是不正確的。
這在漁夫困境中得到了擴展:
其核心理念是,對於當時沒有試圖下載特定數據的人來說,這兩個「世界」是無法被區分的,一個是 V1 是邪惡的發布者,V2 是誠實的挑戰者,另一個是 V1 是誠實的發布者,V2 是邪惡的挑戰者。
在一個可擴展的去中心化區塊鏈中,每個單獨的節點只希望下載一小部分數據,所以只有一小部分節點會看到發生了什麼,除了存在分歧的事實。
無法區分誰對誰錯的事實,使得我們不可能擁有一個有效的數據可用性防欺詐方案。
常見問題:如果某些數據不可用怎麼辦?有了 ZK-SNARK,你可以確定一切都是有效的,這還不夠嗎?
令人遺憾的是,有效性不足以確保正確運行區塊鏈。這是因為如果區塊鏈是有效的,但所有數據都不可用,那麼用戶就沒有辦法更新他們需要的數據,來生成任何未來區塊是有效的證明。攻擊者生成一個有效但不可用的區塊,然後消失,這可以有效地停止鏈。某些人還可以扣留特定用戶的帳戶數據,直到用戶支付贖金,所以這個問題不僅僅是活躍度問題。
有一些強有力的信息理論論據認為,這個問題是根本的,沒有什麼巧妙的可用技巧可以解決它。
那麼,如何在不嘗試下載的情況下檢查 1 MB 的數據是否可用呢?這聽起來不可能的!
關鍵是一項被稱為數據可用性抽樣的技術。數據可用性抽樣的工作原理如下:
– 使用一種名為 erasure coding 的工具,將一個有 N 個塊的數據擴展為有 2N 個塊的數據,這樣其中的任何 N 個區塊都可以恢復整個數據。
– 檢查可用性,不用試圖下載整個數據,用戶只需在區塊中隨機選擇一個固定數量的位置(例如 30 個位置),只有當他們成功地在他們選擇的所有位置找到區塊中的塊時,才會接受區塊。
糾刪碼將「檢查 100% 可用性」(每一個數據片段都可用)問題轉換為「檢查 50% 可用性」(至少一半數據片段可用)問題。隨機抽樣解決了 50% 的可用性問題。如果可用的數據少於 50%,那麼幾乎可以肯定至少有一個檢查會失敗,如果至少 50% 的數據可用,那麼儘管一些節點可能無法識別一個區塊是否可用,但只需要一個誠實的節點運行糾刪碼重構過程就可以恢復剩餘的 50% 的區塊。因此,不需要下載 1MB 來檢查 1MB 區塊的可用性,只需要下載幾千字節。這使得在每個區塊上進行數據可用性檢查變得可行。
ZK-SNARK 可以用來驗證數據上的 erasure coding 是否正確,然後可以用 Merkle 分支來驗證單個塊。或者,也可以使用多項式承諾(例如:Kate(又名KZG)承諾),其本質上是在一個簡單的組件中進行 erasure coding、證明單個元素和正確性驗證——這就是以太坊分片所使用的。
回顧:我們如何再次確保一切都是正確的?
假設我們有 100 個區塊,並且想要在不依賴委員會的情況下有效地驗證所有區塊的正確性。我們需要做以下事情:
- 每個客戶端對每個區塊執行數據可用性採樣,驗證每個區塊中的數據是否可用,即使整個區塊的大小為 1 兆字節或更大,每個區塊也只需下載幾千字節。客戶端只有在其可用性挑戰的所有數據都得到正確響應時才會接受一個區塊。
- 既然我們已經驗證了數據的可用性,那麼驗證正確性就變得更容易了。
有兩種方法:
- 我們可以用 ZK-SNARK。每個區塊都有一個 ZK-SNARK 來證明正確性。
- 我們可以使用欺詐證明:一些已質押存款的參與者可以簽署每個區塊的正確性。其他節點,稱為挑戰者(或漁民)隨機檢查並試圖完全處理區塊。因為我們已經檢查了數據的可用性,所以可以下載數據並完全處理任何特定區塊。如果他們發現一個無效的區塊,他們會發布一個每個人都驗證的挑戰。如果結果顯示該區塊是壞掉的,那麼該區塊和所有依賴於該區塊的未來區塊都需要重新計算。
在上述任何一種情況下,無論區塊有多大,每個客戶端只需要為每個區塊做少量的驗證工作。在欺詐證明的情況下,偶爾區塊需要在鏈上進行完全驗證,但這應該是非常罕見的,因為觸發哪怕一個挑戰都是非常昂貴的。
就以太坊分片而言,近期的計劃是讓分片區塊只包含數據;也就是說,分片純粹是一個「數據可用性引擎」,使用該安全數據空間以及欺詐證明或 ZK-SNARK 來實現高吞吐量安全交易處理能力是第 2 層 rollup 的工作。但是,完全可以創建這樣一個內置系統來添加「本地」高吞吐量執行。
分片系統的關鍵特性是什麼?折衷方案是什麼?
分片的關鍵目標是盡可能地複製傳統(非分片)區塊鏈最重要的安全屬性,但不需要每個節點親自驗證每筆交易。
分片非常接近。在傳統的區塊鏈中:
- 無效的區塊無法通過,因為驗證節點會注意到它們是無效的,並忽略它們。
- 不可用的區塊無法通過,因為驗證節點無法下載它們,並忽略它們。
在一個具有高級安全特性的分片區塊鏈中:
- 無效區塊無法通過,因為:
- 欺詐證明會迅速捕捉他們,並告知整個網絡該區塊的不正確性,並嚴懲創建者;
- ZK-SNARK 證明了正確性,我們不能為一個無效的區塊創建一個有效的 ZK-SNARK。
- 不可用的區塊無法通過,因為:
- 如果一個區塊的可用數據少於 50%,那麼對於每個客戶端,至少有一個數據可用性樣本檢查幾乎肯定會失敗,這將導致客戶端拒絕該區塊;
- 如果一個區塊至少有 50% 的數據可用,那麼實際上整個區塊都可用,因為只需要一個誠實節點來重構區塊的其餘部分就可以。
沒有分片的傳統高 TPS 鏈無法提供這些保證。多鏈生態系統無法避免攻擊者選擇一條鏈進行攻擊並輕鬆地接管它的問題(鏈可以共享安全性,但如果這一點做得不好,它將變成事實上的傳統高 TPS 鏈,具有所有的缺點,如果做得好,它將只是上述分片技術的更複雜的實現)。
側鏈高度依賴於實現,但它們通常容易受到傳統高 TPS 鏈的弱點(如果它們共享礦工/驗證者)或多鏈生態系統的弱點(如果它們不共享礦工/驗證者)的影響。分片鏈可以避免這些問題。
然而,分片系統的裝甲中有一些裂縫。值得注意的是:
- 只依賴委員會的分片鏈很容易受到適應性對手的攻擊,問責制也更弱。也就是說,如果對手有能力實時入侵(或關閉)他們選擇的任何一組節點,那麼他們只需要攻擊一小部分節點就可以破壞一個委員會。此外,如果一個對手(無論是適應性對手還是僅僅是佔 50% 的攻擊者)破壞了一個委員會,只有很少的部分會被懲罰。這就是為什麼數據可用性抽樣與欺詐證明或 ZK-SNARK 一起是隨機抽樣技術的重要補充的另一個關鍵原因。
- 只有當有足夠數量的在線客戶端共同發出足夠的數據可用性抽樣請求時,數據可用性抽樣才安全,這些請求的響應幾乎總是重疊到至少占到 50% 的區塊。在實踐中,這意味著必須有幾百個客戶端在線(並且這個數字隨著系統容量與單個節點容量的比率的增加而增加)。這是一種 n 中的少數信任模型 —— 通常是相當可信的,但肯定沒有非分片鏈中節點的 n 中的 0 信任那麼可靠。
- 如果分片鏈依賴於欺詐證明,那麼它依賴於時間假設;如果網路太慢,節點可能會在防欺詐程式出現並表明它是錯誤的之前接受最終確定的區塊。幸運的是,如果我們遵循在發現無效區塊後恢復所有無效區塊的嚴格規則,那麼這個閾值是一個用戶設置的參數:每個用戶選擇他們到最終結果等待多長時間,如果他們不想等待足夠長的時間,那麼就遭受損失,更謹慎的用戶可確保安全。儘管如此,這還是削弱了用戶體驗。使用 ZK-SNARK 驗證有效性解決了這個問題。
- 需要傳遞大量的的原始數據量,這增加了在極端網路條件下發生故障的風險。少量數據比大量數據更容易被發送。區塊瀏覽器如果想要保存整個鏈,就需要存儲更多的數據。
- 分片區塊鏈依賴於分片的點對點網路,每個 p2p「子網」更容易被攻擊,因為它的節點更少。用於數據可用性抽樣的子網模型緩解了這一問題,因為子網之間存在一些冗餘,但仍然存在風險。
這些都是值得關注的問題,儘管在我們看來,通過允許更多的應用程式在鏈上運行而不是通過中心化的第二層服務來實現的用戶級中心化的減少遠遠超過了這些問題。也就是說,這些問題,尤其是後兩個問題,實際上是將分片鏈的吞吐量提高到一定程度的真正限制。二次分片的二次性是有極限的。
順便說一句,如果分片區塊鏈的吞吐量變得太高,則其安全風險會越大,這也是為什麼擴展到超二次分片的努力在很大程度上被放棄的關鍵原因;看起來保持二次分片只是二次分片是一個不錯的折衷方案。
為什麼不中心化生產和分片驗證?
經常被提出的一個分片替代方案是建立一個結構類似於中心化高 TPS 鏈的鏈,只不過它在上面使用數據可用性採樣和分片來驗證有效性和可用性。
這改善了目前存在的中心化高 TPS 鏈,但它仍然比分片系統弱得多。這有以下幾個原因:
- 在高 TPS鏈 中,很難發現區塊生產者的審查。審查檢測需要 (i) 能夠查看每筆交易並驗證沒有明顯值得進入但無法進入的交易,或 (ii) 在區塊生產者中有一個 n 中的 1 信任模型,並驗證沒有區塊無法進入。在中心化的高 TPS 鏈中,(i) 是不可能的,(ii) 更困難,因為小節點數量使 n 中的 1 的信任模型更容易崩潰,如果鏈的區塊時間對 DAS 來說太快(就像大多數中心化的高 TPS 鏈所做的那樣),很難證明一個節點的區塊沒有被拒絕,因為它們都被發布得太慢了。
- 如果大多數區塊生產者和生態系統成員試圖強行通過一項不受歡迎的協議更改,用戶的客戶端肯定會發現它,但對於社群來說,反抗和分叉都要困難得多,因為他們將需要啟動一組新的非常昂貴的高吞吐量節點來維護一個保持舊規則的鏈。
- 中心化基礎設施更容易受到外部參與者的審查。區塊產生節點的高吞吐量使它們非常容易被檢測到,並且更容易被關閉。從邏輯上來說,審查專用的高性能計算比追查個人用戶的筆記本電腦要容易得多。
- 高性能計算向中心化雲服務轉移的壓力更大,這增加了整個鏈將在 1-3 家公司的雲服務中運行的風險,因此,由於許多區塊生產者同時失敗,使得鏈的風險下降。具有在自己的硬體上運行驗證者的文化的分片鏈也更不容易受到這種攻擊。
適當的分片系統最好作為基礎層。有了一個分片基礎層,我們始終可以通過將其構建為rollup來創建一個中心化生產系統。但是,如果我們有一個依賴於中心化區塊生產的基礎層,則不能在其上構建更加去中心化的第 2 層。
📍相關報導📍
新手科普 | 解決「比特幣、以太坊燃眉之急」的 Layer2 解決方案