V神最新文章:分片是以太坊可擴充套件性的未來

買賣虛擬貨幣

作者:以太坊創始人Vitalik Buterin

原文連結:

https://vitalik.ca/general/2021/04/07/sharding.html

正文

分片(sharding)是以太坊可擴充套件性的未來,它將是幫助以太坊生態系統每秒支援數千筆交易並允許世界上大部分地區以可承受的成本經常使用該平臺的關鍵。

但是,分片也是以太坊生態系統和更廣泛的區塊鏈生態系統中很容易被誤解的概念之一。分片指的是一組具有特定屬性的特定想法,但是它常常與具有不同且通常弱得多的安全屬性的技術混為一談。

這篇文章的目的是確切解釋分片提供的特定屬性,它與沒有分片的其他技術有何不同,以及為實現這些屬性而必須做出的犧牲。

以太坊的分片版本的眾多描述之一。Hsiao wei Wang提供原始圖,由Quantstamp設計。

可擴充套件性三角

描述分片的最佳方法就是從塑造和啟發解決方案的問題陳述開始:可擴充套件性三角。

可擴充套件性三角認為,區塊鏈試圖同時擁有三個屬性,如果堅持技術「簡單性」,那麼你只能獲得這三個屬性中的兩個,即區塊鏈「不可能三角」。 這三個屬性是:

可擴充套件性:區塊鏈可以處理的交易量比單個常規節點(例如:消費級膝上型電腦)可以驗證的交易量更多。

去中心化:區塊鏈可以在不依賴來自一小群大型中心化參與者的任何信任的情況下執行。這通常意味著,您不能把信任交給一小組節點(即使假設它們多數是誠實的)(你無法透過消費級筆記本加入成為這些節點之一)。

安全性:區塊鏈可以抵抗來自很大一部分參與節點正在對其展開的攻擊。(對於攻擊成功所需要的節點,理想情況下50%,25%以上也可以,5%絕對不行)

要想獲得可擴充套件性三角中的兩個,我們現在來看一下三類「簡單的解決方案」:

傳統的區塊鏈——包括比特幣,預PoS或分片的以太坊,萊特幣和其他類似的鏈。這些區塊鏈都依賴於那些執行完整節點的每個參與者來驗證每筆交易,因此它們具有去中心化和安全性,但沒有可擴充套件性。

高TPS區塊鏈——包括DPoS系列,也包括許多其他產品。這些依賴於少數幾個節點(通常為10-100個)之間保持共識,而使用者必須信任這些節點中的大多數。這是可擴充套件的和安全的(從上面的定義來講),但是它不是去中心化的。

多鏈生態系統——這是指「橫向擴充套件」的一般概念,透過在不同的鏈上開發不同的應用,並使用跨鏈通訊協議在它們之間進行對話。這是去中心化的,也是可擴充套件的,但是不是安全的,因為攻擊者僅需要在多個鏈中的一個(通常少於整個生態系統的1%節點)中獲得共識節點的多數,即可打破該鏈並可能引起連鎖反應,從而導致對其他鏈中的應用造成了極大的損害。

分片是一種可以讓您同時擁有全部三個屬性的技術。分片區塊鏈具備:

可擴充套件:與單個節點相比,它可以處理更多的交易

去中心化:它可以完全在家用膝上型電腦上使用,而不依賴於任何「超級節點」

安全:攻擊者無法使用少量資源來瞄準系統的一小部分進行攻擊;他們只能試圖統治和攻擊整個區塊鏈系統

本文章的其餘部分將描述分片區塊鏈如何做到這一點。

透過隨機取樣進行分片

分片最容易理解的版本是透過隨機取樣進行分片。

與我們在以太坊生態系統中建立的分片形式相比,透過隨機取樣進行分片具有較弱的信任屬性,但它使用的技術更簡單。

核心思想如下:

假設您有一個具有大量(例如10000個)驗證者的PoS鏈,並且您有大量(例如100個)需要驗證的區塊。在出現下一組區塊產出之前,單一一臺計算機不具有足以驗證所有這些區塊的能力。

