目前,在全部的區塊鏈協議中每一個節點存儲全部的狀態(帳戶餘額,合約代碼和存儲等等)而且處理全部的交易。這提供了大量的安全性,但極大的限制了可擴展性:區塊鏈不能處理比一個單節點更多的交易。很大程度上由於這個緣由,比特幣被限制在每秒3-7筆交易,以太坊每秒7-15筆交易,等等。而後,這提出了一個問題:是否有方法建立一個新的機制,只讓一個小集合的節點來驗證每筆交易?只要有足夠多的節點驗證每筆交易那麼系統依然是高度安全的,但又足夠少使得系統系統能夠並行處理不少的交易,咱們是否可使用這種技術來大大增長區塊鏈的吞吐量?git
」簡單的解決方案「主要由三大類。第一個是直接放棄獨立區塊鏈縮放性,而是假設用戶將使用許多不一樣的」altcoins"。這種方法極大提高了吞吐量,可是是以安全性爲代價:使用這種方案在在吞吐量上N-factor的增長必然伴隨在安全性上N-factor的降低。所以,對於大於N小值能夠被論證是不可行的。github
第二個是簡單增長區塊大小限制。這種方式能夠起做用,並且在某些狀況下多是正確的處理方法,由於區塊鏈大小可能更多受到政治上的約束而不是現實的技術考量。但無論我的對於個別案例的信念如何,這個方案不可避免有它的侷限性:若是區塊鏈運行的足夠長,那麼運行在消費者硬件上的節點就會退出,網絡將開始只能依賴於少數運行區塊鏈的超級計算機,者可能致使極大的中心化風險。web
第三個是「合併挖礦」,這是一種多區塊鏈共存的技術,但全部的區塊鏈共享同一的挖礦激勵(或者權益證實系統中的賭注)。目前,Namecoin經過這樣的技術從比特幣區塊鏈中獲取了很大一部分的安全性。若是全部的礦工參與進來,理論上能夠將吞吐量提高N倍而不會影響安全性。然而,這也存在這樣的問題:它將每一個礦工的計算和存儲負載增長了N倍。因此,實際上這個方法僅僅是一個隱藏的區塊大小限制提高方式。算法
即便這被認爲能夠接受的,依然存在這樣的缺陷:這些區塊鏈不是真正被「捆綁在一塊兒"的;只須要少許的經濟激勵就能說服礦工放棄或妥協某個特定的區塊鏈。這種可能性是很是真實的,而且有合併挖礦被攻擊的[真實歷史事件](actual historical incidents),以及明確提倡使用合併挖礦攻擊做爲一種「治理特性」的開發者,對於給定的聯盟,破壞區塊鏈並非有利可圖的。數據庫
若是每條鏈只有少數礦工參與合併挖礦,則集中化風險獲得緩解,但合併挖礦的安全效益也大大下降。安全
這三難困境代表區塊鏈系統最多隻能擁有如下三個屬性中的兩個:網絡
去中心化(定義爲系統能夠在每一個參與者只能訪問O(c)資源的場景下運行,即普通筆記本電腦或小型VPS)架構
擴展性(定義爲能夠處理O(n) > O(c)交易)oracle
安全性(定義爲最多使用O(n)資源就能夠抵禦安全攻擊)app
在這個文檔的其他部分,咱們繼續使用c來指代每一個節點的可用計算資源大小(包括計算,帶寬和存儲),以及用n指代抽象意義上生態系統的大小;咱們假設交易負載,狀態大小和加密貨幣市值都與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有 O(N)用戶,那麼就須要 O(N)的交易,因此須要 O(N/C)的時間來處理全部的提現。若是提現延遲固定在某個D上(即天真的實現),那麼只要N>C*D,區塊鏈中就沒有足夠空間來及時處理全部的提現,這樣系統將變得不安全。在這種模式下,Plasma應該被視爲只經過一個(可能很大)常數因子來提高擴展性。若是提現延遲是靈活的,那麼若是有不少的提現發生他們會自動延長,這意味着當N增加的愈來愈大,攻擊者迫使全部人的資金被鎖定的時間愈來愈長,系統的「安全性「級別在必定意義上進一步下降。由於擴展的拒絕訪問能夠被認爲是安全上的失敗,儘管比失去全部訪問要折衷些。然而,這是與其餘方案不一樣的折衷方案,能夠說是一個更溫和的折衷,因此Plasma子鏈爲何依然是現狀的巨大改進。
把狀態分紅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對其簽名。
一個區塊必須包括每一個分片的排序頭,在如下狀況下區塊是有效的:
須要注意的是,在這樣的系統中如今存在幾個」層次「的節點:
而後,交易的結果取決於以前發生在其餘分片中的事件;一個典型的例子是貨幣轉帳,貨幣能夠從分片i轉移到分片j,首先在分片i中建立一個」借記「交易來銷燬代幣,而後在分片j中建立一個」貸記「交易來建立代幣,並將借記交易的收據做爲貸記證實是合法的。
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發送包含某些響應的「回調」。總的來講這個模式是很簡單的,而且不難將其整合入高級程序語言中。
須要注意的是,與可用於分片內通訊的機制相比,用於異步跨分片通訊的協議內置機制可能會有所不一樣而且功能較弱。在不可擴展的區塊鏈中的當前可用的一些功能在可擴展區塊鏈中只能用於分區內通訊。
下面的例子是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%(這裏請看細節 )。
所以,至少在誠實/不協調的大多數狀況下,咱們有:
在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))大小。
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%,則攻擊者可以在一輪中得到大多數的機率是:
下面是一個表格,說明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的參與者誠實地參與,值就保證相同。 這種方法顯然不是經濟上能夠利用的,而且徹底抵抗各類形式的權益磨損,可是它有幾個弱點:
有人可能會認爲肯定性門限簽名方法在一致性較好的狀況下工做得更好,其餘方法在可用性較好的狀況下工做得更好。
在賄賂攻擊者或協調選擇模型中,驗證者是隨機抽樣的事實並不重要:無論樣本是什麼,攻擊者均可以賄賂絕大多數樣本作攻擊者喜歡的事情,或者攻擊者直接控制大多數的樣本,而且能夠指揮樣本以低成本(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)。
有一個微不足道的攻擊,攻擊者老是能夠焚燒O(c)資金來暫時下降分片的質量:經過發送高交易費用的交易來製造垃圾,迫使正經常使用戶沒法進入。這種攻擊是不可避免的;你能夠用靈活的gas限制進行補償,甚至能夠嘗試根據使用狀況嘗試自動從新分配節點到分片的「透明分片」方案,可是若是某個特定的應用程序是不可並行的,Amdahl法則保證你無能爲力。在這裏打開的攻擊(提醒:它只適用於Zamfir模式,而不是誠實/不協調的大多數)能夠說沒有比垃圾交易攻擊嚴重得多。所以,咱們已經達到了單個分片安全性的已知限制,而且試圖走得更遠是沒有價值的。
有點。首先,值得注意的是,工做量證實和簡單的權益證實,即便沒有分片,在賄賂攻擊者模型中都具備很是低的安全性;一個區塊在通過O(n) 時間後纔在經濟意義上真正地「肯定」(好像只有幾個區塊已通過去了,那麼替換區塊的經濟成本就是從區塊有問題以前開始雙花的成本)。Casper經過增長最終機制解決了這個問題,經濟安全邊際當即增長到最大。在一個分片鏈中,若是咱們想要經濟最終性的話,那麼咱們須要提出一個演繹鏈,爲何一個驗證人願意在一個徹底基於隨機樣本的鏈上作出一個很是強有力的聲明,當驗證人自己相信賄賂攻擊者和協調選擇模型多是真實的,因此隨機樣本可能被破壞。
基本上,咱們並不直接向開發者提供「分片」的概念,也不會永久性地將狀態對象分配給特定的分片。 相反,該協議有一個正在進行的內置負載均衡過程,能夠在分片之間移動對象。 若是分片變得太大或者消耗太多的gas,能夠分紅兩半。 若是兩個分片變得過小,而且常常彼此交互,他們能夠合併在一塊兒; 若是全部分片過小,則能夠刪除一個分片並將其內容移動到各類其餘分片等等。
想象一下,唐納德·特朗普是否意識到人們在紐約和倫敦之間的旅行不少,可是有一個海洋的路,因此他能夠拿出剪刀,剪掉海洋,把美國東海岸和西歐粘在一塊兒, 大西洋旁邊的南極 - 這就是這樣的。
能夠經過引入「順序域」的概念來緩解共置問題,其中合約能夠指定它們存在於相同的順序域中,在這種狀況下,它們之間的同步通訊將始終是可能的。 在這個模型中,一個分片能夠被看做是一組被一塊兒驗證的順序域,而且若是協議肯定這樣作是有效的,那麼順序域能夠在分片之間從新平衡。
若是您將歷史交易記錄視爲已經結算,而且只是試圖計算狀態轉換函數,則該過程變得更容易。有幾種方法;一個至關簡單的方法能夠描述以下:
若是分片X上的客戶端看到帶有分片(X,Y)的交易,則請求分片Y中的Merkle證實,以驗證(i)分片Y上存在該交易,以及(ii)分片上的前置狀態Y表示交易須要訪問的那些數據位。而後執行交易並提交執行結果。請注意,若是不少交易有許多不一樣的「塊對」,那麼這個過程多是很是低效的;因爲這個緣由,只須要簡單的要求塊來指定姐妹分片就多是最佳的,而後能夠在每塊級別更有效地進行計算。這是該方案如何運做的基礎;人們能夠想象更復雜的設計。可是,在進行新的設計時,確保低成本的拒絕服務攻擊不能任意拖慢狀態計算老是很是重要的。
Vlad Zamfir建立了一個方案,異步消息仍然能夠解決「預訂火車和旅館」的問題。這工做以下。狀態記錄了最近所作的全部操做,以及任何給定操做(包括跨分片操做)觸發哪些操做的圖譜。若是操做被還原,則建立收據,而後可使用該收據來回滾該操做對其餘分片的任何影響;這些回滾可能會觸發他們本身的回滾之類。這個論點是,若是一個偏好系統使得回滾消息能夠像其餘類型的消息同樣快地傳播兩次,那麼一個在K個回合中完成執行的複雜跨分片交易能夠在另外的K個回合中徹底回滾。
這個方案引入的開銷能夠說是沒有獲得充分的研究;可能存在觸發二次執行漏洞的最壞狀況。很顯然,若是交易具備更加孤立的影響,這種機制的開銷較低;也許能夠經過有利的gas成本規則激勵孤立執行。總而言之,這是高級分片更有前途的研究方向之一。
分片中的挑戰之一是,在進行調用時,默認狀況下沒有硬協議提供,保證由該調用建立的任何異步操做都將在特定的時間範圍內完成,甚至徹底沒有;而是由某方在目的地分片中發送觸發收據的交易。這對於許多應用程序來講是能夠的,可是在某些狀況下,因爲如下幾個緣由可能會有問題:
人們能夠試着想出一個系統,在某些分片中生成的異步消息在必定數量的塊以後自動觸發目標分片中的結果。然而,這要求每一個分片上的每一個客戶端在計算狀態轉換函數的過程當中主動檢查全部其餘分片,這多是低效率的來源。最爲人所知的折衷方法是:當高度爲height_a的分片A的收據包含在高度爲height_b的碎片B中時,若是塊高度的差別超過MAX_HEIGHT,則碎片B中的全部驗證人都從height_a + MAX_HEIGHT + 1建立塊到height_b - 1是受到懲罰的,這個懲罰成倍增長。這些處罰的一部分給予最終包括該塊做爲獎勵的確認者。這使狀態轉換功能保持簡單,同時仍強烈激勵正確的行爲。
正確;這是個問題。這是一個建議的解決方案。爲了從分片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價格市場的變化隔離,除非驗證者自願地從收據不包含懲罰中失去大量的資金。
確實; 您能夠購買分片A中的凍結分片A gas,並從分片A向其自身發送保證的跨鏈分片調用。 雖然注意到這個方案只支持在很短的時間間隔內進行調度,而且調度對於這個塊是不許確的; 只能保證在一段時間內發生。
是。 若是用戶未能得到交易,由於共謀驗證者正在過濾交易而且不接受任何包含該交易的塊,則用戶能夠發送一系列消息來觸發一系列有保證的預約消息,最後一個消息在EVM內部重建交易並執行它。 若是不完全關閉有保證的調度功能,並嚴重限制整個協議,防止這種規避技術其實是不可能的,所以惡意的驗證者將沒法輕易作到。
本文檔中描述的方案不會改進非分片區塊鏈; 實際上,每一個分區最終都會在分區兩側有一些節點。 有人(例如來自IPFS的Juan Benet)創建了可擴展的網絡,其具體目標是網絡能夠根據須要切分紅分片,從而在網絡劃分的條件下儘量地繼續運行,可是存在不尋常的加密經濟挑戰來作好這項工做。
一個主要的挑戰是,若是咱們想要基於位置的分片,那麼地理網絡劃分最低限度地阻礙了分片內聚合(具備很是低的分片內延遲和所以很是快的分片內塊時間的反作用),那麼 咱們須要有一種方法讓驗證者選擇他們正在參與的分片。這是很危險的,由於它容許在誠實/不協調的多數模型中有更多類別的攻擊,和Zamfir模型中更高做惡因子更低成本的攻擊。 地理切分分片的安全性和經過隨機抽樣來分片效率是兩個徹底不一樣的事情。
其次,如何組織應用程序須要更多的思考。 上面描述的分片區塊鏈中的一個可能的模型是每一個「app」在某個分片上(至少對於小規模的應用程序)。 可是,若是咱們但願應用程序自己具備分區防禦功能,則意味着全部應用程序都須要在某種程度上進行跨分片。
解決這個問題的一個可能途徑是建立一個提供兩種分片的平臺 - 一些分片是隨機抽樣的高安全性「全局」分片,而其餘碎片則是較低安全「本地」分片,可能具備屬性的如超快的塊時間和更便宜的交易費用。 很是低的安全性碎片甚至能夠用於數據發佈和消息傳遞。
有幾個考慮因素。首先,須要將算法從雙層算法轉換爲可堆疊的n層算法;這是可能的,可是很複雜。其次,n / c(即網絡的總計算負荷與一個節點的容量之間的比率)剛好是接近兩個常數的值:首先,若是以塊爲單位測量,則幾個小時的時間跨度,這是一個能夠接受的「最大安全確認時間」,其次是獎勵和存款之間的比率(早期計算代表Casper的存款大小爲32ETH,塊獎勵爲0.05ETH)。後者的後果是,若是一個分片上的獎勵和懲罰升級到驗證者存款的規模,持續攻擊分片的成本將是O(n)大小。
高於c^2可能會致使進一步削弱系統所能提供的安全保障類別,並容許攻擊者以中等成本長時間週期以某種方式攻擊某個碎片,儘管仍有可能防止無效狀態被最終肯定,並防止最終狀態被回滾,除非攻擊者願意支付O(n)的成本。然而,回報是巨大的 - 一個超級分割的區塊鏈能夠用做幾乎全部去中心化應用程序的通用工具,而且能夠承擔交易費用,使其幾乎免費。
原文:https://github.com/toxotguo/thinking/edit/master/Sharding FAQ.md
安利一個以太坊教程,對入門學習頗有幫助。