以太坊分片Sharding FAQ

簡介

目前,在所有的區塊鏈協議中每個節點存儲所有的狀態(賬戶餘額,合約代碼和存儲等等)並且處理所有的交易。這提供了大量的安全性,但極大的限制了可擴展性:區塊鏈不能處理比一個單節點更多的交易。很大程度上因爲這個原因,比特幣被限制在每秒3-7筆交易,以太坊每秒7-15筆交易,等等。然後,這提出了一個問題:是否有方法創建一個新的機制,只讓一個小集合的節點來驗證每筆交易?只要有足夠多的節點驗證每筆交易那麼系統依然是高度安全的,但又足夠少使得系統系統可以並行處理很多的交易,我們是否可以使用這種技術來大大增加區塊鏈的吞吐量?

有哪些簡單但有缺陷的方式來解決這個問題?

”簡單的解決方案“主要由三大類。第一個是直接放棄獨立區塊鏈縮放性,而是假設用戶將使用許多不同的”altcoins"。這種方法極大提升了吞吐量,但是是以安全性爲代價:使用這種方案在在吞吐量上N-factor的增加必然伴隨在安全性上N-factor的下降。因此,對於大於N小值可以被論證是不可行的。

第二個是簡單增加區塊大小限制。這種方式可以起作用,而且在某些情況下可能是正確的處理方法,因爲區塊鏈大小可能更多受到政治上的約束而不是現實的技術考量。但不管個人對於個別案例的信念如何,這個方案不可避免有它的侷限性:如果區塊鏈運行的足夠長,那麼運行在消費者硬件上的節點就會退出,網絡將開始只能依賴於少數運行區塊鏈的超級計算機,者可能導致極大的中心化風險。

第三個是“合併挖礦”,這是一種多區塊鏈共存的技術,但所有的區塊鏈共享同一的挖礦激勵(或者權益證明系統中的賭注)。目前,Namecoin通過這樣的技術從比特幣區塊鏈中獲取了很大一部分的安全性。如果所有的礦工參與進來,理論上可以將吞吐量提升N倍而不會影響安全性。然而,這也存在這樣的問題:它將每個礦工的計算和存儲負載增加了N倍。所以,實際上這個方法僅僅是一個隱藏的區塊大小限制提升方式。

即使這被認爲可以接受的,依然存在這樣的缺陷:這些區塊鏈不是真正被“捆綁在一起"的;只需要少量的經濟激勵就能說服礦工放棄或妥協某個特定的區塊鏈。這種可能性是非常真實的,並且有合併挖礦被×××的[真實歷史事件](actual historical incidents),以及明確提倡使用合併挖礦×××作爲一種“治理特性”的開發者,對於給定的聯盟,破壞區塊鏈並不是有利可圖的。

如果每條鏈只有少數礦工參與合併挖礦,則集中化風險得到緩解,但合併挖礦的安全效益也大大降低。

這聽起來像是有某種擴展性三難困境在起作用。這三難困境是什麼呢,我們能突破它嗎?

這三難困境表明區塊鏈系統最多隻能擁有以下三個屬性中的兩個:

  • 去中心化(定義爲系統可以在每個參與者只能訪問O(c)資源的場景下運行,即普通筆記本電腦或小型VPS)

  • 擴展性(定義爲可以處理O(n) > O(c)交易)
  • 安全性(定義爲最多使用O(n)資源就可以抵禦安全×××)

在這個文檔的其餘部分,我們繼續使用c來指代每個節點的可用計算資源大小(包括計算,帶寬和存儲),以及用n指代抽象意義上生態系統的大小;我們假設交易負載,狀態大小和加密貨幣市值都與n成正比。

有人認爲,由於梅特卡夫定律,一個加密貨幣的市值應該與n ^ 2成正比,而不是n。 他們是正確的嗎?

不。

爲什麼不?

梅特卡夫法則認爲,網絡的價值與用戶數量的平方成正比(n ^ 2),因爲如果網絡有n個用戶,那麼網絡對每個用戶都有價值,但是每個用戶的價值是與用戶數量成正比,因爲如果一個網絡有n個用戶通過網絡有n-1個潛在的連接,每個用戶都可以從中受益。

在實踐中,實證研究表明,擁有n個用戶的網絡的價值”對於小的n值是與n ^ 2成比例且對於大的n值是與n×log n成比例“。這很容易理解,因爲對於小的n值,這個論點是成立的,但是一旦這個系統變得很大,兩個影響就會減緩增長。首先,實踐中的增長通常發生在社區中,因此在中等規模的網絡中,網絡通常已經提供了每個用戶關心的大部分連接。其次,連接往往是可以互相替代的。你可以爭論說人們從k個連接中只能獲得~O(log(k))的價值-有23個品牌的除臭劑可以選擇是好的,但並不不是說比有22個選擇好多了,而一個選擇和零個選擇是非常重要的差異。

另外,即使加密貨幣的價值與k個用戶的O(k log(k))成正比,如果我們接受上述解釋作爲這種情況的原因,那這也意味着交易量也是O(k log(k)),因爲每個用戶的log(k)價值理論上來自於用戶通過網絡執行log(k)的連接,並且狀態大小在許多情況下也應該隨着O(k log(k)) 一起增長,因爲至少有某種類型的狀態是特定關心而不是用戶特定的。因此,假設n=O(k log(k)) ,並且基於n(生態系統大小)和c(單節點的計算能力)是我們使用的完美模型。

有哪些適度簡單但只部分解決了可擴展性問題的方法?

許多分片建議(比如國大的Loi Luu等人提出的這個早期的BFT分片方案,以及爲比特幣提議的this Merklix tree方案)都試圖只分片交易或者只分片狀態,而不考慮其他方面。這些努力是令人欽佩的,可能會帶來效率上的提升,但他們遇到根本性的問題,他們只能解決其中一個瓶頸。我們希望能夠每秒處理超過10000個交易,而即不必強迫每個節點成爲超級計算機也不強迫每個節點存儲一兆字節的狀態數據,而這需要一個全面的解決方案即狀態存儲工作量,交易處理甚至交易下載和廣播都跨節點分散。

特別要注意的是,這要求在P2P級別做出變更,因爲廣播模型是不可擴展的,因爲它要求每個節點下載和重複廣播O(n) 的數據(每個被髮送的交易),而我們去中心化的標準假設是每個節點只能訪問各種O(c)資源。

有哪些不試圖“分片”任何東西的方法?