因此,我們要做的是隨機分配進行驗證的工作。我們隨機地對驗證者列表進行混洗,並在混洗後的列表中分配前100個驗證者以驗證第一個區塊,在混洗後的列表中分配後100個驗證者以驗證第二個區塊,依此類推。這些隨機分配用於驗證區塊(或執行其他任務)的驗證者們稱為委員會(committee)。

驗證者驗證區塊時,他們會發布簽名,以證明他們已這樣做。不同於所有人都驗證這100個區塊,取而代之的是所有人驗證10000個簽名——這麼做的工作量要小得多,尤其是使用BLS簽名聚合‌時。取代透過相同的P2P網路廣播每個區塊,而是在不同的子網(sub-network)上廣播每個區塊,並且節點僅需要加入它們負責(或出於其他原因而感興趣)的區塊所在的子網。

請考慮一下,如果每個節點的計算能力增加2倍,會發生什麼情況。由於每個節點現在可以安全地驗證2倍以上的簽名,因此您可以減少最小的質押存款大小以支援2倍的驗證者,您可以組成200個委員會而不是100個委員會。因此,您可以每個插槽驗證200個區塊而不是100個。此外,每個單獨的區塊也可以擴大2倍。因此,您有2倍數量的2倍大小區塊,換句話說區塊鏈容量總共增加了4倍。

我們可以透過一些數學術語來表示。使用Big O表示法‌,我們使用「 O(C)」來指代單個節點的計算能力。傳統的區塊鏈可以處理O(C)個區塊。如上所述的分片區塊鏈可以並行處理O(C)個區塊(請記住,每個節點間接驗證每個區塊的成本為O(1),因為每個節點只需要驗證固定數量的簽名即可),每個區塊具有O(C)容量,因此分片區塊鏈的總容量為O(C2)。

這就是為什麼我們將這種分片稱為「二次分片」,並且這種影響是我們認為從長遠來看分片是擴充套件區塊鏈的最佳方法的關鍵原因。

常見問題:拆分為100個委員會與拆分為100個獨立的鏈有何不同?

有兩點不同:

1、隨機取樣可防止攻擊者將力量集中在一個分片上。在一個擁有100條鏈的多鏈生態系統中,攻擊者只需要約0.5%的質押就可造成嚴重破壞:他們可以專注於對一條鏈展開51%攻擊。在分片的區塊鏈中,攻擊者必須擁有全部質押的約30-40%才能做同樣的事情(換句話說,整個鏈具有共享的安全性)。當然,攻擊者可以等待,儘管其持有的質押少於全部質押的50%,但可以透過獲得隨機機會獲得單個分片進行51%攻擊的機會,但是對於少於51%的攻擊者,這將攻擊難度成倍增加。如果攻擊者的資產少於30%,則幾乎是不可能的攻擊成功的。

2、緊密耦合:即使一個分片遇到壞塊,整個鏈也會重組以避免這個區塊。這裡有一個社會合約(在本文件的後續部分中,我們描述了一些從技術上實施這種合約的方式),即使一條鏈在一個分片中只有一個壞塊,這也是不可接受的,一旦發現,就應該廢棄。這樣可以確保從鏈上應用的角度來看,它具有完美的安全性:合約A可以依賴合約B,因為如果合約B由於對鏈的攻擊而行為不當,那麼整個歷史記錄都將還原,包括其由於合約B的故障而行為不當的合約A交易。

這兩種差異確保分片為應用建立了一個環境,該環境保留了單鏈環境的關鍵安全屬性,而多鏈生態系統則根本沒有這種方式。

透過更好的安全模型改善分片

比特幣社羣的一種普遍看法是我完全同意的,那就是像比特幣(或以太坊)這樣的區塊鏈並不完全依賴一種誠實多數假設。

如果對這樣的區塊鏈展開51%攻擊,則攻擊者可以做一些令人討厭的事情,例如還原或審查交易,但他們不能插入無效的交易。

而且即使進行還原或審查交易,執行常規節點的使用者也可以輕鬆檢測到該行為,因此,如果社羣希望透過分叉來消除攻擊者的力量來協調解決該攻擊,他們可以迅速採取行動。

