簡介
目前宇色,在所有的區(qū)塊鏈協(xié)議中每個節(jié)點存儲所有的狀態(tài)(賬戶余額,合約代碼和存儲等等)并且處理所有的交易。這提供了大量的安全性宣蠕,但極大的限制了可擴展性:區(qū)塊鏈不能處理比一個單節(jié)點更多的交易例隆。很大程度上因為這個原因,比特幣被限制在每秒3-7筆交易植影,以太坊每秒7-15筆交易裳擎,等等。然后思币,這提出了一個問題:是否有方法創(chuàng)建一個新的機制鹿响,只讓一個小集合的節(jié)點來驗證每筆交易?只要有足夠多的節(jié)點驗證每筆交易那么系統(tǒng)依然是高度安全的谷饿,但又足夠少使得系統(tǒng)系統(tǒng)可以并行處理很多的交易惶我,我們是否可以使用這種技術(shù)來大大增加區(qū)塊鏈的吞吐量?
有哪些簡單但有缺陷的方式來解決這個問題博投?
”簡單的解決方案“主要由三大類绸贡。第一個是直接放棄獨立區(qū)塊鏈縮放性,而是假設(shè)用戶將使用許多不同的”altcoins"毅哗。這種方法極大提升了吞吐量听怕,但是是以安全性為代價:使用這種方案在在吞吐量上N-factor的增加必然伴隨在安全性上N-factor的下降。因此虑绵,對于大于N小值可以被論證是不可行的尿瞭。
第二個是簡單增加區(qū)塊大小限制。這種方式可以起作用翅睛,而且在某些情況下可能是正確的處理方法声搁,因為區(qū)塊鏈大小可能更多受到政治上的約束而不是現(xiàn)實的技術(shù)考量。但不管個人對于個別案例的信念如何捕发,這個方案不可避免有它的局限性:如果區(qū)塊鏈運行的足夠長疏旨,那么運行在消費者硬件上的節(jié)點就會退出,網(wǎng)絡(luò)將開始只能依賴于少數(shù)運行區(qū)塊鏈的超級計算機扎酷,者可能導(dǎo)致極大的中心化風險檐涝。
第三個是“合并挖礦”蝶俱,這是一種多區(qū)塊鏈共存的技術(shù)走芋,但所有的區(qū)塊鏈共享同一的挖礦激勵(或者權(quán)益證明系統(tǒng)中的賭注)。目前惠桃,Namecoin通過這樣的技術(shù)從比特幣區(qū)塊鏈中獲取了很大一部分的安全性坷剧。如果所有的礦工參與進來惰爬,理論上可以將吞吐量提升N倍而不會影響安全性。然而惫企,這也存在這樣的問題:它將每個礦工的計算和存儲負載增加了N倍撕瞧。所以陵叽,實際上這個方法僅僅是一個隱藏的區(qū)塊大小限制提升方式。
即使這被認為可以接受的丛版,依然存在這樣的缺陷:這些區(qū)塊鏈不是真正被“捆綁在一起"的巩掺;只需要少量的經(jīng)濟激勵就能說服礦工放棄或妥協(xié)某個特定的區(qū)塊鏈。這種可能性是非常真實的页畦,并且有合并挖礦被攻擊的[真實歷史事件](actual historical incidents)胖替,以及明確提倡使用合并挖礦攻擊作為一種“治理特性”的開發(fā)者,對于給定的聯(lián)盟豫缨,破壞區(qū)塊鏈并不是有利可圖的独令。
如果每條鏈只有少數(shù)礦工參與合并挖礦,則集中化風險得到緩解好芭,但合并挖礦的安全效益也大大降低燃箭。
這聽起來像是有某種擴展性三難困境在起作用。這三難困境是什么呢舍败,我們能突破它嗎招狸?
這三難困境表明區(qū)塊鏈系統(tǒng)最多只能擁有以下三個屬性中的兩個:
- 去中心化(定義為系統(tǒng)可以在每個參與者只能訪問O(c)資源的場景下運行,即普通筆記本電腦或小型VPS)
- 擴展性(定義為可以處理O(n) > O(c)交易)
- 安全性(定義為最多使用O(n)資源就可以抵御安全攻擊)
在這個文檔的其余部分邻薯,我們繼續(xù)使用c來指代每個節(jié)點的可用計算資源大腥瓜贰(包括計算,帶寬和存儲)厕诡,以及用n指代抽象意義上生態(tài)系統(tǒng)的大欣郯瘛;我們假設(shè)交易負載木人,狀態(tài)大小和加密貨幣市值都與n成正比。
有人認為冀偶,由于梅特卡夫定律醒第,一個加密貨幣的市值應(yīng)該與n ^ 2成正比,而不是n进鸠。 他們是正確的嗎稠曼?
不。
為什么不客年?
梅特卡夫法則認為霞幅,網(wǎng)絡(luò)的價值與用戶數(shù)量的平方成正比(n ^ 2),因為如果網(wǎng)絡(luò)有n個用戶量瓜,那么網(wǎng)絡(luò)對每個用戶都有價值司恳,但是每個用戶的價值是與用戶數(shù)量成正比,因為如果一個網(wǎng)絡(luò)有n個用戶通過網(wǎng)絡(luò)有n-1個潛在的連接绍傲,每個用戶都可以從中受益扔傅。
在實踐中耍共,實證研究表明,擁有n個用戶的網(wǎng)絡(luò)的價值”對于小的n值是與n ^ 2成比例且對于大的n值是與n×log n成比例“猎塞。這很容易理解试读,因為對于小的n值,這個論點是成立的荠耽,但是一旦這個系統(tǒng)變得很大钩骇,兩個影響就會減緩增長。首先铝量,實踐中的增長通常發(fā)生在社區(qū)中倘屹,因此在中等規(guī)模的網(wǎng)絡(luò)中,網(wǎng)絡(luò)通常已經(jīng)提供了每個用戶關(guān)心的大部分連接款违。其次唐瀑,連接往往是可以互相替代的。你可以爭論說人們從k個連接中只能獲得~O(log(k))的價值-有23個品牌的除臭劑可以選擇是好的插爹,但并不不是說比有22個選擇好多了哄辣,而一個選擇和零個選擇是非常重要的差異。
另外赠尾,即使加密貨幣的價值與k個用戶的O(k * log(k))成正比力穗,如果我們接受上述解釋作為這種情況的原因,那這也意味著交易量也是O(k * log(k))气嫁,因為每個用戶的log(k)價值理論上來自于用戶通過網(wǎng)絡(luò)執(zhí)行l(wèi)og(k)的連接当窗,并且狀態(tài)大小在許多情況下也應(yīng)該隨著O(k * log(k)) 一起增長,因為至少有某種類型的狀態(tài)是特定關(guān)心而不是用戶特定的寸宵。因此崖面,假設(shè)n=O(k * log(k)) ,并且基于n(生態(tài)系統(tǒng)大小)和c(單節(jié)點的計算能力)是我們使用的完美模型梯影。
有哪些適度簡單但只部分解決了可擴展性問題的方法巫员?
許多分片建議(比如國大的Loi Luu等人提出的這個早期的BFT分片方案,以及為比特幣提議的this Merklix tree方案)都試圖只分片交易或者只分片狀態(tài)甲棍,而不考慮其他方面简识。這些努力是令人欽佩的,可能會帶來效率上的提升感猛,但他們遇到根本性的問題七扰,他們只能解決其中一個瓶頸。我們希望能夠每秒處理超過10000個交易陪白,而即不必強迫每個節(jié)點成為超級計算機也不強迫每個節(jié)點存儲一兆字節(jié)的狀態(tài)數(shù)據(jù)颈走,而這需要一個全面的解決方案即狀態(tài)存儲工作量,交易處理甚至交易下載和廣播都跨節(jié)點分散咱士。
特別要注意的是疫鹊,這要求在P2P級別做出變更袖瞻,因為廣播模型是不可擴展的,因為它要求每個節(jié)點下載和重復(fù)廣播O(n) 的數(shù)據(jù)(每個被發(fā)送的交易)拆吆,而我們?nèi)ブ行幕臉藴始僭O(shè)是每個節(jié)點只能訪問各種O(c)資源聋迎。
有哪些不試圖“分片”任何東西的方法?
Bitcoin-NG 可以通過另外一種區(qū)塊鏈設(shè)計來增加擴展性枣耀,即如果節(jié)點花費大量CPU時間驗證區(qū)塊來使得網(wǎng)絡(luò)更安全霉晕。在簡單的PoW區(qū)塊鏈中,存在較高的中心化風險捞奕,并且如果閥值增長到節(jié)點的CPU時間超過5%用于驗證塊則共識安全就會被削弱牺堰;Bitcoin-NG的設(shè)計緩解了這個問題。然而颅围,這僅僅使得交易擴展性提升了大約常量因子5-50x3,4伟葫,但并沒有提升狀態(tài)擴展性。也就是說院促,Bitcoin-NG式的方法與分片并不互相排斥筏养,兩者當然可以同時實施。
基于通道的策略(閃電網(wǎng)絡(luò)常拓,雷電網(wǎng)絡(luò)等)可以通過常量因子擴展交易容量渐溶,但不能擴展狀態(tài)存儲,并且還會帶來他們自己獨特的折衷和限制弄抬,特別是涉及到拒絕服務(wù)攻擊茎辐;通過分片實現(xiàn)鏈上擴展(加上其他的技術(shù))和通過通道實現(xiàn)鏈下擴展可以說是必要和互補的。
還有其他一些使用高級密碼學的方法掂恕。如Mimblewimble 和基于ZK-SNARKs的策略來解決擴展性問題的特定部分拖陆。初始化全節(jié)點同步,而不是從創(chuàng)世塊驗證整個歷史懊亡,節(jié)點可以驗證一個密碼學證明當前狀態(tài)合法地遵循歷史記錄依啰。這些方法確實解決了合法性問題,但是值得注意的是斋配,可以依靠加密經(jīng)濟學用更簡單的方式而不是純粹密碼學來解決同樣的問題-參見以太坊當前快速同步和神同步的實現(xiàn)孔飒。這兩種方法都沒有緩解狀態(tài)大小的增長或者在線交易處理的限制灌闺。
Plasma 如何適應(yīng)三難困境艰争?
在Plasma子鏈發(fā)生較大攻擊的時候,Plasma子鏈的所有用戶需要提現(xiàn)回根鏈桂对。如果Plasma有 O(N)用戶甩卓,那么就需要 O(N)的交易,所以需要 O(N/C)的時間來處理所有的提現(xiàn)蕉斜。如果提現(xiàn)延遲固定在某個D上(即天真的實現(xiàn))逾柿,那么只要N>C*D缀棍,區(qū)塊鏈中就沒有足夠空間來及時處理所有的提現(xiàn),這樣系統(tǒng)將變得不安全机错。在這種模式下爬范,Plasma應(yīng)該被視為只通過一個(可能很大)常數(shù)因子來提升擴展性。如果提現(xiàn)延遲是靈活的弱匪,那么如果有很多的提現(xiàn)發(fā)生他們會自動延長青瀑,這意味著當N增長的越來越大,攻擊者迫使所有人的資金被鎖定的時間越來越長萧诫,系統(tǒng)的“安全性“級別在一定意義上進一步降低斥难。因為擴展的拒絕訪問可以被認為是安全上的失敗,盡管比失去所有訪問要折衷些帘饶。然而哑诊,這是與其他方案不同的折衷方案,可以說是一個更溫和的折衷及刻,所以Plasma子鏈為什么依然是現(xiàn)狀的巨大改進镀裤。
狀態(tài)大小,歷史提茁,加密經(jīng)濟學淹禾,哦,我的天茴扁!在我們繼續(xù)之前铃岔,先定義一些這樣的術(shù)語!
- 狀態(tài) 代表系統(tǒng)”當前狀態(tài)“的一個信息集合峭火;確定交易是否有效毁习,以及交易的結(jié)果,在最簡單的模型中應(yīng)該僅僅依賴狀態(tài)卖丸。例如比特幣中UTXO的狀態(tài)數(shù)據(jù)纺且,以太坊中的balances+nonces+code+storage,Namecoin中的域名注冊項稍浆。
- 歷史:自從創(chuàng)世塊以來的所有交易的有序列表载碌。在一個簡單模型中,當前狀態(tài)應(yīng)該是創(chuàng)世狀態(tài)和歷史的確定性函數(shù)衅枫。
- 交易:進入歷史的一個對象嫁艇。在實踐中,一筆交易代表了某用戶想要做的操作弦撩,并且是加密簽名的步咪。
- 狀態(tài)轉(zhuǎn)換函數(shù):一個獲取狀態(tài),應(yīng)用交易并輸出新狀態(tài)的函數(shù)益楼。涉及的計算可能包含對交易指定的賬戶中增加或減少余額猾漫,驗證數(shù)字簽名和運行合約代碼点晴。
- 默克爾樹:可以存儲大量數(shù)據(jù)的加密哈希樹結(jié)構(gòu),其中驗證每個單項數(shù)據(jù)項只需要O(log(n)) 的空間和時間悯周。詳情看這里粒督。在以太坊中,每個塊的交易集合已經(jīng)狀態(tài)都保存在默克爾樹中禽翼,樹的根被提交在塊中坠陈。
- 收據(jù):代表交易執(zhí)行結(jié)果的對象,它并不存儲在狀態(tài)中捐康,但仍存儲在一個默克爾樹中并提交到塊仇矾,以便節(jié)點在沒有擁有所有數(shù)據(jù)的情況下可以高效驗證證明。在以太坊開發(fā)中Logs就是收據(jù)解总。在分片模型中贮匕,收據(jù)是用來促進異步跨分片通信。
- 輕客戶端:與區(qū)塊鏈交互的一種方式花枫,它只需要非常少量的計算資源刻盐,默認情況下只需要跟蹤鏈的區(qū)塊頭,并根據(jù)需要請求關(guān)于交易劳翰,狀態(tài)和收據(jù)的相關(guān)信息敦锌,并驗證相關(guān)數(shù)據(jù)的默克爾證明。
- 狀態(tài)根:代表狀態(tài)的默克爾樹根哈希佳簸。
分片背后的基本思想乙墙?
把狀態(tài)分成K = O(n / c) 分區(qū),我們稱之為”分片“生均。例如听想,以太坊的分片方案可能會將所有0x00開頭的所有地址放入一個分片,所有以0x01開頭的地方hi放入另外一個分片等等马胧。在最簡單的分片形式中汉买,每個分片都有自己的交易歷史,且在某個分片k中的交易影響僅限于分片k的狀態(tài)佩脊。一個簡單的例子是多資產(chǎn)區(qū)塊鏈蛙粘,其中有k個分片,每個分片存儲余額和處理一個特定資產(chǎn)相關(guān)的交易威彰。在更高級的分片形式中出牧,包括了某些形式的跨分片通信能力,其中一個分片上的交易可以出發(fā)其他分片上的事件抱冷。
分片區(qū)塊鏈的基本設(shè)計是怎么樣的崔列?
一個簡單的方法如下梢褐。存在一些稱為協(xié)調(diào)者的節(jié)點旺遮,其接受在分片k上的交易(取決于協(xié)議,協(xié)調(diào)者可以選擇哪個k分片或者隨機分配k)并創(chuàng)建排序規(guī)則。一個排序規(guī)則有一個排序頭油够,一個形式為”這是在分片k上的交易排序“的短消息须眷。它期望分片k的前狀態(tài)根是0x12bc57,在當前排序的交易默克爾樹根是0x3f98ea鸣剪,并且交易被處理之后的狀態(tài)根應(yīng)當是0x5d0cc1组底。且協(xié)調(diào)者#1,2筐骇,4债鸡,5,8铛纬,11厌均,13...98,99對其簽名告唆。
一個區(qū)塊必須包括每個分片的排序頭棺弊,在以下情況下區(qū)塊是有效的:
- 在每個排序規(guī)則中給出的前狀態(tài)根必須與相關(guān)聯(lián)的分片當前的狀態(tài)根相匹配
- 在排序規(guī)則中所有的交易是有效的
- 在排序規(guī)則中給出的后狀態(tài)根必須與上面給定的狀態(tài)執(zhí)行排序規(guī)則中的交易結(jié)果想匹配
- 排序規(guī)則必須被該分片的至少三分之二已注冊的協(xié)調(diào)者所簽名
需要注意的是,在這樣的系統(tǒng)中現(xiàn)在存在幾個”層次“的節(jié)點:
- 超級全節(jié)點- 處理在所有排序規(guī)則中的所有交易擒悬,并且維護所有分片的全狀態(tài)
- 頂級節(jié)點- 處理所有頂級(top-level)區(qū)塊模她,但不處理或試圖下載在每個排序規(guī)則的交易。相反懂牧,如果在某個分片中有三分之二協(xié)調(diào)者認為一個排序規(guī)則是有效的侈净,那么這個排序規(guī)則就是有效的。
- 單分片節(jié)點- 充當頂級節(jié)點僧凤,但同時也處理某個分片的所有交易和維護全狀態(tài)用狱。
- 輕節(jié)點- 僅下載和驗證頂級區(qū)塊的區(qū)塊頭;不處理任何排序頭或交易拼弃,除非它需要讀取某個特定分片的狀態(tài)的某些特定信息夏伊,在這種情況下,它下載該分片最近的排序頭的默克爾分支并且下載在該狀態(tài)下的默克爾證明期望值吻氧。
這里面臨的挑戰(zhàn)是什么溺忧?
- 跨分片通信- 上述設(shè)計不支持跨分片通信。我們?nèi)绾伟踩卦黾涌绶制ㄐ拧?/li>
- 單分片接管攻擊- 如果在一個分片中攻擊者接管了大多數(shù)協(xié)調(diào)者盯孙,要么獲取足夠的簽名來阻止任何排序規(guī)則鲁森,要么更糟糕的,提交無效的排序振惰?
- 欺詐檢測- 如果得到一個無效的排序規(guī)則歌溉,節(jié)點(包括輕節(jié)點)如何能夠可靠的得知,以便它們可以驗證欺詐行為并且確認是欺詐行為之后拒絕這個排序規(guī)則?
- 數(shù)據(jù)可用性問題- 作為欺詐檢測的子集痛垛,排序規(guī)則中缺失數(shù)據(jù)這種特殊情況會怎么樣草慧?
- 超二次分片- 在n > c^2的特殊情況下,在上面給出的簡單設(shè)計里面匙头,將會有超過O(c)的排序頭漫谷,因此普通節(jié)點將不能處理它們,只能處理頂級區(qū)塊蹂析。因此舔示,在交易和頂級區(qū)塊頭直接超過兩級的間接尋址是需要的(即我們需要”分片的分片“)。達到這個目標的最簡單和最好的方式是什么呢电抚?
然后惕稻,交易的結(jié)果取決于之前發(fā)生在其他分片中的事件;一個典型的例子是貨幣轉(zhuǎn)賬蝙叛,貨幣可以從分片i轉(zhuǎn)移到分片j缩宜,首先在分片i中創(chuàng)建一個”借記“交易來銷毀代幣,然后在分片j中創(chuàng)建一個”貸記“交易來創(chuàng)建代幣甥温,并將借記交易的收據(jù)作為貸記證明是合法的锻煌。
但是CAP定理意味著完全安全的分布式系統(tǒng)是不可能的,因此分片是無法實現(xiàn)的姻蚓?
CAP定理是于分布式共識有關(guān)的結(jié)果宋梧。一個簡單的描述是:”在網(wǎng)絡(luò)發(fā)生分區(qū)的情況下,你必須選擇一致性或可用性狰挡,你不能同時擁有兩者“捂龄。直觀的論點很簡單:如果網(wǎng)絡(luò)分為兩半,在一半網(wǎng)絡(luò)中發(fā)送交易”發(fā)送10個代幣給A"加叁,而在另一半發(fā)送交易”發(fā)送10個代幣給B“倦沧,然后系統(tǒng)是不可用的,因為其中一個或者兩個交易將不被處理它匕,或者變得不一致展融,因為一半的網(wǎng)絡(luò)將看到第一個交易完成,另一半將看到第二個交易完成豫柬。注意CAP定理與擴展性無關(guān)告希;它適用于多節(jié)點需要對某個值導(dǎo)致一致的任何情況,而不管它們所達成一致的數(shù)據(jù)量大小烧给。所有現(xiàn)有的去中心化系統(tǒng)已在可用性和一致性之間找到一些折衷方法燕偶,在這方面分片并沒有從根本上造成困難。
我們?nèi)绾未龠M跨分片通信础嫡?
最容易滿足的一個場景是指么,有許多的應(yīng)用程序沒有太多獨立用戶,而且這些應(yīng)用程序只是偶爾或者很少與彼此交互;在這種情況下伯诬,應(yīng)用程序可以在單獨的分片上生存晚唇,并通過使用收據(jù)來與其他分片進行通信。
這通常涉及將每筆交易分解為”借記“和”貸記“姑廉。例如,假設(shè)我們有一個交易翁涤,其中賬戶A在分片M上桥言,期望發(fā)送100個代幣到分片N上的賬戶B。這些步驟如下所示:
在分片M上發(fā)送一個交易(i)扣除賬戶A的100個代幣(ii) 創(chuàng)建一個收據(jù)葵礼。收據(jù)對象并不直接保存在狀態(tài)中号阿,但收據(jù)的生成能通過默克爾證明來驗證。
等待第一個交易被包含進來(有時候需要等待終止化鸳粉,這取決于系統(tǒng))
在分片N上發(fā)送一個交易扔涧,包含來自(1)收據(jù)的默克爾證明。這個交易也檢查分片N上的狀態(tài)以確保收據(jù)是”未花費“届谈;如果是的話枯夜,那么它將賬戶B增加100個代幣,并且保存在狀態(tài)中代表收據(jù)已花費艰山。
-
可選地湖雹,(3)中的交易也保存收據(jù),然后可以在分片M中用來執(zhí)行進一步的操作曙搬,這取決與原操作是否成功摔吏。
在更復(fù)雜的分片形式中,交易在某些場景下可能具有分散在不同分片上的效果纵装,并且可以從多個分片狀態(tài)中同時請求數(shù)據(jù)征讲。
不同類型的應(yīng)用程序如何與分片區(qū)塊鏈融合?
有些應(yīng)用程序完全不需要跨分片交互橡娄;多資產(chǎn)區(qū)塊鏈和不需要互操作性的完全異構(gòu)應(yīng)用程序的區(qū)塊鏈是最簡單的案例诗箍。如果應(yīng)用程序不需要彼此交互,如果可以異步交互挽唉,面臨的挑戰(zhàn)會更容易應(yīng)對扳还。也就是說,如果交互可以以分片A上的應(yīng)用程序的形式完成橱夭,則生成收據(jù)氨距,在分片B上的交易“消費”該收據(jù)并基于它執(zhí)行一些操作,并且可能向分片A發(fā)送包含某些響應(yīng)的“回調(diào)”棘劣∏稳茫總的來說這個模式是很簡單的,并且不難將其整合入高級程序語言中。
需要注意的是首昔,與可用于分片內(nèi)通信的機制相比寡喝,用于異步跨分片通信的協(xié)議內(nèi)置機制可能會有所不同并且功能較弱。在不可擴展的區(qū)塊鏈中的當前可用的一些功能在可擴展區(qū)塊鏈中只能用于分區(qū)內(nèi)通信勒奇。
什么是火車旅館問題预鬓?
下面的例子是Andrew Miller提供的。 假設(shè)用戶想要購買一張火車票并預(yù)訂一家旅館赊颠,并且想要確保這個操作是原子的 - 無論是保留成功還是兩者都不成立格二。 如果火車票和酒店預(yù)訂應(yīng)用程序在同一個分片上,這很容易:創(chuàng)建一個交易竣蹦,試圖進行兩個預(yù)訂顶猜,除非兩個預(yù)訂都成功,否則引發(fā)異常痘括,并且回滾所有长窄。 但是,如果兩者在不同的分片上纲菌,這并不是那么容易; 即使沒有加密經(jīng)濟/去中心化的問題挠日,這實質(zhì)上也是數(shù)據(jù)庫原子事務(wù)的問題。
只有異步消息翰舌,最簡單的解決方法是先預(yù)訂火車肆资,然后再預(yù)訂旅館,然后一旦兩個預(yù)訂都成功就都確認灶芝;預(yù)訂機制將阻止其他人預(yù)留(或者至少會確保有足夠的空間開放讓所有的預(yù)訂被確認)一段時間郑原。然而,這意味著該機制依賴于額外安全假設(shè):來自于跨分片的消息可以在固定的周期內(nèi)被包含在另外的分片中夜涕。
使用跨分片同步交易犯犁,問題更容易,但創(chuàng)建可以跨分片原子同步交易的分片解決方案的挑戰(zhàn)本身絕對是重要的女器。
如果單個應(yīng)用程序的使用量超過 O(c)酸役,則該應(yīng)用程序需要存在多個區(qū)塊鏈中。這樣做的可行性取決于應(yīng)用程序自身的具體情況驾胆。一些應(yīng)用程序(如貨幣)很容易并行化涣澡,而另外一些應(yīng)用程序(例如某些類型的市場設(shè)計)則不能并行化智能串行處理。
我們知道分片區(qū)塊鏈的屬性有一個事實是不可能實現(xiàn)的丧诺。阿姆達爾定律 表明在應(yīng)用程序有任何不可并行化組件的情況下入桂,一旦容易獲得并行化,不可并行化組件就會快速成為瓶頸驳阎。在像以太坊的通用計算平臺中抗愁,很容易提出不可并行化計算的例子:一個跟蹤內(nèi)部變量x的合約,一旦接到到一個交易就將變量x設(shè)置為sha3(x, tx_data)就是個簡單的例子蜘腌。沒有分片方案可以給與這種形式的個別應(yīng)用程序超過O(c)的性能沫屡。因此,隨著時間的推移撮珠,分片區(qū)塊鏈協(xié)議將會越來越好地能夠處理越來越多樣化的應(yīng)用程序類型和應(yīng)用程序交互沮脖,但分片架構(gòu)至少在規(guī)模超過O(c)的某些方面總是落后于單分片的架構(gòu)。
我們正在運行的是哪些安全模型芯急?
評估區(qū)塊鏈設(shè)計的安全性有幾個競爭模型:
- 誠實的大多數(shù)(或誠實的絕對多數(shù)):我們假設(shè)有一組驗證者勺届,而且這些驗證者的?(或?或?)由攻擊者控制,其余的驗證者誠實地遵循協(xié)議志于。
- 不協(xié)調(diào)的大多數(shù):我們假設(shè)所有的驗證者在博弈論的上都是合理的(除了攻擊者涮因,他們有動機使用某種方式來攻擊網(wǎng)絡(luò))废睦,但是不超過一部分(通常在?和?之間)協(xié)調(diào)他們的行動伺绽。
- 協(xié)調(diào)選擇:我們假定所有的驗證者都是由同一個參與者控制的,或者完全有能力協(xié)調(diào)他們之間的經(jīng)濟上最優(yōu)的選擇嗜湃。我們可以討論聯(lián)合的成本(或聯(lián)合的利潤)達到一些不良的結(jié)果奈应。
- 賄賂攻擊者模式:我們采取不協(xié)調(diào)的多數(shù)模型刚陡,而不是讓攻擊者成為參與者之一,攻擊者處于協(xié)議之外廷区,并有能力賄賂任何參與者來改變他們的行為。攻擊者被模擬為擁有預(yù)算绝淡,這是他們愿意支付的最高金額丝格,我們可以討論他們的成本,即他們最終為破壞協(xié)議平衡而支付的金額。
比特幣的Eyal and Sirer’s selfish mining fix 工作量證明是健壯的运授,在誠實的大多數(shù)高達?的假設(shè)下熬甚,在不協(xié)調(diào)的大多數(shù)高達?的假設(shè)下乡括。Schellingcoin 在誠實的大多數(shù)假設(shè)和在不協(xié)調(diào)的大多數(shù)假設(shè)下高達?,在協(xié)調(diào)選擇模型下具有ε(即略微大于零)的攻擊成本屏镊,并且在賄賂攻擊者模型中由于P + epsilon attacks 要求具有P + ε預(yù)算要求和ε成本。
混合模型也是存在的膀值。例如棍丐,即使是在協(xié)調(diào)選擇模型和賄賂攻擊者模型中误辑,通常也會做出一個誠實的少數(shù)人的假設(shè),某些部分(可能是1-15%)的驗證者會無視激勵而采取利他行為歌逢。 我們也可以討論由50-99%的驗證者組成的聯(lián)盟巾钉,試圖破壞協(xié)議或傷害其他驗證者; 例如在工作量證明中,一個51%算力大小的聯(lián)盟可以通過拒絕包含其他礦工產(chǎn)出的區(qū)塊來增加增加自己的收入秘案。
誠實的大多數(shù)模型可能是非常不切實際的睛琳,并且已經(jīng)被證明了-比特幣的SPV mining fork 是個實際的例子。它證明了很多踏烙;例如师骗,一個誠實的大多數(shù)模型意味著誠實的礦工自愿燒毀他們自己的資金,以某種方式懲罰攻擊者讨惩。不協(xié)調(diào)的大多數(shù)模型的假設(shè)可能是現(xiàn)實的辟癌;還有個中間模型,其中大多數(shù)節(jié)點是誠實的但有個預(yù)算荐捻,如果他們失去了太多資金就回停止黍少。
賄賂攻擊者模式在某些情況下被批評為不切實際的對抗行為,盡管其支持者認為处面,如果一個協(xié)議的設(shè)計考慮了賄賂攻擊者模型厂置,那么它應(yīng)該能夠大幅降低共識成本,因為51%的攻擊變成一個可以從中恢復(fù)的事件魂角。 我們將在不協(xié)調(diào)的大多數(shù)和賄賂攻擊者模型的背景下評估分片昵济。
我們?nèi)绾谓鉀Q在不協(xié)調(diào)的大多數(shù)模型中的單分片接管攻擊?
簡單來說野揪,隨機抽樣访忿。 每個分片被分配一定數(shù)量的協(xié)調(diào)者(例如,150)斯稳,在每個分片上批準區(qū)塊的協(xié)調(diào)者都是從分片的樣本中獲取的海铆。樣本可以半頻繁地(例如每12小時一次)或最頻繁地(也就是說,沒有真正的獨立抽樣過程挣惰,每個塊從全局池中的每個分片隨機選擇協(xié)調(diào)者)進行重新洗牌卧斟。
結(jié)果是,在一個誠實/不協(xié)調(diào)的多數(shù)模型中憎茂,相對于每一個單節(jié)點正在驗證和創(chuàng)建塊珍语,即使在任何給定的時間在每個分片上只有幾個節(jié)點驗證和創(chuàng)建塊,安全級別實際上并不低得多唇辨。 原因是簡單統(tǒng)計:如果你在全局集合上假設(shè)一個?誠實的絕對多數(shù)廊酣,如果樣本的大小是150蛤吓,那么以99.999%的概率就可以滿足樣本的誠實多數(shù)條件那先。 如果你假定在全局組合上有一個?誠實的絕對多數(shù),那么這個概率就會增加到99.999999998%(這里請看細節(jié) )。
因此话瞧,至少在誠實/不協(xié)調(diào)的大多數(shù)情況下舷手,我們有:
- 去中心化(每個節(jié)點只存儲O(c) 數(shù)據(jù)眉尸,因為它是O(c) 分片的一個輕客戶端秒紧,所以存儲O(1) * O(c) = O(c)的塊頭數(shù)據(jù),以及對應(yīng)于當前分配給它的一個或多個分片的完整狀態(tài)和近期歷史的O(c)數(shù)據(jù))
- 可擴展性 (有O(c) 個分片透乾,每個分片有O(c) 的容量洪燥,最大容量是n = O(c^2))
- 安全性(攻擊者需要控制整個O(n)大小的驗證池中的至少 ? ,以便有機會接管網(wǎng)絡(luò))乳乌。
在Zamfir模型中(或者在“非常非常適應(yīng)性的對手”模型中)捧韵,事情并不是那么容易,但是我們稍后會做到這一點汉操。 請注意再来,由于采樣的不完善性,安全閾值確實從1/2降低到了?磷瘤,但相對于可能是100-1000倍的可擴展性收益而不會損失去中心化芒篷,這仍然是一個令人驚訝的低安全性損失。
你如何在工作量證明和權(quán)益證明中做這個抽樣采缚?
在權(quán)益證明中针炉,這很容易。 已經(jīng)有一個“活動驗證者集合”在狀態(tài)中被跟蹤扳抽,并且可以直接從這個集合中簡單地抽樣篡帕。 協(xié)議內(nèi)算法運行并為每個分片選擇150個校驗者,或者每個校驗者獨立地運行一個算法摔蓝,該算法使用一個共同的隨機源來(可證實地)確定它們在任何給定時間的分片赂苗。 請注意愉耙,抽樣任務(wù)是“強制性的”是非常重要的贮尉。 驗證者不能選擇它們進入的碎片。 如果驗證者可以選擇朴沿,那么攻擊者可以用小權(quán)益集中他們的權(quán)益到一個分片上并攻擊它猜谚,從而消除系統(tǒng)的安全性。
在工作量證明中赌渣,這是比較困難的魏铅,就像“直接的”工作量證明計劃一樣,不能阻止礦工將工作量于某一特定的分片坚芜。 有可能使用proof-of-file-access forms工作量證明來將個人礦工鎖定到單獨的分片览芳,但是很難確保礦工不能快速下載或生成可用于其他分片的數(shù)據(jù)并因此避開 這種機制。 最為人所知的方法是通過Dominic Williams發(fā)明的一種叫做“拼圖塔”的技術(shù)鸿竖,礦工首先在一個共同鏈上進行工作量證明沧竟,然后將這些證明導(dǎo)入到關(guān)于權(quán)益風格驗證池的證明中铸敏,然后驗證池就像在權(quán)益證明的情況下一樣。
一個可能的中間路線可能如下所示悟泵。 礦工可以花費大量的(O(c)大需颈省)工作來創(chuàng)建一個新的“密碼身份”。 工作量證明方案的確切值糕非,然后選擇他們在哪個分片上產(chǎn)生下一個塊蒙具。他們可以花費O(1)大小的工作量在分片上創(chuàng)建一個塊,然后工作量證明的價值決定了他們接下來可以繼續(xù)產(chǎn)塊的分片朽肥。注意的是禁筏,所有這些方法都以某種方式工作量證明“有狀態(tài)”,這是必要的衡招。
取樣的頻率高低有哪些折衷融师?
選擇頻率只影響如何自適應(yīng)攻擊者使得協(xié)議仍然安全防御他們; 例如,如果您認為適應(yīng)性攻擊(例如不誠實的驗證者發(fā)現(xiàn)他們是同一個樣本的一部分并且共同勾結(jié))可能在6小時內(nèi)發(fā)生但不會更早蚁吝,那么采樣時間為4 小時而不是12小時旱爆。 這是一個贊成盡快抽樣的理由。
每個區(qū)塊進行抽樣的主要挑戰(zhàn)是重新改組會帶來非常高的開銷窘茁。 具體來說怀伦,驗證分片上的塊需要知道該分片的狀態(tài),因此每次驗證器被重新改組時山林,驗證器需要下載他們所在的新分片的整個狀態(tài)房待。這需要強大的狀態(tài)大小控制策略(即經(jīng)濟上確保狀態(tài)不會增長過大,無論是刪除舊賬戶驼抹,限制創(chuàng)建新賬戶的比率還是兩者的結(jié)合)桑孩,以及相當長的重組時間。
目前框冀,Parity客戶端可以在?3分鐘內(nèi)通過“warp-sync”下載和驗證完整的以太坊狀態(tài)快照; 如果我們增加20倍以彌補增加的使用量(10 tx / sec而不是0.5 tx / sec)(我們假定未來的狀態(tài)大小控制策略和從長期使用中積累的“灰塵”大致抵消了) 得到約60分鐘的狀態(tài)同步時間流椒,這表明12-24小時的同步周期但不少于是安全的。
有兩條可能的途徑可以克服這個挑戰(zhàn)明也。
我們是否可以強制更多的狀態(tài)保持在用戶端宣虾,以便交易可以被驗證,而不需要驗證器來保存所有的狀態(tài)數(shù)據(jù)温数?
這里的技術(shù)往往涉及要求用戶存儲狀態(tài)數(shù)據(jù)绣硝,并為他們發(fā)送的每一個交易單獨提供Merkle證明。 一個交易將與一個正確執(zhí)行Merkle證明一起發(fā)送撑刺,這個證明將允許一個只有狀態(tài)根的節(jié)點計算新的狀態(tài)根鹉胖。 這種正確執(zhí)行證明將包括需要遍歷的trie中對象的子集,以訪問和驗證交易必須驗證的狀態(tài)信息; 因為Merkle證明的大小是 O(log(n)),所以訪問恒定數(shù)量對象的交易證明也是 O(log(n))大小甫菠。
Merkle樹中對象的子集败许,需要在訪問多個狀態(tài)對象的交易的Merkle證明中提供
以純粹的形式實施這個計劃有兩個缺陷。 首先淑蔚,它引入了O(log(n))的開銷市殷,盡管可以說這個O(log(n))開銷并不像看起來那么糟糕,因為它確保了驗證器總是可以簡單地將狀態(tài)數(shù)據(jù)保存在內(nèi)存中刹衫, 它永遠不需要處理訪問硬盤驅(qū)動器的開銷醋寝。 其次,如果交易訪問的地址是靜態(tài)的带迟,那么它可以很容易地實施音羞,但是如果所討論的地址是動態(tài)的那么是很困難實施的,也就是說嗅绰,如果交易執(zhí)行的代碼是read(f(read(x))),其中某些狀態(tài)讀取的地址取決于其他狀態(tài)讀取的執(zhí)行結(jié)果。 在這種情況下,交易發(fā)送者認為交易將在發(fā)送交易時讀取的地址可能與交易被打包在塊中時實際讀取的地址不同憨募,因此Merkle證明可能是不充分的吵瞻。
一種折中方法是允許交易發(fā)送者發(fā)送一個證明,該證明包含訪問數(shù)據(jù)的最可能的可能性; 如果證明是充分的卿泽,則交易將被接受签夭,如果狀態(tài)意外地變化并且證明不足措拇,則發(fā)送者必須重新發(fā)送或者網(wǎng)絡(luò)中的一些幫助者節(jié)點重新發(fā)送交易并添加正確的證明丐吓。 那么開發(fā)者可以自由地進行具有動態(tài)行為的交易汹碱,但是行為越動態(tài)稚新,交易實際上被打包在塊中的可能性就越小尺迂。
注意驗證者在這種方法下的交易包含策略需要很復(fù)雜蹲盘,因為他們可能會花費數(shù)百萬的gas處理一筆交易運行到最后一步才發(fā)現(xiàn)訪問到他們沒有的一些狀態(tài)條目。 一個可能的妥協(xié)是驗證者有一個策略召衔,只接受(i)低gas成本的交易祭陷,例如<100k。 (ii)靜態(tài)地指定一組允許訪問的合約兵志,并包含這些合約的整個狀態(tài)的證明。 請注意,這只適用于最初廣播交易時; 一旦交易被打包在一個塊中笙瑟,執(zhí)行順序是固定的往枷,因此只能提供與實際需要訪問的狀態(tài)對應(yīng)的最小Merkle證明。
如果驗證者不立即重新重組盾舌,還有一個提高效率的機會墓臭。 我們可以期望驗證者存儲來自已經(jīng)處理的交易的證明的數(shù)據(jù),以便該數(shù)據(jù)不需要被再次發(fā)送; 如果k交易是在一個重組周期內(nèi)發(fā)送的妖谴,那么這就將Merkle證據(jù)的平均大小從log(n) 減少到log(n) -log(k)窿锉。
隨機抽樣的隨機性是如何產(chǎn)生的?
首先膝舅,重要的是要指出嗡载,即使隨機數(shù)的產(chǎn)生是高度可利用的,這對協(xié)議來說也不是一個致命的缺陷仍稀。 相反洼滚,它只是意味著有一個中等偏高的中心化激勵。 原因在于技潘,由于隨機性選取相當大的樣本遥巴,因此很難將隨機性偏差超過一定數(shù)量。
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%攻擊,并且攻擊者具有全球權(quán)益池的p%值桩,則攻擊者能夠在一輪中獲得大多數(shù)的概率是:
下面是一個表格摆霉,說明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奔坟,任何給定的隨機種子將導(dǎo)致有利于攻擊者的樣本的可能性確實非常小携栋。 這就意味著從隨機性的安全角度來看,攻擊者需要在選擇隨機值的順序上有非常大的自由度咳秉,以徹底打破抽樣過程婉支。 大多數(shù)權(quán)益證明隨機性的漏洞不允許攻擊者簡單地選擇種子; 在最壞的情況下,他們給了攻擊者許多機會從許多偽隨機生成的選項中選出最有利的種子滴某。 如果對此非常擔心磅摹,可以簡單地將N設(shè)置為更大的值滋迈,并且在計算隨機性的過程中添加適度的硬key-derivation函數(shù)霎奢,從而需要超過2100計算步驟來找到足夠隨機性偏差户誓。
現(xiàn)在,我們來看看為了獲利而不是直接接管幕侠,試圖更輕微影響隨機性的攻擊風險帝美。 例如,假設(shè)有一個算法從一些非常大的集合中偽隨機地選擇了1000個驗證者(每個驗證者獲得$ 1的獎勵)晤硕,攻擊者擁有10%的權(quán)益悼潭,所以攻擊者的平均“誠實”收入為100, 攻擊者可以操縱隨機性來“重新擲骰子”(攻擊者可以無限次地執(zhí)行此操作)舞箍,這個成本是1美元舰褪。
由于中心極限定理,樣本數(shù)量的標準偏差疏橄,并且基于數(shù)學上的其他已知結(jié)果占拍,N個隨機樣本的期望最大值略低于M + S * sqrt(2 * log(N)),其中M是 平均值和S是標準差捎迫。 因此晃酒,操縱隨機性和有效地重擲骰子(即增加N)的獎勵急劇下降, 重新選擇你的預(yù)期獎勵是100美元窄绒,一個重新選擇105.5美元贝次,兩個108.5美元,其中三個110.3美元彰导,其中四個111.6美元蛔翅,五個112.6美元,六個113.5美元位谋。 因此山析,在五次重試之后,它不值得這樣做倔幼。 結(jié)果盖腿,一個有10%權(quán)益的經(jīng)濟動機的攻擊者會(在社會上浪費)花5美元獲得13美元的額外收入,凈盈余為8美元损同。
然而翩腐,這種邏輯假定單輪重擲骰子是昂貴的。 許多比較老的權(quán)益證明算法有一個“權(quán)益磨損”漏洞膏燃,重擲擲骰子只是在本地計算機上進行計算; 具有此漏洞的算法在分片環(huán)境中肯定是不可接受的茂卦。 較新的算法(參見關(guān)于權(quán)益證明FAQ的“驗證器選擇”部分)具有只能通過在塊創(chuàng)建過程中自愿放棄一個點來完成擲骰子的屬性,這需要放棄獎勵和費用组哩。 減輕邊緣經(jīng)濟動機的攻擊對樣本選擇的影響的最好辦法是找到增加成本的方法等龙。 一種將N輪投票的成本增加一倍的方法是由Iddo Bentov設(shè)計的多數(shù)位方法; Mauve論文分片算法期望使用這種方法处渣。
多米尼克·威廉斯(Dominic Williams)最為研究和倡導(dǎo)的確定性門限簽名方法是另一種不被少數(shù)群體聯(lián)盟利用的隨機數(shù)生成方式。 這里的策略是使用確定性的門限簽名來從選擇樣本中生成隨機種子蛛砰。 確定性閾值簽名具有這樣的屬性罐栈,即不管給定的一組參與者中的哪一個向算法提供其數(shù)據(jù),只要至少1/3的參與者誠實地參與泥畅,值就保證相同荠诬。 這種方法顯然不是經(jīng)濟上可以利用的,并且完全抵抗各種形式的權(quán)益磨損位仁,但是它有幾個弱點:
- 它依賴于更復(fù)雜的密碼學(具體來說柑贞,橢圓曲線和配對)。 其他方法僅僅依賴于對常見散列算法的隨機預(yù)言聂抢。
- 當許多驗證器脫機時钧嘶,它會失敗。 公共區(qū)塊鏈的預(yù)期目標就是能夠在網(wǎng)絡(luò)的很大一部分節(jié)點同時消失但剩余節(jié)點大部分是誠實的情況下琳疏,它依然可以存活有决。 確定性門限簽名方案在這一點上不能提供這種屬性。
- 在Zamfir模型中轿亮,有超過? 的驗證器串通是不安全的疮薇。 上述權(quán)益證明FAQ中描述的其他方法仍然會使操作隨機性變得非常昂貴,因為來自所有驗證人的數(shù)據(jù)被混合到種子中我注,并且進行任何操作都需要通用串通或徹底排除其他驗證者按咒。
有人可能會認為確定性門限簽名方法在一致性較好的情況下工作得更好,其他方法在可用性較好的情況下工作得更好但骨。
在賄賂攻擊者或協(xié)調(diào)選擇模式中通過隨機抽樣進行分片的關(guān)注點是什么励七?
在賄賂攻擊者或協(xié)調(diào)選擇模型中,驗證者是隨機抽樣的事實并不重要:不管樣本是什么奔缠,攻擊者都可以賄賂絕大多數(shù)樣本做攻擊者喜歡的事情掠抬,或者攻擊者直接控制大多數(shù)的樣本,并且可以指揮樣本以低成本(O(c) 成本)執(zhí)行任意的動作校哎。
在這一點上两波,攻擊者有能力對該樣本進行51%的攻擊。 由于存在跨分片擴散風險闷哆,威脅進一步放大:如果攻擊者破壞了分片的狀態(tài)腰奋,攻擊者就可以開始向其他分片發(fā)送無限量的資金,并執(zhí)行其他跨分片的惡作劇抱怔。 總而言之劣坊,賄賂攻擊者或協(xié)調(diào)選擇模型的安全性并不比簡單地創(chuàng)O(c) altcoins好得多。
我們?nèi)绾胃倪M?
基本上是通過全面解決欺詐檢測問題屈留。
解決這個問題的一個主要類別是使用挑戰(zhàn)-響應(yīng)機制局冰。 挑戰(zhàn)-響應(yīng)機制通常依賴于一個升級原則:事實上X(例如测蘑,“在#54分片的排序#17293是有效的”)最初被接受為真,如果至少有k個驗證人簽署聲明(背后有存款)為真康二。 但是碳胳,如果發(fā)生這種情況,那么在這個挑戰(zhàn)期間赠摇,2k驗證者可以簽署聲明固逗,聲明這是錯誤的浅蚪。 如果發(fā)生這種情況藕帜,4k驗證人可以簽署一個聲明,說明聲明實際上是真實的惜傲,等等洽故,直到一方放棄或大多數(shù)驗證人已經(jīng)簽署聲明,此時每個驗證人和客戶端自己檢查X是否為真盗誊。 如果X被裁定為正確时甚,那么所有提出這種聲明的人都會得到獎勵阶淘,每個提出錯誤聲明的人都會受到懲罰路捧,反之亦然。
看看這個機制爪模,你可以證明惡意行為者失去了一定數(shù)量的資金开镣,與他們被迫查看給定數(shù)據(jù)的行為者數(shù)量成比例刀诬。 強迫所有用戶查看數(shù)據(jù)需要大量的驗證者簽署錯誤的聲明,這可以用來懲罰他們邪财,所以迫使所有用戶查看一段數(shù)據(jù)的成本是 O(n); 這防止了挑戰(zhàn)-響應(yīng)機制被用作拒絕服務(wù)向量陕壹。
什么是數(shù)據(jù)可用性問題,我們?nèi)绾问褂眉m刪碼來解決它树埠?
See https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding
我們可以通過某種奇特的密碼累加器方案來消除解決數(shù)據(jù)可用性的需要嗎糠馆?
不。假設(shè)有一個方案存在一個表示狀態(tài)的對象S(S可能是一個散列)怎憋,以及個別用戶持有的可以證明存在狀態(tài)對象的輔助信息(“證人”)(例如 S是Merkle根又碌,證人是分支,盡管其他結(jié)構(gòu)如RSA累加器確實存在)绊袋。 存在廣播一些數(shù)據(jù)的更新協(xié)議毕匀,并且該數(shù)據(jù)改變S以改變狀態(tài)的內(nèi)容,并且還可能改變證人愤炸。
假設(shè)某個用戶在該狀態(tài)下有一組N個對象的證人期揪,并且更新了這些對象中的M個。 接收到更新信息后规个,用戶可以檢查所有N個對象的新狀態(tài)凤薛,從而查看哪個M被更新姓建。 因此,更新信息本身至少編碼~M * log(N)個比特的信息缤苫。 因此速兔,為了實現(xiàn)M個交易的效果,每個人需要接收的更新信息必須是O(M)活玲。
那么這意味著我們實際上可以創(chuàng)建可擴展的分片區(qū)塊鏈涣狗,其中發(fā)生不良事件的成本與整個驗證人集的大小成正比?
有一個微不足道的攻擊舒憾,攻擊者總是可以焚燒O(c)資金來暫時降低分片的質(zhì)量:通過發(fā)送高交易費用的交易來制造垃圾镀钓,迫使正常用戶無法進入。這種攻擊是不可避免的;你可以用靈活的gas限制進行補償镀迂,甚至可以嘗試根據(jù)使用情況嘗試自動重新分配節(jié)點到分片的“透明分片”方案丁溅,但是如果某個特定的應(yīng)用程序是不可并行的,Amdahl法則保證你無能為力探遵。在這里打開的攻擊(提醒:它只適用于Zamfir模式窟赏,而不是誠實/不協(xié)調(diào)的大多數(shù))可以說沒有比垃圾交易攻擊嚴重得多。因此箱季,我們已經(jīng)達到了單個分片安全性的已知限制涯穷,并且試圖走得更遠是沒有價值的。
讓我們往回走一點藏雏,如果有實時重組拷况,我們是否真的需要這種復(fù)雜性?不實時重組基本上意味著每個分片直接從全局驗證人池中提取驗證人诉稍,所以它就像區(qū)塊鏈一樣運行蝠嘉,所以分片實際上不會引入任何新的復(fù)雜性?
有點杯巨。首先蚤告,值得注意的是,工作量證明和簡單的權(quán)益證明服爷,即使沒有分片杜恰,在賄賂攻擊者模型中都具有非常低的安全性;一個區(qū)塊在經(jīng)過O(n) 時間后才在經(jīng)濟意義上真正地“確定”(好像只有幾個區(qū)塊已經(jīng)過去了,那么替換區(qū)塊的經(jīng)濟成本就是從區(qū)塊有問題之前開始雙花的成本)仍源。Casper通過增加最終機制解決了這個問題心褐,經(jīng)濟安全邊際立即增加到最大。在一個分片鏈中笼踩,如果我們想要經(jīng)濟最終性的話逗爹,那么我們需要提出一個演繹鏈,為什么一個驗證人愿意在一個完全基于隨機樣本的鏈上做出一個非常強有力的聲明嚎于,當驗證人本身相信賄賂攻擊者和協(xié)調(diào)選擇模型可能是真實的掘而,所以隨機樣本可能被破壞挟冠。
你提到透明分片。 我12歲了袍睡,這是什么?
基本上斑胜,我們并不直接向開發(fā)者提供“分片”的概念控淡,也不會永久性地將狀態(tài)對象分配給特定的分片。 相反止潘,該協(xié)議有一個正在進行的內(nèi)置負載均衡過程掺炭,可以在分片之間移動對象。 如果分片變得太大或者消耗太多的gas覆山,可以分成兩半竹伸。 如果兩個分片變得太小,并且經(jīng)常彼此交互簇宽,他們可以合并在一起; 如果所有分片太小,則可以刪除一個分片并將其內(nèi)容移動到各種其他分片等等吧享。
想象一下魏割,唐納德·特朗普是否意識到人們在紐約和倫敦之間的旅行很多,但是有一個海洋的路钢颂,所以他可以拿出剪刀钞它,剪掉海洋,把美國東海岸和西歐粘在一起殊鞭, 大西洋旁邊的南極 - 這就是這樣的遭垛。
這有哪些優(yōu)點和缺點?
- 開發(fā)者不再需要考慮分片
- 分片有可能根據(jù)gas價格的變化手動調(diào)整操灿,而不是依靠市場機制來提高一些分片中的gas價格
- 不再有一個可靠的共置的概念:如果兩個以太坊 智能合約被放入同一個分片锯仪,以便他們可以互相交互,分片的變化可能最終將它們分開
- 協(xié)議更復(fù)雜
可以通過引入“順序域”的概念來緩解共置問題趾盐,其中合約可以指定它們存在于相同的順序域中庶喜,在這種情況下,它們之間的同步通信將始終是可能的救鲤。 在這個模型中久窟,一個分片可以被看作是一組被一起驗證的順序域,并且如果協(xié)議確定這樣做是有效的本缠,那么順序域可以在分片之間重新平衡斥扛。
同步跨分片消息將如何工作?
如果您將歷史交易記錄視為已經(jīng)結(jié)算丹锹,并且只是試圖計算狀態(tài)轉(zhuǎn)換函數(shù)稀颁,則該過程變得更容易队他。有幾種方法;一個相當簡單的方法可以描述如下:
- 一個交易可以指定一個可以在其中操作的一組分片
- 為了使交易有效,它必須在所有分片上被打包在相同塊高處峻村。
- 塊中的交易必須按照它們的散列順序(這確保了規(guī)范的執(zhí)行順序)
如果分片X上的客戶端看到帶有分片(X麸折,Y)的交易,則請求分片Y中的Merkle證明粘昨,以驗證(i)分片Y上存在該交易垢啼,以及(ii)分片上的前置狀態(tài)Y表示交易需要訪問的那些數(shù)據(jù)位。然后執(zhí)行交易并提交執(zhí)行結(jié)果张肾。請注意芭析,如果很多交易有許多不同的“塊對”,那么這個過程可能是非常低效的;由于這個原因吞瞪,只需要簡單的要求塊來指定姐妹分片就可能是最佳的馁启,然后可以在每塊級別更有效地進行計算。這是該方案如何運作的基礎(chǔ);人們可以想象更復(fù)雜的設(shè)計芍秆。但是惯疙,在進行新的設(shè)計時,確保低成本的拒絕服務(wù)攻擊不能任意拖慢狀態(tài)計算總是非常重要的妖啥。
那么半異步消息呢霉颠?
Vlad Zamfir創(chuàng)建了一個方案,異步消息仍然可以解決“預(yù)訂火車和旅館”的問題荆虱。這工作如下蒿偎。狀態(tài)記錄了最近所做的所有操作,以及任何給定操作(包括跨分片操作)觸發(fā)哪些操作的圖譜怀读。如果操作被還原诉位,則創(chuàng)建收據(jù),然后可以使用該收據(jù)來回滾該操作對其他分片的任何影響;這些回滾可能會觸發(fā)他們自己的回滾之類菜枷。這個論點是苍糠,如果一個偏好系統(tǒng)使得回滾消息可以像其他類型的消息一樣快地傳播兩次,那么一個在K個回合中完成執(zhí)行的復(fù)雜跨分片交易可以在另外的K個回合中完全回滾犁跪。
這個方案引入的開銷可以說是沒有得到充分的研究;可能存在觸發(fā)二次執(zhí)行漏洞的最壞情況椿息。很顯然,如果交易具有更加孤立的影響坷衍,這種機制的開銷較低;也許可以通過有利的gas成本規(guī)則激勵孤立執(zhí)行寝优。總而言之枫耳,這是高級分片更有前途的研究方向之一乏矾。
什么是保證跨分片調(diào)用?
分片中的挑戰(zhàn)之一是,在進行調(diào)用時钻心,默認情況下沒有硬協(xié)議提供凄硼,保證由該調(diào)用創(chuàng)建的任何異步操作都將在特定的時間范圍內(nèi)完成,甚至完全沒有;而是由某方在目的地分片中發(fā)送觸發(fā)收據(jù)的交易捷沸。這對于許多應(yīng)用程序來說是可以的摊沉,但是在某些情況下,由于以下幾個原因可能會有問題:
- 可能沒有任何明確的激勵措施來觸發(fā)給定的收據(jù)痒给。如果一個交易的發(fā)送給多方帶來了好處说墨,那么在各方試圖等待更長時間直到其他人發(fā)送交易(即玩“雞”)或者簡單地決定發(fā)送一個交易交易是不值得單獨交易的。
- 跨分片的gas價格可能會波動苍柏,在某些情況下尼斧,執(zhí)行前半部的操作會迫使用戶“堅持到底”,但用戶可能不得不以更高的gas價格來追蹤试吁。這可能會由于DoS攻擊和相關(guān)的惡意破壞形式而加劇棺棵。
- 一些應(yīng)用依賴于跨分片消息的“等待時間”上限(例如火車和旅館示例)。由于缺乏硬性保證熄捍,這些應(yīng)用程序?qū)⒈仨毦哂袩o效率大安全邊界烛恤。
人們可以試著想出一個系統(tǒng),在某些分片中生成的異步消息在一定數(shù)量的塊之后自動觸發(fā)目標分片中的結(jié)果治唤。然而棒动,這要求每個分片上的每個客戶端在計算狀態(tài)轉(zhuǎn)換函數(shù)的過程中主動檢查所有其他分片,這可能是低效率的來源宾添。最為人所知的折衷方法是:當高度為height_a的分片A的收據(jù)包含在高度為height_b的碎片B中時,如果塊高度的差異超過MAX_HEIGHT柜裸,則碎片B中的所有驗證人都從height_a + MAX_HEIGHT + 1創(chuàng)建塊到height_b - 1是受到懲罰的缕陕,這個懲罰成倍增加。這些處罰的一部分給予最終包括該塊作為獎勵的確認者疙挺。這使狀態(tài)轉(zhuǎn)換功能保持簡單扛邑,同時仍強烈激勵正確的行為。
等等铐然,但是如果攻擊者同時從每一個碎片向碎片X發(fā)送一個跨分片調(diào)用呢蔬崩?在數(shù)學上不能及時包含所有這些調(diào)用嗎?
正確;這是個問題搀暑。這是一個建議的解決方案沥阳。為了從分片A到分片B進行跨分片調(diào)用,調(diào)用者必須預(yù)先購買“凍結(jié)分片B的gas”(這是通過分片B中的交易完成的自点,并記錄在分片B中)桐罕。凍結(jié)分片B的gas具有快速滯期費率:一旦排序,每塊失去1 / k的剩余效能。分片A上的交易隨后可以將凍結(jié)的分片B gas與其創(chuàng)建的收據(jù)一起發(fā)送功炮,并且可以在分片B上免費使用溅潜。分片B的塊專門為這些交易分配額外的gas空間。請注意薪伏,由于滯期規(guī)則滚澜,對于給定的分片,在任何時候都可以獲得最多GAS_LIMIT * k的凍結(jié)gas嫁怀,當然可以在k個塊內(nèi)填充(事實上设捐,由于滯期造成的速度更快,但是我們可能由于惡意驗證人需要這個松散的空間)眶掌。假如太多的驗證人惡意地不包括收據(jù)挡育,我們可以通過免除驗證者來公平懲罰,盡可能多地從最舊的收據(jù)開始填充更多收據(jù)到“收據(jù)空間”朴爬。
在此預(yù)購機制下即寒,想要進行跨分片操作的用戶將首先預(yù)先購買所有將要進行操作的分片的gas,過度購買以考慮滯期費用召噩。 如果操作會創(chuàng)建一個收據(jù)母赵,觸發(fā)在B分片中消耗100000gas的操作,那么用戶將預(yù)先購買100000 * e(如271818)分片B凍結(jié)的gas具滴。 如果該操作反過來在分片C中花費100000gas(即凹嘲,兩個間接級別),則用戶將需要預(yù)先購買100000 * e^2(如738906)分片C凍結(jié)的gas构韵。 注意周蹭,一旦購買被確認,并且用戶開始主要操作疲恢,用戶可以確信他們將與gas價格市場的變化隔離凶朗,除非驗證者自愿地從收據(jù)不包含懲罰中失去大量的資金。
凍結(jié)gas显拳? 這聽起來很有趣棚愤,不僅是跨分片操作羊精,還有可靠的分片內(nèi)調(diào)度
確實; 您可以購買分片A中的凍結(jié)分片A gas,并從分片A向其自身發(fā)送保證的跨鏈分片調(diào)用揣炕。 雖然注意到這個方案只支持在很短的時間間隔內(nèi)進行調(diào)度,并且調(diào)度對于這個塊是不準確的; 只能保證在一段時間內(nèi)發(fā)生痊硕。
是否內(nèi)分片和跨分片有保證的調(diào)度挂脑,有助于抵制試圖審查交易的大多數(shù)共謀?
是。 如果用戶未能獲得交易哑了,因為共謀驗證者正在過濾交易并且不接受任何包含該交易的塊,則用戶可以發(fā)送一系列消息來觸發(fā)一系列有保證的預(yù)定消息炕淮,最后一個消息在EVM內(nèi)部重建交易并執(zhí)行它拆火。 如果不徹底關(guān)閉有保證的調(diào)度功能,并嚴重限制整個協(xié)議涂圆,防止這種規(guī)避技術(shù)實際上是不可能的们镜,因此惡意的驗證者將無法輕易做到。
分片區(qū)塊鏈可以更好地處理網(wǎng)絡(luò)分區(qū)嗎润歉?
本文檔中描述的方案不會改進非分片區(qū)塊鏈; 實際上模狭,每個分區(qū)最終都會在分區(qū)兩側(cè)有一些節(jié)點。 有人(例如來自IPFS的Juan Benet)建立了可擴展的網(wǎng)絡(luò)踩衩,其具體目標是網(wǎng)絡(luò)可以根據(jù)需要切分成分片嚼鹉,從而在網(wǎng)絡(luò)劃分的條件下盡可能地繼續(xù)運行贩汉,但是存在不尋常的加密經(jīng)濟挑戰(zhàn)來做好這項工作。
一個主要的挑戰(zhàn)是锚赤,如果我們想要基于位置的分片匹舞,那么地理網(wǎng)絡(luò)劃分最低限度地阻礙了分片內(nèi)聚合(具有非常低的分片內(nèi)延遲和因此非常快的分片內(nèi)塊時間的副作用)宴树,那么 我們需要有一種方法讓驗證者選擇他們正在參與的分片策菜。這是很危險的,因為它允許在誠實/不協(xié)調(diào)的多數(shù)模型中有更多類別的攻擊酒贬,和Zamfir模型中更高作惡因子更低成本的攻擊又憨。 地理切分分片的安全性和通過隨機抽樣來分片效率是兩個完全不同的事情。
其次锭吨,如何組織應(yīng)用程序需要更多的思考蠢莺。 上面描述的分片區(qū)塊鏈中的一個可能的模型是每個“app”在某個分片上(至少對于小規(guī)模的應(yīng)用程序)。 但是零如,如果我們希望應(yīng)用程序本身具有分區(qū)防護功能躏将,則意味著所有應(yīng)用程序都需要在某種程度上進行跨分片。
解決這個問題的一個可能途徑是創(chuàng)建一個提供兩種分片的平臺 - 一些分片是隨機抽樣的高安全性“全局”分片考蕾,而其他碎片則是較低安全“本地”分片祸憋,可能具有屬性的如超快的塊時間和更便宜的交易費用。 非常低的安全性碎片甚至可以用于數(shù)據(jù)發(fā)布和消息傳遞肖卧。
通過 n = O(c^2)推動擴展的獨特挑戰(zhàn)是什么蚯窥?
有幾個考慮因素。首先塞帐,需要將算法從雙層算法轉(zhuǎn)換為可堆疊的n層算法;這是可能的拦赠,但是很復(fù)雜。其次葵姥,n / c(即網(wǎng)絡(luò)的總計算負荷與一個節(jié)點的容量之間的比率)恰好是接近兩個常數(shù)的值:首先荷鼠,如果以塊為單位測量,則幾個小時的時間跨度榔幸,這是一個可以接受的“最大安全確認時間”允乐,其次是獎勵和存款之間的比率(早期計算表明Casper的存款大小為32ETH,塊獎勵為0.05ETH)削咆。后者的后果是喳篇,如果一個分片上的獎勵和懲罰升級到驗證者存款的規(guī)模,持續(xù)攻擊分片的成本將是O(n)大小态辛。
高于c^2可能會導(dǎo)致進一步削弱系統(tǒng)所能提供的安全保障類別,并允許攻擊者以中等成本長時間周期以某種方式攻擊某個碎片挺尿,盡管仍有可能防止無效狀態(tài)被最終確定奏黑,并防止最終狀態(tài)被回滾炊邦,除非攻擊者愿意支付O(n)的成本问词。然而纽帖,回報是巨大的 - 一個超級分割的區(qū)塊鏈可以用作幾乎所有去中心化應(yīng)用程序的通用工具,并且可以承擔交易費用狈邑,使其幾乎免費蹂匹。
原文:https://github.com/toxotguo/thinking/edit/master/Sharding FAQ.md
安利一個以太坊教程碘菜,對入門學習很有幫助。