Bitcoin-NG 可以通過另外一種區塊鏈設計來增加擴展性,即如果節點花費大量CPU時間驗證區塊來使得網絡更安全。在簡單的PoW區塊鏈中,存在較高的中心化風險,並且如果閥值增長到節點的CPU時間超過5%用於驗證塊則共識安全就會被削弱;Bitcoin-NG的設計緩解了這個問題。然而,這僅僅使得交易擴展性提升了大約常量因子5-50x<sup>3,4</sup>,但並沒有提升狀態擴展性。也就是說,Bitcoin-NG式的方法與分片並不互相排斥,兩者當然可以同時實施。

基於通道的策略(閃電網絡,雷電網絡等)可以通過常量因子擴展交易容量,但不能擴展狀態存儲,並且還會帶來他們自己獨特的折衷和限制,特別是涉及到拒絕服務×××;通過分片實現鏈上擴展(加上其他的技術)和通過通道實現鏈下擴展可以說是必要和互補的。

還有其他一些使用高級密碼學的方法。如Mimblewimble 和基於ZK-SNARKs的策略來解決擴展性問題的特定部分。初始化全節點同步,而不是從創世塊驗證整個歷史,節點可以驗證一個密碼學證明當前狀態合法地遵循歷史記錄。這些方法確實解決了合法性問題,但是值得注意的是,可以依靠加密經濟學用更簡單的方式而不是純粹密碼學來解決同樣的問題-參見以太坊當前快速同步神同步的實現。這兩種方法都沒有緩解狀態大小的增長或者在線交易處理的限制。

Plasma 如何適應三難困境?

在Plasma子鏈發生較大×××的時候,Plasma子鏈的所有用戶需要提現回根鏈。如果Plasma有 O(N)用戶,那麼就需要 O(N)的交易,所以需要 O(N/C)的時間來處理所有的提現。如果提現延遲固定在某個D上(即天真的實現),那麼只要N>C*D,區塊鏈中就沒有足夠空間來及時處理所有的提現,這樣系統將變得不安全。在這種模式下,Plasma應該被視爲只通過一個(可能很大)常數因子來提升擴展性。如果提現延遲是靈活的,那麼如果有很多的提現發生他們會自動延長,這意味着當N增長的越來越大,×××者迫使所有人的資金被鎖定的時間越來越長,系統的“安全性“級別在一定意義上進一步降低。因爲擴展的拒絕訪問可以被認爲是安全上的失敗,儘管比失去所有訪問要折衷些。然而,這是與其他方案不同的折衷方案,可以說是一個更溫和的折衷,所以Plasma子鏈爲什麼依然是現狀的巨大改進。

狀態大小,歷史,加密經濟學,哦,我的天!在我們繼續之前,先定義一些這樣的術語!

  • 狀態 代表系統”當前狀態“的一個信息集合;確定交易是否有效,以及交易的結果,在最簡單的模型中應該僅僅依賴狀態。例如比特幣中UTXO的狀態數據,以太坊中的balances+nonces+code+storage,Namecoin中的域名註冊項。
  • 歷史:自從創世塊以來的所有交易的有序列表。在一個簡單模型中,當前狀態應該是創世狀態和歷史的確定性函數。
  • 交易:進入歷史的一個對象。在實踐中,一筆交易代表了某用戶想要做的操作,並且是加密簽名的。
  • 狀態轉換函數:一個獲取狀態,應用交易並輸出新狀態的函數。涉及的計算可能包含對交易指定的賬戶中增加或減少餘額,驗證數字簽名和運行合約代碼。
  • 默克爾樹:可以存儲大量數據的加密哈希樹結構,其中驗證每個單項數據項只需要O(log(n)) 的空間和時間。詳情看這裏。在以太坊中,每個塊的交易集合已經狀態都保存在默克爾樹中,樹的根被提交在塊中。
  • 收據:代表交易執行結果的對象,它並不存儲在狀態中,但仍存儲在一個默克爾樹中並提交到塊,以便節點在沒有擁有所有數據的情況下可以高效驗證證明。在以太坊開發中Logs就是收據。在分片模型中,收據是用來促進異步跨分片通信。
  • 輕客戶端:與區塊鏈交互的一種方式,它只需要非常少量的計算資源,默認情況下只需要跟蹤鏈的區塊頭,並根據需要請求關於交易,狀態和收據的相關信息,並驗證相關數據的默克爾證明。
  • 狀態根:代表狀態的默克爾樹根哈希。

image

分片背後的基本思想?

把狀態分成K = O(n / c) 分區,我們稱之爲”分片“。例如,以太坊的分片方案可能會將所有0x00開頭的所有地址放入一個分片,所有以0x01開頭的地方hi放入另外一個分片等等。在最簡單的分片形式中,每個分片都有自己的交易歷史,且在某個分片k中的交易影響僅限於分片k的狀態。一個簡單的例子是多資產區塊鏈,其中有k個分片,每個分片存儲餘額和處理一個特定資產相關的交易。在更高級的分片形式中,包括了某些形式的跨分片通信能力,其中一個分片上的交易可以出發其他分片上的事件。

分片區塊鏈的基本設計是怎麼樣的?

一個簡單的方法如下。存在一些稱爲協調者的節點,其接受在分片k上的交易(取決於協議,協調者可以選擇哪個k分片或者隨機分配k)並創建排序規則。一個排序規則有一個排序頭,一個形式爲”這是在分片k上的交易排序“的短消息。它期望分片k的前狀態根是0x12bc57,在當前排序的交易默克爾樹根是0x3f98ea,並且交易被處理之後的狀態根應當是0x5d0cc1。且協調者#1,2,4,5,8,11,13...98,99對其簽名。

一個區塊必須包括每個分片的排序頭,在以下情況下區塊是有效的:

  1. 在每個排序規則中給出的前狀態根必須與相關聯的分片當前的狀態根相匹配
  2. 在排序規則中所有的交易是有效的
  3. 在排序規則中給出的後狀態根必須與上面給定的狀態執行排序規則中的交易結果想匹配
  4. 排序規則必須被該分片的至少三分之二已註冊的協調者所簽名