缺乏這種額外的安全性是更中心化的高TPS鏈所面臨的主要弱點。這樣的鏈沒有,也不可能具有執行節點的常規使用者文化,因此主要節點和生態系統參與者可以更輕鬆地聚在一起,並實施社羣非常不喜歡的協議更改。

更糟糕的是,使用者的節點預設情況下會接受它。一段時間後,使用者會察覺,但是到那時,這個強制協議更改已經成為既成事實:這個協調負擔將由使用者承擔來拒絕更改,他們將不得不做出痛苦的決定來逆轉這一天在區塊鏈上產生的價值,或撤銷更多每個人都以為已經完成的活動。

理想情況下,我們希望採用一種分片形式,避免51%信任假設,並保留傳統區塊鏈從全面驗證中獲得的強大安全堡壘。而這正是我們過去幾年的大部分研究成果。

可擴充套件的計算驗證

我們可以將抗51%攻擊的可擴充套件驗證問題分為兩種情況:

驗證計算:檢查某些計算是否正確完成,假設您擁有該計算的所有輸入

驗證資料可用性:檢查計算本身的輸入是否以某種形式儲存,如果確實需要,可以下載它們;執行此檢查時,請不要實際下載所有輸入本身(因為資料可能太大,無法每個區塊都下載)

驗證區塊鏈中的區塊涉及計算和資料可用性檢查:您需要確信區塊中的交易有效,並且區塊中宣告的新狀態根雜湊是執行這些交易的正確結果,但是您還需要確信來自該區塊的足夠資料實際上已經發布,以便下載該資料的使用者可以計算狀態並繼續處理區塊鏈。第二部分是一個非常微妙但重要的概念,稱為資料可用性問題‌。稍後再討論。

擴充套件驗證計算相對容易,有兩種技術:欺詐證明(fraud proofs)和ZK-SNARK。

欺詐證明是一種可擴充套件地驗證計算的方法。

這兩種技術可以簡單地描述如下:

欺詐證明是一個接受計算結果的系統,您需要有進行過質押的人簽署以下形式的訊息:「我證明,如果使用輸入X進行計算C,則會得到輸出Y」。您預設情況下會信任這些訊息,但是會給進行過質押的其他人提供挑戰結果的機會(他們可以簽名訊息,說「我不同意,輸出結果應該為Z,而不是Y」)。僅當有人挑戰結果時,所有節點才執行計算。這兩方中的任何一方出錯都會失去其質押,並且將重新計算所有依賴於該計算結果的計算。

ZK-SNARK是一種加密證明形式,可以直接證明「在輸入X上執行計算C會給出輸出Y」的主張。該證明在密碼上是「合理的」:如果C(x)不等於Y,則在計算上不可能做出有效的證明。即使執行C本身花費大量時間,該證明也可以很快地進行驗證。

基於欺詐證明的計算是可擴充套件的,因為在「通常情況下」,您將透過驗證單個簽名來代替執行復雜的計算。

在特殊情況下,由於存在挑戰,您必須在鏈上驗證計算,但是在特殊情況下卻很少見,因為觸發它的代價非常昂貴(最初的宣告者或挑戰者都會可能失去大量保證金)。

ZK-SNARK在概念上更簡單——它們只是用便宜得多的證明驗證來代替計算——但其工作原理背後的數學卻要複雜得多。

還有一種半可擴充套件系統,它只能擴充套件地驗證計算,同時仍然需要每個節點驗證所有資料。透過使用一組壓縮技巧將大部分資料替換為計算,可以使此方法非常有效。這是Rollup‌的領域。

資料可用性的可擴充套件驗證更加困難

欺詐證明不能用於驗證資料的可用性。

計算的欺詐證明依賴於這樣的事實,即計算的輸入在最初宣告者提交後即在鏈上釋出,因此,如果有人挑戰,則挑戰執行將在與原始執行完全相同的「環境」中進行。

