(以太坊的狀態樹,以及狀態根(state root)是如何嵌入到區塊結構上的)
分片背後的基本思想?
把狀態分成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對其簽名。
一個區塊必須包括每個分片的排序頭,在以下情況下區塊是有效的:
在每個排序規則中給出的前狀態根必須與相關聯的分片當前的狀態根相匹配
在排序規則中所有的交易是有效的
在排序規則中給出的後狀態根必須與上面給定的狀態執行排序規則中的交易結果想匹配
排序規則必須被該分片的至少三分之二已註冊的協調者所簽名
需要注意的是,在這樣的系統中現在存在幾個”層次“的節點:
超級全節點 - 處理在所有排序規則中的所有交易,並且維護所有分片的全狀態
頂級節點 - 處理所有頂級(top-level)區塊,但不處理或試圖下載在每個排序規則的交易。相反,如果在某個分片中有三分之二協調者認為一個排序規則是有效的,那麼這個排序規則就是有效的。
單分片節點 - 充當頂級節點,但同時也處理某個分片的所有交易和維護全狀態。
輕節點 - 僅下載和驗證頂級區塊的區塊頭;不處理任何排序頭或交易,除非它需要讀取某個特定分片的狀態的某些特定資訊,在這種情況下,它下載該分片最近的排序頭的默克爾分支並且下載在該狀態下的默克爾證明期望值。
這裡面臨的挑戰是什麼?
跨分片通訊 - 上述設計不支援跨分片通訊。我們如何安全地增加跨分片通訊。
單分片接管攻擊 - 如果在一個分片中攻擊者接管了大多數協調者,要麼獲取足夠的簽名來阻止任何排序規則,要麼更糟糕的,提交無效的排序?
欺詐檢測 - 如果得到一個無效的排序規則,節點(包括輕節點)如何能夠可靠的得知,以便它們可以驗證欺詐行為並且確認是欺詐行為之後拒絕這個排序規則?
資料可用性問題 - 作為欺詐檢測的子集,排序規則中缺失資料這種特殊情況會怎麼樣?
超二次分片 - 在n > c^2的特殊情況下,在上面給出的簡單設計裡面,將會有超過O(c)的排序頭,因此普通節點將不能處理它們,只能處理頂級區塊。因此,在交易和頂級區塊頭直接超過兩級的間接定址是需要的(即我們需要”分片的分片“)。達到這個目標的最簡單和最好的方式是什麼呢?
然後,交易的結果取決於之前發生在其他分片中的事件;一個典型的例子是貨幣轉賬,貨幣可以從分片 i 轉移到分片 j ,首先在分片 i 中建立一個”借記“交易來銷燬代幣,然後在分片j中建立一個”貸記“交易來建立代幣,並將借記交易的收據作為貸記證明是合法的。
但是CAP定理意味著完全安全的分散式系統是不可能的,因此分片是無法實現的?
CAP定理是於分散式共識有關的結果。一個簡單的描述是:”在網路發生分割槽的情況下,你必須選擇一致性或可用性,你不能同時擁有兩者“。直觀的論點很簡單:如果網路分為兩半,在一半網路中傳送交易”傳送10個代幣給A",而在另一半傳送交易”傳送10個代幣給B“,然後系統是不可用的,因為其中一個或者兩個交易將不被處理,或者變得不一致,因為一半的網路將看到第一個交易完成,另一半將看到第二個交易完成。注意CAP定理與擴充套件性無關;它適用於多節點需要對某個值導致一致的任何情況,而不管它們所達成一致的資料量大小。所有現有的去中心化系統已在可用性和一致性之間找到一些折衷方法,在這方面分片並沒有從根本上造成困難。
我們如何促進跨分片通訊?
最容易滿足的一個場景是,有許多的應用程式沒有太多獨立使用者,而且這些應用程式只是偶爾或者很少與彼此互動;在這種情況下,應用程式可以在單獨的分片上生存,並透過使用收據來與其他分片進行通訊。
這通常涉及將每筆交易分解為”借記“和”貸記“。例如,假設我們有一個交易,其中賬戶A在分片M上,期望傳送100個代幣到分片N上的賬戶B。這些步驟如下所示:
在分片M上傳送一個交易(i)扣除賬戶A的100個代幣(ii) 建立一個收據。收據物件並不直接儲存在狀態中,但收據的生成能透過默克爾證明來驗證。
等待第一個交易被包含進來(有時候需要等待終止化,這取決於系統)
在分片N上傳送一個交易,包含來自(1)收據的默克爾證明。這個交易也檢查分片N上的狀態以確保收據是”未花費“;如果是的話,那麼它將賬戶B增加100個代幣,並且儲存在狀態中代表收據已花費。
可選地,(3)中的交易也儲存收據,然後可以在分片M中用來執行進一步的操作,這取決與原操作是否成功。
在更復雜的分片形式中,交易在某些場景下可能具有分散在不同分片上的效果,並且可以從多個分片狀態中同時請求資料。
不同型別的應用程式如何與分片區塊鏈融合?
有些應用程式完全不需要跨分片互動;多資產區塊鏈和不需要互操作性的完全異構應用程式的區塊鏈是最簡單的案例。如果應用程式不需要彼此互動,如果可以非同步互動,面臨的挑戰會更容易應對。也就是說,如果互動可以以分片A上的應用程式的形式完成,則生成收據,在分片B上的交易“消費”該收據並基於它執行一些操作,並且可能向分片A傳送包含某些響應的“回撥”。總的來說這個模式是很簡單的,並且不難將其整合入高階程式語言中。
需要注意的是,與可用於分片內通訊的機制相比,用於非同步跨分片通訊的協議內建機制可能會有所不同並且功能較弱。在不可擴充套件的區塊鏈中的當前可用的一些功能在可擴充套件區塊鏈中只能用於分割槽內通訊 7 。
什麼是火車旅館問題?
下面的例子是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)大小的工作量在分片上建立一個塊,然後工作量證明的價值決定了他們接下來可以繼續產塊的分片 8 。注意的是,所有這些方法都以某種方式工作量證明“有狀態”,這是必要的。
取樣的頻率高低有哪些折衷?
選擇頻率隻影響如何自適應攻擊者使得協議仍然安全防禦他們; 例如,如果您認為適應性攻擊(例如不誠實的驗證者發現他們是同一個樣本的一部分並且共同勾結)可能在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))大小。
(Merkle樹中物件的子集,需要在訪問多個狀態物件的交易的Merkle證明中提供)
以純粹的形式實施這個計劃有兩個缺陷。 首先,它引入了O(log(n))的開銷,儘管可以說這個O(log(n))開銷並不像看起來那麼糟糕,因為它確保了驗證器總是可以簡單地將狀態資料儲存在記憶體中, 它永遠不需要處理訪問硬碟驅動器 9 的開銷。 其次,如果交易訪問的地址是靜態的,那麼它可以很容易地實施,但是如果所討論的地址是動態的那麼是很困難實施的,也就是說,如果交易執行的程式碼是read(f(read(x))),其中某些狀態讀取的地址取決於其他狀態讀取的執行結果。 在這種情況下,交易傳送者認為交易將在傳送交易時讀取的地址可能與交易被打包在塊中時實際讀取的地址不同,因此Merkle證明可能是不充分的 10 。
一種折中方法是允許交易傳送者傳送一個證明,該證明包含訪問資料的最可能的可能性; 如果證明是充分的,則交易將被接受,如果狀態意外地變化並且證明不足,則傳送者必須重新傳送或者網路中的一些幫助者節點重新傳送交易並新增正確的證明。 那麼開發者可以自由地進行具有動態行為的交易,但是行為越動態,交易實際上被打包在塊中的可能性就越小。
注意驗證者在這種方法下的交易包含策略需要很複雜,因為他們可能會花費數百萬的gas處理一筆交易執行到最後一步才發現訪問到他們沒有的一些狀態條目。 一個可能的妥協是驗證者有一個策略,只接受(i)低gas成本的交易,例如< 100k, (ii)靜態地指定一組允許訪問的合約,幷包含這些合約的整個狀態的證明。 請注意,這隻適用於最初廣播交易時; 一旦交易被打包在一個塊中,執行順序是固定的,因此只能提供與實際需要訪問的狀態對應的最小Merkle證明。
如果驗證者不立即重新重組,還有一個提高效率的機會。 我們可以期望驗證者儲存來自已經處理的交易的證明的資料,以便該資料不需要被再次傳送; 如果k交易是在一個重組週期內傳送的,那麼這就將Merkle證據的平均大小從log(n) 減少到log(n) -log(k)。
隨機抽樣的隨機性是如何產生的?
首先,重要的是要指出,即使隨機數的產生是高度可利用的,這對協議來說也不是一個致命的缺陷。 相反,它只是意味著有一箇中等偏高的中心化激勵。 原因在於,由於隨機性選取相當大的樣本,因此很難將隨機性偏差超過一定數量。
如上所述,最簡單的方法就是透過二項式分佈。 如果希望避免大小為N的樣本被超過50%攻擊,並且攻擊者具有全球權益池的p%,則攻擊者能夠在一輪中獲得大多數的概率是:
下面是一個表格,說明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,任何給定的隨機種子將導致有利於攻擊者的樣本的可能性確實非常小 11,12 。 這就意味著從隨機性的安全形度來看,攻擊者需要在選擇隨機值的順序上有非常大的自由度,以徹底打破抽樣過程。 大多數權益證明隨機性的漏洞不允許攻擊者簡單地選擇種子; 在最壞的情況下,他們給了攻擊者許多機會從許多偽隨機生成的選項中選出最有利的種子。 如果對此非常擔心,可以簡單地將N設定為更大的值,並且在計算隨機性的過程中新增適度的硬key-derivation函式,從而需要超過2100計算步驟來找到足夠隨機性偏差。
現在,我們來看看為了獲利而不是直接接管,試圖更輕微影響隨機性的攻擊風險。 例如,假設有一個演算法從一些非常大的集合中偽隨機地選擇了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)最為研究和倡導的確定性門限簽名方法是另一種不被少數群體聯盟利用的隨機數生成方式。 這裡的策略是使用確定性的門限簽名來從選擇樣本中生成隨機種子。 確定性閾值簽名具有這樣的屬性,即不管給定的一組參與者中的哪一個向演算法提供其資料,只要至少⅔的參與者誠實地參與,值就保證相同。 這種方法顯然不是經濟上可以利用的,並且完全抵抗各種形式的權益磨損,但是它有幾個弱點:
它依賴於更復雜的密碼學(具體來說,橢圓曲線和配對)。其他方法僅僅依賴於對常見雜湊演算法的隨機預言。
當許多驗證器離線時,它會失敗。 公共區塊鏈的預期目標就是能夠在網路的很大一部分節點同時消失但剩餘節點大部分是誠實的情況下,它依然可以存活; 確定性門限簽名方案在這一點上不能提供這種屬性。
在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
我們可以透過某種奇特的密碼累加器方案來消除解決資料可用性的需要嗎?
不。假設有一個方案存在一個表示狀態的物件S(S可能是一個雜湊),以及個別使用者持有的可以證明存在狀態物件的輔助資訊(“證人”)(例如 S是Merkle根,證人是分支,儘管其他結構如RSA累加器確實存在)。 存在廣播一些資料的更新協議,並且該資料改變S以改變狀態的內容,並且還可能改變證人。
假設某個使用者在該狀態下有一組N個物件的證人,並且更新了這些物件中的M個。 接收到更新資訊後,使用者可以檢查所有N個物件的新狀態,從而檢視哪個M被更新。 因此,更新資訊本身至少編碼~M * log(N)個位元的資訊。 因此,為了實現M個交易的效果,每個人需要接收的更新資訊必須是O(M)。14