需要注意的是,在這樣的系統中現在存在幾個”層次“的節點:

  • 超級全節點- 處理在所有排序規則中的所有交易,並且維護所有分片的全狀態
  • 頂級節點- 處理所有頂級(top-level)區塊,但不處理或試圖下載在每個排序規則的交易。相反,如果在某個分片中有三分之二協調者認爲一個排序規則是有效的,那麼這個排序規則就是有效的。
  • 單分片節點- 充當頂級節點,但同時也處理某個分片的所有交易和維護全狀態。
  • 輕節點- 僅下載和驗證頂級區塊的區塊頭;不處理任何排序頭或交易,除非它需要讀取某個特定分片的狀態的某些特定信息,在這種情況下,它下載該分片最近的排序頭的默克爾分支並且下載在該狀態下的默克爾證明期望值。

這裏面臨的挑戰是什麼?

  • 跨分片通信- 上述設計不支持跨分片通信。我們如何安全地增加跨分片通信。
  • 單分片接管×××- 如果在一個分片中×××者接管了大多數協調者,要麼獲取足夠的簽名來阻止任何排序規則,要麼更糟糕的,提交無效的排序?
  • 欺詐檢測- 如果得到一個無效的排序規則,節點(包括輕節點)如何能夠可靠的得知,以便它們可以驗證欺詐行爲並且確認是欺詐行爲之後拒絕這個排序規則?
  • 數據可用性問題- 作爲欺詐檢測的子集,排序規則中缺失數據這種特殊情況會怎麼樣?
  • 超二次分片- 在n > c^2的特殊情況下,在上面給出的簡單設計裏面,將會有超過O(c)的排序頭,因此普通節點將不能處理它們,只能處理頂級區塊。因此,在交易和頂級區塊頭直接超過兩級的間接尋址是需要的(即我們需要”分片的分片“)。達到這個目標的最簡單和最好的方式是什麼呢?

然後,交易的結果取決於之前發生在其他分片中的事件;一個典型的例子是貨幣轉賬,貨幣可以從分片i轉移到分片j,首先在分片i中創建一個”借記“交易來銷燬代幣,然後在分片j中創建一個”貸記“交易來創建代幣,並將借記交易的收據作爲貸記證明是合法的。

但是CAP定理意味着完全安全的分佈式系統是不可能的,因此分片是無法實現的?

CAP定理是於分佈式共識有關的結果。一個簡單的描述是:”在網絡發生分區的情況下,你必須選擇一致性或可用性,你不能同時擁有兩者“。直觀的論點很簡單:如果網絡分爲兩半,在一半網絡中發送交易”發送10個代幣給A",而在另一半發送交易”發送10個代幣給B“,然後系統是不可用的,因爲其中一個或者兩個交易將不被處理,或者變得不一致,因爲一半的網絡將看到第一個交易完成,另一半將看到第二個交易完成。注意CAP定理與擴展性無關;它適用於多節點需要對某個值導致一致的任何情況,而不管它們所達成一致的數據量大小。所有現有的去中心化系統已在可用性和一致性之間找到一些折衷方法,在這方面分片並沒有從根本上造成困難。

我們如何促進跨分片通信?

最容易滿足的一個場景是,有許多的應用程序沒有太多獨立用戶,而且這些應用程序只是偶爾或者很少與彼此交互;在這種情況下,應用程序可以在單獨的分片上生存,並通過使用收據來與其他分片進行通信。

這通常涉及將每筆交易分解爲”借記“和”貸記“。例如,假設我們有一個交易,其中賬戶A在分片M上,期望發送100個代幣到分片N上的賬戶B。這些步驟如下所示:

  1. 在分片M上發送一個交易(i)扣除賬戶A的100個代幣(ii) 創建一個收據。收據對象並不直接保存在狀態中,但收據的生成能通過默克爾證明來驗證。

  2. 等待第一個交易被包含進來(有時候需要等待終止化,這取決於系統)

  3. 在分片N上發送一個交易,包含來自(1)收據的默克爾證明。這個交易也檢查分片N上的狀態以確保收據是”未花費“;如果是的話,那麼它將賬戶B增加100個代幣,並且保存在狀態中代表收據已花費。

  4. 可選地,(3)中的交易也保存收據,然後可以在分片M中用來執行進一步的操作,這取決與原操作是否成功。

    image

在更復雜的分片形式中,交易在某些場景下可能具有分散在不同分片上的效果,並且可以從多個分片狀態中同時請求數據。

不同類型的應用程序如何與分片區塊鏈融合?

有些應用程序完全不需要跨分片交互;多資產區塊鏈和不需要互操作性的完全異構應用程序的區塊鏈是最簡單的案例。如果應用程序不需要彼此交互,如果可以異步交互,面臨的挑戰會更容易應對。也就是說,如果交互可以以分片A上的應用程序的形式完成,則生成收據,在分片B上的交易“消費”該收據並基於它執行一些操作,並且可能向分片A發送包含某些響應的“回調”。總的來說這個模式是很簡單的,並且不難將其整合入高級程序語言中。

需要注意的是,與可用於分片內通信的機制相比,用於異步跨分片通信的協議內置機制可能會有所不同並且功能較弱。在不可擴展的區塊鏈中的當前可用的一些功能在可擴展區塊鏈中只能用於分區內通信。

什麼是火車旅館問題?

下面的例子是Andrew Miller提供的。 假設用戶想要購買一張火車票並預訂一家旅館,並且想要確保這個操作是原子的 - 無論是保留成功還是兩者都不成立。 如果火車票和酒店預訂應用程序在同一個分片上,這很容易:創建一個交易,試圖進行兩個預訂,除非兩個預訂都成功,否則引發異常,並且回滾所有。 但是,如果兩者在不同的分片上,這並不是那麼容易; 即使沒有加密經濟/去中心化的問題,這實質上也是數據庫原子事務的問題。

只有異步消息,最簡單的解決方法是先預訂火車,然後再預訂旅館,然後一旦兩個預訂都成功就都確認;預訂機制將阻止其他人預留(或者至少會確保有足夠的空間開放讓所有的預訂被確認)一段時間。然而,這意味着該機制依賴於額外安全假設:來自於跨分片的消息可以在固定的週期內被包含在另外的分片中。

使用跨分片同步交易,問題更容易,但創建可以跨分片原子同步交易的分片解決方案的挑戰本身絕對是重要的。

如果單個應用程序的使用量超過 O(c),則該應用程序需要存在多個區塊鏈中。這樣做的可行性取決於應用程序自身的具體情況。一些應用程序(如貨幣)很容易並行化,而另外一些應用程序(例如某些類型的市場設計)則不能並行化智能串行處理。