在檢查資料可用性的情況下,您不能執行此操作,因為問題恰恰是存在太多資料需要檢查才能在鏈上釋出的事實。因此,用於資料可用性的防欺詐方案遇到了一個關鍵問題:有人可以聲稱「資料X可用」但並不釋出它,等待受到挑戰,然後只有在挑戰者出現在網路的其餘部分並且錯誤的時候才釋出資料X。

這在「fisherman困境‌」中得到了擴充套件:

核心思想是,這兩個「世界」,一個是V1是一個邪惡的釋出者,V2是一個誠實的挑戰者,而另一個「世界」是V1是一個誠實的釋出者,V2是一個邪惡的挑戰者。兩種情況對於當時未嘗試下載該特定資料的任何人來說都沒有區別。

當然,在可擴充套件的去中心化區塊鏈中,每個單獨的節點只能希望下載一小部分資料,因此只有一小部分節點會看到發生了什麼事情,除了存在分歧的事實。

分清誰對誰錯是不可能的,這個事實使得不可能有一個有效的欺詐證明機制來保證資料的可用性。

常見問題:如果某些資料不可用怎麼辦?使用ZK-SNARK,您可以確保一切都有效,這還不夠嗎?

不幸的是,僅僅有效性還不足以確保區塊鏈正確執行。這是因為,如果區塊鏈有效,但所有資料均不可用,則使用者將無法更新其生成任何未來區塊有效的證明所需的資料。生成有效但不可用的區塊然後消失的攻擊者可以有效地讓區塊鏈陷入停滯。有人還可以保留特定使用者的帳戶資料,直到該使用者支付贖金為止,因此問題不僅僅在於生存問題。

有一些強有力的資訊理論論點認為這個問題是根本的,並且沒有可以解決的聰明技巧(例如,涉及密碼累加器‌)。

有關詳細資訊,請參見

https://eprint.iacr.org/2009/612.pdf‌

那麼,如何在不實際下載的情況下檢查 1MB資料是否可用?聽起來是不可能的!

這裡的關鍵是一項稱為資料可用性取樣‌的技術。資料可用性取樣的工作方式如下:

1、使用稱為擦除編碼(erasure coding)的工具將具有N個區塊的資料擴充套件為具有2N個區塊的資料,以使這些區塊中的任何N個都可以恢復整個資料。

2、為了檢查可用性,使用者無需嘗試下載全部資料,而只是隨機地選擇區塊中恆定數量的位置(例如30個位置),並且僅當他們在所有選定位置的塊中成功找到塊時,才接受這個區塊。

擦除編碼將「檢查100%可用性」(每條資料可用)問題轉換為「檢查50%可用性」(至少一半資料可用)問題。隨機抽樣解決了50%可用性問題。

如果少於50%的資料可用,那麼至少有一項檢查幾乎可以肯定會失敗,並且如果至少50%的資料可用,那麼,儘管某些節點可能無法將某個區塊識別為可用,但這隻需要一個誠實節點就能執行擦除編碼重建程式,以帶回剩餘的50%區塊。

因此,您無需下載1 MB來檢查1 MB區塊的可用性,而只需下載幾KB。這使得在每個區塊上執行資料可用性檢查變得可行。

有關如何使用點對點子網有效地執行此檢查的資訊,請參見:

https://hackmd.io/@vbuterin/sharding_proposal#Blob-publication-process‌

可以使用ZK-SNARK來驗證對一條資料的擦除編碼是否正確完成,然後可以使用Merkle分支來驗證各個區塊。或者,您可以使用多項式承諾(例如Kate(又名KZG)承諾‌),該承諾本質上是在一個簡單的元件中進行擦除編碼並證明單個元素和正確性驗證——這就是以太坊分片所使用的。

我們如何確保一切都正確?

假設您有100個區塊,並且您想不依靠委員會就有效地驗證所有區塊的正確性。我們需要執行以下操作:

每個客戶端在每個區塊上執行資料可用性取樣,以驗證每個區塊中的資料是否可用,同時每個區塊僅下載幾KB,即使區塊的整體大小為MB或更大。客戶端僅在正確響應了其可用性挑戰的所有資料後才接受區塊。

既然我們已經驗證了資料的可用性,那麼驗證正確性將變得更加容易。有兩種技術:

(1)我們可以使用欺詐證明:一些質押存款的參與者可以對每個區塊的正確性進行簽名。其他稱為挑戰者(或fisherman)的節點隨機檢查並嘗試完全處理區塊。因為我們已經檢查了資料可用性,所以始終可以下載資料並完全處理任何特定的塊。如果他們發現一個無效的區塊,他們將釋出一個所有人都可以驗證的挑戰。如果該塊被證明是壞的,則需要重新計算該塊以及所有依賴於該塊的未來區塊。

(2)我們可以使用ZK-SNARK:每個區塊都帶有一個ZK-SNARK證明正確性。

在以上兩種情況下,每個客戶端僅需要對每個區塊進行少量驗證工作,無論區塊有多大。就欺詐證據而言,偶爾需要在鏈上對區塊進行充分驗證,但這應該非常少見,因為即使僅觸發一個挑戰也是非常昂貴的。

這就是全部!在以太坊分片中,短期計劃是使分片的區塊僅成為資料(data only)。

也就是說,這些分片純粹是一個「資料可用性引擎」,使用該安全資料空間以及欺詐證明或ZK-SNARK來實現高吞吐量安全交易處理功能是Layer Rollup的工作。但是,完全有可能建立這樣一個內建系統來新增「本機」高吞吐量執行。

分片系統的關鍵特性是什麼?權衡是什麼?

分片的主要目標是儘可能地複製傳統(非分片)區塊鏈最重要的安全屬性,而無需每個節點親自驗證每筆交易。

分片正在非常接近到來。在傳統的區塊鏈中:

無效的區塊無法透過,因為驗證節點會注意到它們無效並忽略它們。

不可用的區塊無法透過,因為驗證節點無法下載它們並忽略它們。

在具有高階安全功能的分片區塊鏈中:

無效的區塊無法透過,因為:

(1)欺詐證明會迅速將其捕獲,並告知整個網路該區塊的不正確性,並嚴重懲罰建立者,或者

(2)ZK-SNARK證明是正確性,並且您不能為無效區塊製作有效的ZK-SNARK。

不可用的區塊無法透過,因為:

(1)如果只有不到50%的資料區塊可用,則幾乎可以肯定每個客戶端都會進行至少一次資料可用性樣本檢查,從而導致客戶端拒絕該資料塊,

(2)如果至少有50%的區塊資料可用,那麼實際上整個區塊都是可用的,因為僅需一個誠實節點即可重建其餘區塊。

沒有分片的傳統高TPS鏈無法提供這些保證。多鏈生態系統無法避免攻擊者選擇一條鏈進行攻擊並輕易接管的問題(這些鏈可以共享安全性,但是如果做得不好,它將變成事實上的傳統高TPS鏈 ,這些都是缺點,並且如果做得好,將只是上述分片技術的一種更復雜的實現)。

側鏈高度依賴於實現,但是它們通常容易面臨傳統高TPS鏈的弱點(這是如果它們共享礦工或驗證者)或多鏈生態系統的弱點(即如果它們不共享礦工或驗證者)。分片鏈避免了這些問題。

但是,分片系統中有一些隱患。尤其:

僅依賴於委員會的分片鏈很容易受到適應性對手的攻擊,並且問責制也較弱。也就是說,如果對手能夠實時入侵(或關閉)他們選擇的任何節點集合,那麼他們只需要攻擊少量節點即可破壞一個委員會。此外,如果對手(無論是適應性對手還是佔質押總數的50%的攻擊者)確實破壞了一個委員會,則只能公開確認他們的少數節點(該委員會中的節點)參與這個攻擊,因此只有少量質押會受到處罰。這是為什麼資料可用性取樣與欺詐證明或ZK-SNARK一起成為隨機取樣技術的重要補充的另一個關鍵原因。

僅當有足夠數量的線上客戶端集體收集足夠的資料可用性取樣請求時,資料可用性取樣才是安全的,這些響應幾乎總是重疊以構成至少50%區塊。在實踐中,這意味著必須有幾百個客戶端線上(並且此數量越大,系統容量與單個節點容量的比率就越高)。這是一個few-to-N信任模型‌——通常非常值得信賴,當然,它不如非分片鏈中的節點具有可用性的N-of-N信任那麼強大。