我們知道分片區塊鏈的屬性有一個事實是不可能實現的。阿姆達爾定律 表明在應用程序有任何不可並行化組件的情況下,一旦容易獲得並行化,不可並行化組件就會快速成爲瓶頸。在像以太坊的通用計算平臺中,很容易提出不可並行化計算的例子:一個跟蹤內部變量x的合約,一旦接到到一個交易就將變量x設置爲sha3(x, tx_data)就是個簡單的例子。沒有分片方案可以給與這種形式的個別應用程序超過O(c)的性能。因此,隨着時間的推移,分片區塊鏈協議將會越來越好地能夠處理越來越多樣化的應用程序類型和應用程序交互,但分片架構至少在規模超過O(c)的某些方面總是落後於單分片的架構。

我們正在運行的是哪些安全模型?

評估區塊鏈設計的安全性有幾個競爭模型:

  • 誠實的大多數(或誠實的絕對多數):我們假設有一組驗證者,而且這些驗證者的½(或⅓或¼)由×××者控制,其餘的驗證者誠實地遵循協議。
  • 不協調的大多數:我們假設所有的驗證者在博弈論的上都是合理的(除了×××者,他們有動機使用某種方式來×××網絡),但是不超過一部分(通常在¼和½之間)協調他們的行動。
  • 協調選擇:我們假定所有的驗證者都是由同一個參與者控制的,或者完全有能力協調他們之間的經濟上最優的選擇。我們可以討論聯合的成本(或聯合的利潤)達到一些不良的結果。
  • 賄賂×××者模式:我們採取不協調的多數模型,而不是讓×××者成爲參與者之一,×××者處於協議之外,並有能力賄賂任何參與者來改變他們的行爲。×××者被模擬爲擁有預算,這是他們願意支付的最高金額,我們可以討論他們的成本,即他們最終爲破壞協議平衡而支付的金額。

比特幣的Eyal and Sirer’s selfish mining fix 工作量證明是健壯的,在誠實的大多數高達½的假設下,在不協調的大多數高達¼的假設下。Schellingcoin 在誠實的大多數假設和在不協調的大多數假設下高達½,在協調選擇模型下具有ε(即略微大於零)的×××成本,並且在賄賂×××者模型中由於P + epsilon attacks 要求具有P + ε預算要求和ε成本。

混合模型也是存在的。例如,即使是在協調選擇模型和賄賂×××者模型中,通常也會做出一個誠實的少數人的假設,某些部分(可能是1-15%)的驗證者會無視激勵而採取利他行爲。 我們也可以討論由50-99%的驗證者組成的聯盟,試圖破壞協議或傷害其他驗證者; 例如在工作量證明中,一個51%算力大小的聯盟可以通過拒絕包含其他礦工產出的區塊來增加增加自己的收入。

誠實的大多數模型可能是非常不切實際的,並且已經被證明了-比特幣的SPV mining fork 是個實際的例子。它證明了很多;例如,一個誠實的大多數模型意味着誠實的礦工自願燒燬他們自己的資金,以某種方式懲罰×××者。不協調的大多數模型的假設可能是現實的;還有個中間模型,其中大多數節點是誠實的但有個預算,如果他們失去了太多資金就回停止。

賄賂×××者模式在某些情況下被批評爲不切實際的對抗行爲,儘管其支持者認爲,如果一個協議的設計考慮了賄賂×××者模型,那麼它應該能夠大幅降低共識成本,因爲51%的×××變成一個可以從中恢復的事件。 我們將在不協調的大多數和賄賂×××者模型的背景下評估分片。

我們如何解決在不協調的大多數模型中的單分片接管×××?

簡單來說,隨機抽樣。 每個分片被分配一定數量的協調者(例如,150),在每個分片上批准區塊的協調者都是從分片的樣本中獲取的。樣本可以半頻繁地(例如每12小時一次)或最頻繁地(也就是說,沒有真正的獨立抽樣過程,每個塊從全局池中的每個分片隨機選擇協調者)進行重新洗牌。

結果是,在一個誠實/不協調的多數模型中,相對於每一個單節點正在驗證和創建塊,即使在任何給定的時間在每個分片上只有幾個節點驗證和創建塊,安全級別實際上並不低得多。 原因是簡單統計:如果你在全局集合上假設一個⅔誠實的絕對多數,如果樣本的大小是150,那麼以99.999%的概率就可以滿足樣本的誠實多數條件。 如果你假定在全局組合上有一個¾誠實的絕對多數,那麼這個概率就會增加到99.999999998%(這裏請看細節 )。

因此,至少在誠實/不協調的大多數情況下,我們有:

  • 去中心化(每個節點只存儲O(c) 數據,因爲它是O(c) 分片的一個輕客戶端,所以存儲O(1) * O(c) = O(c)的塊頭數據,以及對應於當前分配給它的一個或多個分片的完整狀態和近期歷史的O(c)數據)
  • 可擴展性 (有O(c) 個分片,每個分片有O(c) 的容量,最大容量是n = O(c^2))
  • 安全性(×××者需要控制整個O(n)大小的驗證池中的至少 ⅓ ,以便有機會接管網絡)。

在Zamfir模型中(或者在“非常非常適應性的對手”模型中),事情並不是那麼容易,但是我們稍後會做到這一點。 請注意,由於採樣的不完善性,安全閾值確實從1/2降低到了⅓,但相對於可能是100-1000倍的可擴展性收益而不會損失去中心化,這仍然是一個令人驚訝的低安全性損失。

你如何在工作量證明和權益證明中做這個抽樣?

在權益證明中,這很容易。 已經有一個“活動驗證者集合”在狀態中被跟蹤,並且可以直接從這個集合中簡單地抽樣。 協議內算法運行併爲每個分片選擇150個校驗者,或者每個校驗者獨立地運行一個算法,該算法使用一個共同的隨機源來(可證實地)確定它們在任何給定時間的分片。 請注意,抽樣任務是“強制性的”是非常重要的。 驗證者不能選擇它們進入的碎片。 如果驗證者可以選擇,那麼×××者可以用小權益集中他們的權益到一個分片上並×××它,從而消除系統的安全性。

在工作量證明中,這是比較困難的,就像“直接的”工作量證明計劃一樣,不能阻止礦工將工作量於某一特定的分片。 有可能使用proof-of-file-access forms工作量證明來將個人礦工鎖定到單獨的分片,但是很難確保礦工不能快速下載或生成可用於其他分片的數據並因此避開 這種機制。 最爲人所知的方法是通過Dominic Williams發明的一種叫做“拼圖塔”的技術,礦工首先在一個共同鏈上進行工作量證明,然後將這些證明導入到關於權益風格驗證池的證明中,然後驗證池就像在權益證明的情況下一樣。