如果分片鏈依賴於欺詐證明,那麼它依賴於時序假設;如果網路太慢,則在欺詐證明顯示它是錯誤的之前,節點可能會接受某一個區塊具有最終性。幸運的是,如果您遵循嚴格的規則,一旦發現了無效性,就會還原所有無效塊,此閾值是使用者設定的引數:每個使用者都選擇等待達到最終狀態所需的時間,如果他們不想等待足夠長的時間,則會遭受損失,但更謹慎的使用者是安全的。即使如此,這仍在削弱使用者體驗。使用ZK-SNARK驗證有效性可以解決此問題。

需要傳遞大量的原始資料,從而增加了極端網路條件下發生故障的風險。與大量資料相比,少量資料更容易傳送(如果強大的政府試圖審查鏈,也更容易安全隱藏)。如果區塊鏈瀏覽器想要保留整個鏈,則需要儲存更多資料。

分片的區塊鏈依賴於分片的點對點網路,並且每個單獨的p2p「子網」由於具有較少的節點而更容易受到攻擊。用於資料可用性取樣的子網模型‌可以緩解這種情況,因為子網之間存在一些冗餘,但仍然存在風險。

這些是有效的關注點,儘管在我們看來,透過允許更多應用程式在鏈上執行而不是透過集中式第2層服務來實現的使用者級別集中化的減少,遠遠超過了它們。

也就是說,這些問題,特別是最後兩個問題,實際上是對增加分片鏈的吞吐量超過特定點的真正限制。二次分片的二次性是有限度的。

順便說一句,如果吞吐量過高,則分片區塊鏈的安全風險將日益增大,這也是很大程度上放棄了擴充套件至超二次分片的努力的主要原因。好像保持二次分片只是二次真的是快樂的媒介。

中心化生產和分片驗證

經常提出的一種替代分片的方法是,使用類似於中心化高TPS鏈的結構,除了它在頂部使用資料可用性取樣和分片以驗證有效性和可用性之外。

如今,中心化高TPS鏈在這方面有所改善,但仍比分片系統弱得多。這是出於以下幾個原因:

1、在高TPS鏈中,要檢測區塊生產者的審查要困難得多。審查檢查需要:

(1)能夠檢視每筆交易並驗證沒有明顯值得加入的交易,而該交易莫名其妙地無法進入;

(2)在區塊生產者中具有N分之一的信任模型。

在中心化高TPS鏈中,(1)是不可能的,而(2)則更困難,因為節點數少,甚至1of N信任模型都更容易被破壞,並且 如果該鏈的區塊時間對於DAS來說太快(就像大多數中心化高TPS鏈那樣),則很難證明節點的區塊不會僅僅因為它們的釋出速度太慢而被拒絕。

2、如果大多數區塊生產者和生態系統成員試圖強制執行不受歡迎的協議更改,則使用者的客戶肯定會檢測到它,但是社羣反抗和分叉的難度要大得多,因為他們需要旋轉一套新的昂貴的高吞吐量節點,以維持遵守舊規則的鏈條。

3、中心化基礎架構更容易受到外部參與者的審查。區塊生產節點的高吞吐量使其非常易於檢測,並且更易於關閉。審查專用的高效能運算在政治上和後勤上比在單個使用者的膝上型電腦上進行審查要容易得多。

4、高效能運算向中心化雲服務轉移的壓力更大,增加了整個鏈將在1-3家公司的雲服務中執行的風險,因此,由於許多區塊生產者同時失敗,導致鏈崩潰的風險更大。那些在自己的硬體上執行的驗證者的分片鏈不會容易受到這種攻擊。

適當分片的系統最好作為基礎層。對於一個分片的基礎層,您可以將其構建為Rollup,始終能夠建立一箇中心化生產系統(例如,您想要一個用於DeFi的具有同步可組合性的高吞吐量域名‌)。

但是,如果您有一個依賴於中心化區塊生產的基礎層,則不能在上面構建一個更加去中心化的Layer2。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读