一個可能的中間路線可能如下所示。 礦工可以花費大量的(O(c)大小)工作來創建一個新的“密碼身份”。 工作量證明方案的確切值,然後選擇他們在哪個分片上產生下一個塊。他們可以花費O(1)大小的工作量在分片上創建一個塊,然後工作量證明的價值決定了他們接下來可以繼續產塊的分片。注意的是,所有這些方法都以某種方式工作量證明“有狀態”,這是必要的。

取樣的頻率高低有哪些折衷?

選擇頻率隻影響如何自適應×××者使得協議仍然安全防禦他們; 例如,如果您認爲適應性×××(例如不誠實的驗證者發現他們是同一個樣本的一部分並且共同勾結)可能在6小時內發生但不會更早,那麼採樣時間爲4 小時而不是12小時。 這是一個贊成儘快抽樣的理由。

每個區塊進行抽樣的主要挑戰是重新改組會帶來非常高的開銷。 具體來說,驗證分片上的塊需要知道該分片的狀態,因此每次驗證器被重新改組時,驗證器需要下載他們所在的新分片的整個狀態。這需要強大的狀態大小控制策略(即經濟上確保狀態不會增長過大,無論是刪除舊賬戶,限制創建新賬戶的比率還是兩者的結合),以及相當長的重組時間。

目前,Parity客戶端可以在〜3分鐘內通過“warp-sync”下載和驗證完整的以太坊狀態快照; 如果我們增加20倍以彌補增加的使用量(10 tx / sec而不是0.5 tx / sec)(我們假定未來的狀態大小控制策略和從長期使用中積累的“灰塵”大致抵消了) 得到約60分鐘的狀態同步時間,這表明12-24小時的同步週期但不少於是安全的。

有兩條可能的途徑可以克服這個挑戰。

我們是否可以強制更多的狀態保持在用戶端,以便交易可以被驗證,而不需要驗證器來保存所有的狀態數據?

這裏的技術往往涉及要求用戶存儲狀態數據,併爲他們發送的每一個交易單獨提供Merkle證明。 一個交易將與一個正確執行Merkle證明一起發送,這個證明將允許一個只有狀態根的節點計算新的狀態根。 這種正確執行證明將包括需要遍歷的trie中對象的子集,以訪問和驗證交易必須驗證的狀態信息; 因爲Merkle證明的大小是 O(log(n)),所以訪問恆定數量對象的交易證明也是 O(log(n))大小。

image

Merkle樹中對象的子集,需要在訪問多個狀態對象的交易的Merkle證明中提供

以純粹的形式實施這個計劃有兩個缺陷。 首先,它引入了O(log(n))的開銷,儘管可以說這個O(log(n))開銷並不像看起來那麼糟糕,因爲它確保了驗證器總是可以簡單地將狀態數據保存在內存中, 它永遠不需要處理訪問硬盤驅動器的開銷。 其次,如果交易訪問的地址是靜態的,那麼它可以很容易地實施,但是如果所討論的地址是動態的那麼是很困難實施的,也就是說,如果交易執行的代碼是read(f(read(x))),其中某些狀態讀取的地址取決於其他狀態讀取的執行結果。 在這種情況下,交易發送者認爲交易將在發送交易時讀取的地址可能與交易被打包在塊中時實際讀取的地址不同,因此Merkle證明可能是不充分的。

一種折中方法是允許交易發送者發送一個證明,該證明包含訪問數據的最可能的可能性; 如果證明是充分的,則交易將被接受,如果狀態意外地變化並且證明不足,則發送者必須重新發送或者網絡中的一些幫助者節點重新發送交易並添加正確的證明。 那麼開發者可以自由地進行具有動態行爲的交易,但是行爲越動態,交易實際上被打包在塊中的可能性就越小。

注意驗證者在這種方法下的交易包含策略需要很複雜,因爲他們可能會花費數百萬的gas處理一筆交易運行到最後一步才發現訪問到他們沒有的一些狀態條目。 一個可能的妥協是驗證者有一個策略,只接受(i)低gas成本的交易,例如<100k。 (ii)靜態地指定一組允許訪問的合約,幷包含這些合約的整個狀態的證明。 請注意,這隻適用於最初廣播交易時; 一旦交易被打包在一個塊中,執行順序是固定的,因此只能提供與實際需要訪問的狀態對應的最小Merkle證明。

如果驗證者不立即重新重組,還有一個提高效率的機會。 我們可以期望驗證者存儲來自已經處理的交易的證明的數據,以便該數據不需要被再次發送; 如果k交易是在一個重組週期內發送的,那麼這就將Merkle證據的平均大小從log(n) 減少到log(n) -log(k)。

隨機抽樣的隨機性是如何產生的?

首先,重要的是要指出,即使隨機數的產生是高度可利用的,這對協議來說也不是一個致命的缺陷。 相反,它只是意味着有一箇中等偏高的中心化激勵。 原因在於,由於隨機性選取相當大的樣本,因此很難將隨機性偏差超過一定數量。
https://github.com/vhf/free-programming-books/blob/master/free-programming-books-zh.md#%E5%9C%A8%E7%BA%BF%E6%95%99%E8%82%B2
如上所述,最簡單的方法就是通過二項式分佈。 如果希望避免大小爲N的樣本被超過50%×××,並且×××者具有全球權益池的p%,則×××者能夠在一輪中獲得大多數的概率是:

image

下面是一個表格,說明N和P的各種值在實踐中的概率:

N = 50 N = 100 N = 150 N = 250
p = 0.4 0.0978 0.0271 0.0082 0.0009
p = 0.33 0.0108 0.0004 1.83 * 10-5 3.98 * 10-8
p = 0.25 0.0001 6.63 * 10-8 4.11 * 10-11 1.81 * 10-17
p = 0.2 2.09 * 10-6 2.14 * 10-11 2.50 * 10-16 3.96 * 10-26

因此,對於N> = 150,任何給定的隨機種子將導致有利於×××者的樣本的可能性確實非常小。 這就意味着從隨機性的安全角度來看,×××者需要在選擇隨機值的順序上有非常大的自由度,以徹底打破抽樣過程。 大多數權益證明隨機性的漏洞不允許×××者簡單地選擇種子; 在最壞的情況下,他們給了×××者許多機會從許多僞隨機生成的選項中選出最有利的種子。 如果對此非常擔心,可以簡單地將N設置爲更大的值,並且在計算隨機性的過程中添加適度的硬key-derivation函數,從而需要超過2<sup>100</sup>計算步驟來找到足夠隨機性偏差。

現在,我們來看看爲了獲利而不是直接接管,試圖更輕微影響隨機性的×××風險。 例如,假設有一個算法從一些非常大的集合中僞隨機地選擇了1000個驗證者(每個驗證者獲得$ 1的獎勵),×××者擁有10%的權益,所以×××者的平均“誠實”收入爲100, ×××者可以操縱隨機性來“重新擲骰子”(×××者可以無限次地執行此操作),這個成本是1美元。

由於中心極限定理,樣本數量的標準偏差,並且基於數學上的其他已知結果,N個隨機樣本的期望最大值略低於M + S sqrt(2 log(N)),其中M是 平均值和S是標準差。 因此,操縱隨機性和有效地重擲骰子(即增加N)的獎勵急劇下降, 重新選擇你的預期獎勵是100美元,一個重新選擇105.5美元,兩個108.5美元,其中三個110.3美元,其中四個111.6美元,五個112.6美元,六個113.5美元。 因此,在五次重試之後,它不值得這樣做。 結果,一個有10%權益的經濟動機的×××者會(在社會上浪費)花5美元獲得13美元的額外收入,淨盈餘爲8美元。

然而,這種邏輯假定單輪重擲骰子是昂貴的。 許多比較老的權益證明算法有一個“權益磨損”漏洞,重擲擲骰子只是在本地計算機上進行計算; 具有此漏洞的算法在分片環境中肯定是不可接受的。 較新的算法(參見關於權益證明FAQ的“驗證器選擇”部分)具有隻能通過在塊創建過程中自願放棄一個點來完成擲骰子的屬性,這需要放棄獎勵和費用。 減輕邊緣經濟動機的×××對樣本選擇的影響的最好辦法是找到增加成本的方法。 一種將N輪投票的成本增加一倍的方法是由Iddo Bentov設計的多數位方法; Mauve論文分片算法期望使用這種方法。

多米尼克·威廉斯(Dominic Williams)最爲研究和倡導的確定性門限簽名方法是另一種不被少數羣體聯盟利用的隨機數生成方式。 這裏的策略是使用確定性的門限簽名來從選擇樣本中生成隨機種子。 確定性閾值簽名具有這樣的屬性,即不管給定的一組參與者中的哪一個向算法提供其數據,只要至少1/3的參與者誠實地參與,值就保證相同。 這種方法顯然不是經濟上可以利用的,並且完全抵抗各種形式的權益磨損,但是它有幾個弱點:

  • 它依賴於更復雜的密碼學(具體來說,橢圓曲線和配對)。 其他方法僅僅依賴於對常見散列算法的隨機預言。
  • 當許多驗證器脫機時,它會失敗。 公共區塊鏈的預期目標就是能夠在網絡的很大一部分節點同時消失但剩餘節點大部分是誠實的情況下,它依然可以存活。 確定性門限簽名方案在這一點上不能提供這種屬性。
  • 在Zamfir模型中,有超過⅔ 的驗證器串通是不安全的。 上述權益證明FAQ中描述的其他方法仍然會使操作隨機性變得非常昂貴,因爲來自所有驗證人的數據被混合到種子中,並且進行任何操作都需要通用串通或徹底排除其他驗證者。

有人可能會認爲確定性門限簽名方法在一致性較好的情況下工作得更好,其他方法在可用性較好的情況下工作得更好。

在賄賂×××者或協調選擇模式中通過隨機抽樣進行分片的關注點是什麼?

在賄賂×××者或協調選擇模型中,驗證者是隨機抽樣的事實並不重要:不管樣本是什麼,×××者都可以賄賂絕大多數樣本做×××者喜歡的事情,或者×××者直接控制大多數的樣本,並且可以指揮樣本以低成本(O(c) 成本)執行任意的動作。

在這一點上,×××者有能力對該樣本進行51%的×××。 由於存在跨分片擴散風險,威脅進一步放大:如果×××者破壞了分片的狀態,×××者就可以開始向其他分片發送無限量的資金,並執行其他跨分片的惡作劇。 總而言之,賄賂×××者或協調選擇模型的安全性並不比簡單地創O(c) altcoins好得多。

我們如何改進?

基本上是通過全面解決欺詐檢測問題。

解決這個問題的一個主要類別是使用挑戰-響應機制。 挑戰-響應機制通常依賴於一個升級原則:事實上X(例如,“在#54分片的排序#17293是有效的”)最初被接受爲真,如果至少有k個驗證人簽署聲明(背後有存款)爲真。 但是,如果發生這種情況,那麼在這個挑戰期間,2k驗證者可以簽署聲明,聲明這是錯誤的。 如果發生這種情況,4k驗證人可以簽署一個聲明,說明聲明實際上是真實的,等等,直到一方放棄或大多數驗證人已經簽署聲明,此時每個驗證人和客戶端自己檢查X是否爲真。 如果X被裁定爲正確,那麼所有提出這種聲明的人都會得到獎勵,每個提出錯誤聲明的人都會受到懲罰,反之亦然。

看看這個機制,你可以證明惡意行爲者失去了一定數量的資金,與他們被迫查看給定數據的行爲者數量成比例。 強迫所有用戶查看數據需要大量的驗證者簽署錯誤的聲明,這可以用來懲罰他們,所以迫使所有用戶查看一段數據的成本是 O(n); 這防止了挑戰-響應機制被用作拒絕服務向量。

什麼是數據可用性問題,我們如何使用糾刪碼來解決它?

See <https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding&gt;

我們可以通過某種奇特的密碼累加器方案來消除解決數據可用性的需要嗎?

不。假設有一個方案存在一個表示狀態的對象S(S可能是一個散列),以及個別用戶持有的可以證明存在狀態對象的輔助信息(“證人”)(例如 S是Merkle根,證人是分支,儘管其他結構如RSA累加器確實存在)。 存在廣播一些數據的更新協議,並且該數據改變S以改變狀態的內容,並且還可能改變證人。

假設某個用戶在該狀態下有一組N個對象的證人,並且更新了這些對象中的M個。 接收到更新信息後,用戶可以檢查所有N個對象的新狀態,從而查看哪個M被更新。 因此,更新信息本身至少編碼~M * log(N)個比特的信息。 因此,爲了實現M個交易的效果,每個人需要接收的更新信息必須是O(M)。

那麼這意味着我們實際上可以創建可擴展的分片區塊鏈,其中發生不良事件的成本與整個驗證人集的大小成正比?

有一個微不足道的×××,×××者總是可以焚燒O(c)資金來暫時降低分片的質量:通過發送高交易費用的交易來製造垃圾,迫使正常用戶無法進入。這種×××是不可避免的;你可以用靈活的gas限制進行補償,甚至可以嘗試根據使用情況嘗試自動重新分配節點到分片的“透明分片”方案,但是如果某個特定的應用程序是不可並行的,Amdahl法則保證你無能爲力。在這裏打開的×××(提醒:它只適用於Zamfir模式,而不是誠實/不協調的大多數)可以說沒有比垃圾交易×××嚴重得多。因此,我們已經達到了單個分片安全性的已知限制,並且試圖走得更遠是沒有價值的。

讓我們往回走一點,如果有實時重組,我們是否真的需要這種複雜性?不實時重組基本上意味着每個分片直接從全局驗證人池中提取驗證人,所以它就像區塊鏈一樣運行,所以分片實際上不會引入任何新的複雜性?

有點。首先,值得注意的是,工作量證明和簡單的權益證明,即使沒有分片,在賄賂×××者模型中都具有非常低的安全性;一個區塊在經過O(n) 時間後纔在經濟意義上真正地“確定”(好像只有幾個區塊已經過去了,那麼替換區塊的經濟成本就是從區塊有問題之前開始雙花的成本)。Casper通過增加最終機制解決了這個問題,經濟安全邊際立即增加到最大。在一個分片鏈中,如果我們想要經濟最終性的話,那麼我們需要提出一個演繹鏈,爲什麼一個驗證人願意在一個完全基於隨機樣本的鏈上做出一個非常強有力的聲明,當驗證人本身相信賄賂×××者和協調選擇模型可能是真實的,所以隨機樣本可能被破壞。

你提到透明分片。 我12歲了,這是什麼?

基本上,我們並不直接向開發者提供“分片”的概念,也不會永久性地將狀態對象分配給特定的分片。 相反,該協議有一個正在進行的內置負載均衡過程,可以在分片之間移動對象。 如果分片變得太大或者消耗太多的gas,可以分成兩半。 如果兩個分片變得太小,並且經常彼此交互,他們可以合併在一起; 如果所有分片太小,則可以刪除一個分片並將其內容移動到各種其他分片等等。

想象一下,唐納德·特朗普是否意識到人們在紐約和倫敦之間的旅行很多,但是有一個海洋的路,所以他可以拿出剪刀,剪掉海洋,把美國東海岸和西歐粘在一起, 大西洋旁邊的南極 - 這就是這樣的。

這有哪些優點和缺點?

  • 開發者不再需要考慮分片
  • 分片有可能根據gas價格的變化手動調整,而不是依靠市場機制來提高一些分片中的gas價格
  • 不再有一個可靠的共置的概念:如果兩個以太坊 智能合約被放入同一個分片,以便他們可以互相交互,分片的變化可能最終將它們分開
  • 協議更復雜

可以通過引入“順序域”的概念來緩解共置問題,其中合約可以指定它們存在於相同的順序域中,在這種情況下,它們之間的同步通信將始終是可能的。 在這個模型中,一個分片可以被看作是一組被一起驗證的順序域,並且如果協議確定這樣做是有效的,那麼順序域可以在分片之間重新平衡。

同步跨分片消息將如何工作?

如果您將歷史交易記錄視爲已經結算,並且只是試圖計算狀態轉換函數,則該過程變得更容易。有幾種方法;一個相當簡單的方法可以描述如下:

  • 一個交易可以指定一個可以在其中操作的一組分片
  • 爲了使交易有效,它必須在所有分片上被打包在相同塊高處。
  • 塊中的交易必須按照它們的散列順序(這確保了規範的執行順序)

如果分片X上的客戶端看到帶有分片(X,Y)的交易,則請求分片Y中的Merkle證明,以驗證(i)分片Y上存在該交易,以及(ii)分片上的前置狀態Y表示交易需要訪問的那些數據位。然後執行交易並提交執行結果。請注意,如果很多交易有許多不同的“塊對”,那麼這個過程可能是非常低效的;由於這個原因,只需要簡單的要求塊來指定姐妹分片就可能是最佳的,然後可以在每塊級別更有效地進行計算。這是該方案如何運作的基礎;人們可以想象更復雜的設計。但是,在進行新的設計時,確保低成本的拒絕服務×××不能任意拖慢狀態計算總是非常重要的。

那麼半異步消息呢?

Vlad Zamfir創建了一個方案,異步消息仍然可以解決“預訂火車和旅館”的問題。這工作如下。狀態記錄了最近所做的所有操作,以及任何給定操作(包括跨分片操作)觸發哪些操作的圖譜。如果操作被還原,則創建收據,然後可以使用該收據來回滾該操作對其他分片的任何影響;這些回滾可能會觸發他們自己的回滾之類。這個論點是,如果一個偏好系統使得回滾消息可以像其他類型的消息一樣快地傳播兩次,那麼一個在K個回合中完成執行的複雜跨分片交易可以在另外的K個回合中完全回滾。

這個方案引入的開銷可以說是沒有得到充分的研究;可能存在觸發二次執行漏洞的最壞情況。很顯然,如果交易具有更加孤立的影響,這種機制的開銷較低;也許可以通過有利的gas成本規則激勵孤立執行。總而言之,這是高級分片更有前途的研究方向之一。

什麼是保證跨分片調用?

分片中的挑戰之一是,在進行調用時,默認情況下沒有硬協議提供,保證由該調用創建的任何異步操作都將在特定的時間範圍內完成,甚至完全沒有;而是由某方在目的地分片中發送觸發收據的交易。這對於許多應用程序來說是可以的,但是在某些情況下,由於以下幾個原因可能會有問題:

  • 可能沒有任何明確的激勵措施來觸發給定的收據。如果一個交易的發送給多方帶來了好處,那麼在各方試圖等待更長時間直到其他人發送交易(即玩“雞”)或者簡單地決定發送一個交易交易是不值得單獨交易的。
  • 跨分片的gas價格可能會波動,在某些情況下,執行前半部的操作會迫使用戶“堅持到底”,但用戶可能不得不以更高的gas價格來追蹤。這可能會由於DoS×××和相關的惡意破壞形式而加劇。
  • 一些應用依賴於跨分片消息的“等待時間”上限(例如火車和旅館示例)。由於缺乏硬性保證,這些應用程序將必須具有無效率大安全邊界。

人們可以試着想出一個系統,在某些分片中生成的異步消息在一定數量的塊之後自動觸發目標分片中的結果。然而,這要求每個分片上的每個客戶端在計算狀態轉換函數的過程中主動檢查所有其他分片,這可能是低效率的來源。最爲人所知的折衷方法是:當高度爲height_a的分片A的收據包含在高度爲height_b的碎片B中時,如果塊高度的差異超過MAX_HEIGHT,則碎片B中的所有驗證人都從height_a + MAX_HEIGHT + 1創建塊到height_b - 1是受到懲罰的,這個懲罰成倍增加。這些處罰的一部分給予最終包括該塊作爲獎勵的確認者。這使狀態轉換功能保持簡單,同時仍強烈激勵正確的行爲。

等等,但是如果×××者同時從每一個碎片向碎片X發送一個跨分片調用呢?在數學上不能及時包含所有這些調用嗎?

正確;這是個問題。這是一個建議的解決方案。爲了從分片A到分片B進行跨分片調用,調用者必須預先購買“凍結分片B的gas”(這是通過分片B中的交易完成的,並記錄在分片B中)。凍結分片B的gas具有快速滯期費率:一旦排序,每塊失去1 / k的剩餘效能。分片A上的交易隨後可以將凍結的分片B gas與其創建的收據一起發送,並且可以在分片B上免費使用。分片B的塊專門爲這些交易分配額外的gas空間。請注意,由於滯期規則,對於給定的分片,在任何時候都可以獲得最多GAS_LIMIT * k的凍結gas,當然可以在k個塊內填充(事實上,由於滯期造成的速度更快,但是我們可能由於惡意驗證人需要這個鬆散的空間)。假如太多的驗證人惡意地不包括收據,我們可以通過免除驗證者來公平懲罰,儘可能多地從最舊的收據開始填充更多收據到“收據空間”。

在此預購機制下,想要進行跨分片操作的用戶將首先預先購買所有將要進行操作的分片的gas,過度購買以考慮滯期費用。 如果操作會創建一個收據,觸發在B分片中消耗100000gas的操作,那麼用戶將預先購買100000 e(如271818)分片B凍結的gas。 如果該操作反過來在分片C中花費100000gas(即,兩個間接級別),則用戶將需要預先購買100000 e^2(如738906)分片C凍結的gas。 注意,一旦購買被確認,並且用戶開始主要操作,用戶可以確信他們將與gas價格市場的變化隔離,除非驗證者自願地從收據不包含懲罰中失去大量的資金。

凍結gas? 這聽起來很有趣,不僅是跨分片操作,還有可靠的分片內調度

確實; 您可以購買分片A中的凍結分片A gas,並從分片A向其自身發送保證的跨鏈分片調用。 雖然注意到這個方案只支持在很短的時間間隔內進行調度,並且調度對於這個塊是不準確的; 只能保證在一段時間內發生。

是否內分片和跨分片有保證的調度,有助於抵制試圖審查交易的大多數共謀?

是。 如果用戶未能獲得交易,因爲共謀驗證者正在過濾交易並且不接受任何包含該交易的塊,則用戶可以發送一系列消息來觸發一系列有保證的預定消息,最後一個消息在EVM內部重建交易並執行它。 如果不徹底關閉有保證的調度功能,並嚴重限制整個協議,防止這種規避技術實際上是不可能的,因此惡意的驗證者將無法輕易做到。

分片區塊鏈可以更好地處理網絡分區嗎?

本文檔中描述的方案不會改進非分片區塊鏈; 實際上,每個分區最終都會在分區兩側有一些節點。 有人(例如來自IPFS的Juan Benet)建立了可擴展的網絡,其具體目標是網絡可以根據需要切分成分片,從而在網絡劃分的條件下儘可能地繼續運行,但是存在不尋常的加密經濟挑戰來做好這項工作。

一個主要的挑戰是,如果我們想要基於位置的分片,那麼地理網絡劃分最低限度地阻礙了分片內聚合(具有非常低的分片內延遲和因此非常快的分片內塊時間的副作用),那麼 我們需要有一種方法讓驗證者選擇他們正在參與的分片。這是很危險的,因爲它允許在誠實/不協調的多數模型中有更多類別的×××,和Zamfir模型中更高作惡因子更低成本的×××。 地理切分分片的安全性和通過隨機抽樣來分片效率是兩個完全不同的事情。

其次,如何組織應用程序需要更多的思考。 上面描述的分片區塊鏈中的一個可能的模型是每個“app”在某個分片上(至少對於小規模的應用程序)。 但是,如果我們希望應用程序本身具有分區防護功能,則意味着所有應用程序都需要在某種程度上進行跨分片。

解決這個問題的一個可能途徑是創建一個提供兩種分片的平臺 - 一些分片是隨機抽樣的高安全性“全局”分片,而其他碎片則是較低安全“本地”分片,可能具有屬性的如超快的塊時間和更便宜的交易費用。 非常低的安全性碎片甚至可以用於數據發佈和消息傳遞。

通過 n = O(c^2)推動擴展的獨特挑戰是什麼?

有幾個考慮因素。首先,需要將算法從雙層算法轉換爲可堆疊的n層算法;這是可能的,但是很複雜。其次,n / c(即網絡的總計算負荷與一個節點的容量之間的比率)恰好是接近兩個常數的值:首先,如果以塊爲單位測量,則幾個小時的時間跨度,這是一個可以接受的“最大安全確認時間”,其次是獎勵和存款之間的比率(早期計算表明Casper的存款大小爲32ETH,塊獎勵爲0.05ETH)。後者的後果是,如果一個分片上的獎勵和懲罰升級到驗證者存款的規模,持續×××分片的成本將是O(n)大小。

高於c^2可能會導致進一步削弱系統所能提供的安全保障類別,並允許×××者以中等成本長時間週期以某種方式×××某個碎片,儘管仍有可能防止無效狀態被最終確定,並防止最終狀態被回滾,除非×××者願意支付O(n)的成本。然而,回報是巨大的 - 一個超級分割的區塊鏈可以用作幾乎所有去中心化應用程序的通用工具,並且可以承擔交易費用,使其幾乎免費。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章