分片技術(sharding)——區塊鏈擴容問題的良方
任何一個曾經開發過DApp的程式設計師都必須考慮到當前公共區塊鏈的侷限性,其中區塊鏈侷限性的最重要和最明顯的問題就是有限的吞吐量,比如,每秒處理的交易量過少。為了執行一個能夠處理實際吞吐量需求的DApp,區塊鏈就必須具有可擴充套件性。
進行區塊鏈擴容的一個答案就是分片技術(Sharding)。分片技術承諾通過改變網路驗證的方式來增加吞吐量。分片技術獨特於其他解決擴容的鏈上技術的關鍵特性,就是它可以進行水平擴容,也就是說,網路的吞吐量隨著挖礦網路的擴充套件而增加。這種特殊的特性可能使它成為推動區塊鏈技術被快速採用的理想技術。
本文將簡要地討論現有區塊鏈平臺的擴容問題,因為大多數讀者都必須要熟悉這一問題。然後我們將進一步討論分片技術和它的不同形式將如何成為一個有希望解決擴容問題的方案。這篇文章還將涉及到實現分片技術的一些理論基礎和其所面臨的實際挑戰,以及我們如何能克服這些挑戰。
現有區塊鏈的擴容問題
公共區塊鏈平臺今天面臨的最大問題之一就是可擴充套件性。所有主流的平臺都在努力提高每秒的交易量。事實上,當今的公共以太坊網路和比特幣網路平均每秒可以處理7-10筆交易。這一數字遠低於像Visa這樣的集中支付處理器,後者平均每秒能處理約8000筆交易。
緩慢的交易處理造成了一個主要問題,因為大量的未完成交易阻塞了網路,使得那些諸如實時支付這樣的應用程式很難在區塊鏈上一展身手。隨著確認支付的時間拉長,最終就會給使用者帶來諸多不便;這也是為什麼像PayPal和Visa這樣的信用卡支付方式仍然更具吸引力的主要原因之一。隨著更多更復雜的DApps開始依賴於相同的一個區塊鏈網路,遲緩的交易速度所導致的問題只會變得更加複雜。
從技術角度來看,所有區塊鏈的共識協議都有一個具有挑戰性的限制:網路中的每一個完全參與的節點都必須要驗證每一筆交易,並且這些節點必須和它的其他節點保持一致,這是區塊鏈技術的組成部分,它通過建立分散式的賬本來保證區塊鏈的安全。
在大多數像比特幣和以太坊這樣的區塊鏈上,節點都是由公眾進行執行的。雖然去中心化的共識機制提供了一些重要的優勢,比如容錯性、安全性、政治中立和真實性,但是這種驗證鏈的方法是以降低可擴充套件性為代價的。當這些公共區塊鏈變得更大時,它將需要越來越多的處理能力來驗證這些公共區塊鏈,這可能會在這些區塊鏈的網路中造成瓶頸,從而減慢那些建立新應用程式的速度。
分片技術:分而治之
分片技術是一種基於資料庫分片傳統概念的擴容技術,它將資料庫分割成多個碎片並將這些碎片放置在不同的伺服器上。在公共區塊鏈的情境中,網路上的交易將被分成不同的碎片,其由網路上的不同節點組成。因此,每個節點只需處理一小部分傳入的交易,並且通過與網路上的其他節點並行處理就能完成大量的驗證工作。將網路分割為碎片會使得更多的交易同時被處理和驗證。因此,隨著網路的增長,區塊鏈處理越來越多的交易將成為可能。這種屬性也稱為水平擴容。
我們可以想象一下,現有的區塊鏈就像一條繁忙的高速公路,這條高速公路的收費站只有一個收費口。這種佈局的結果將是導致交通堵塞,因為人們將排著長隊等待通過這唯一的收費站。實現一個基於分片技術的區塊鏈就像在高速公路上增加15或20個收費口。它將極大地提高汽車通過收費站的速度。因此,分片技術將帶來巨大的差異,並顯著提高區塊鏈的交易速度。
基於分片技術的區塊鏈的實現對公共區塊鏈有著不同的好處。首先,區塊鏈上處理交易的速度變成了每秒上千筆甚至更多,這改變了人們對加密貨幣作為支付方式效率的看法。改善交易吞吐量將會給去中心化的系統帶來使越來越多的使用者和應用程式,而這將反過來促進區塊鏈的進一步採用,也使挖礦變得更有利可圖,同時也能吸引更多加入到公共網路上的節點,從而形成一個良性迴圈。
此外,分片技術可以幫助降低交易費用,因為驗證單筆交易的處理量減少了;節點可以在依然盈利運營的同時收取較小的費用。在現實世界中,我們將低費用與高交易處理能力結合起來,會使公共鏈將變得越來越有吸引力。這些積極的趨勢所持續的時間越長,我們就會越能看到更多的主流的加密技術和區塊鏈應用程式的出現。
分片技術的策略
這部分主要講的是相關的基本概念,但是我們有更細分的方法來實現分片策略,如網路分片和交易分片,以及狀態分片等。通過網路和交易分片,區塊鏈節點的網路被分割成不同的碎片,每個碎片都能形成獨立的處理過程並在不同的交易子集上達成共識。通過這種方式,我們可以並行處理相互之間未建立連線的交易子集,通過提高數量級顯著提高交易的吞吐量。
另一方面,在當今的主流公共區塊鏈上,所有公共節點都承擔著儲存交易、智慧合約和各種狀態的負擔,這可能使其在為了獲得更大的儲存空間而進行巨大的花費,以維持其在區塊鏈上的正常運轉。
為了解決這一問題,有一種可被稱為狀態分片的可行方法已被提出。這一技術的關鍵是將整個儲存區分開,讓不同的碎片儲存不同的部分;因此,每個節點只負責託管自己的分片資料,而不是儲存完整的區塊鏈狀態。
分片技術的複雜性
儘管所有不同形式的分片技術都可能非常直觀,但通過對技術細節的解讀,我們可以看到這一方法的複雜性和潛在的挑戰。分片技術的其中一些挑戰是很容易克服的,而另一些則不然。一般來說,網路和交易分片更容易實現,而狀態分片則要複雜得多。下面,對於不同的分片機制,我們會明確地討論它們所面臨的一些挑戰,以及它們的可行性。
網路分片
分片的第一個也是最重要的挑戰是建立碎片。開發者需要開發一種機制來確定哪些節點可以按照安全的方式保留在哪些碎片中,這樣就能避免那些控制大量特定碎片的人所發起的攻擊 。
打敗攻擊者的最佳方法(至少在大多數情況下)就是建立隨機性。通過利用隨機性,網路可以隨機抽取節點形成碎片。這樣一種隨機抽樣的方式可以防止惡意節點過度填充單個碎片。
但是,我們如何建立隨機性呢?最容易獲得公共隨機性的來源是區塊,例如,交易的Merkle tree root。在區塊中所提供的隨機性是可被公開驗證的,並且可以通過隨機提取器中提取統一的隨機位元。
然而,簡單地使用隨機機制將節點分配給碎片仍是不夠的。我們還必須要確保網路的一個碎片中不同成員意見的一致性。這可以通過像工作量證明這樣的共識協議來實現。
交易分片
交易分片可聽起來那麼簡單。考慮到在一個類似於比特幣的系統中引入交易分片(沒有智慧合同),系統的狀態是用UTXOs來進行定義的。我們假設網路已經由碎片所組成,使用者傳送一筆交易,每一筆交易有兩個輸入和一個輸出。那麼,該筆交易將如何分配給一個碎片呢?
最直觀的方法是根據交易雜湊值的最後幾位來決定碎片。例如,如果雜湊值的最後一個位元是0的話,那麼交易將被分配給第一個碎片,否則它被分配給第二個碎片(假設我們只有兩個碎片)。這允許我們在單個碎片中驗證交易。但是,如果使用者是惡意的,他可能會建立另一筆具有兩個相同輸入但不同輸出的交易——是的,就是一個雙花交易。第二筆交易將有一個不同的雜湊值,因此,這兩筆交易就可能形成不同的碎片。然後,每個碎片將分別驗證接收到的交易,同時忽略在另一個碎片中驗證的雙花交易。
為了防止雙花問題,在驗證過程中,碎片將不得不進行相互通訊。事實上,由於雙花交易可能會在任何碎片中出現,因此特定碎片所接收到的交易將不得不與其它的碎片進行通訊。而實際上,這種相互之間的通訊可能會破壞交易分片的整個目的。
另一方面,當我們有一個基於賬戶的系統(沒有智慧合約)時,問題就簡單得多了。每一筆交易將會有一個傳送者的地址,然後系統可以根據傳送者的地址分配一個碎片。這確保了兩筆雙花交易將在相同的碎片中得到驗證,因此係統可以很容易地檢測到雙花交易,而不需要進行任何跨碎片的通訊。
狀態分片
狀態分片帶來了新的挑戰。事實上,狀態分片是迄今為止最具挑戰性的分片技術提案。
繼續使用我們的基於賬戶的模型(我們暫時不在我們的例子中引入智慧合約),在一個狀態分片的區塊鏈中,一個特定的碎片只會保留一部分狀態。例如,如果我們有兩個碎片和兩個使用者帳戶,分別為Alice和Bob,那麼每個碎片將保留一個使用者的餘額。
假設Alice建立了一筆交易,她將支付Bob一筆錢。這筆交易將由第一個碎片進行處理,一旦該筆交易被驗證,關於Bob的新餘額的資訊就必須與他所在的碎片進行共享。如果兩個受歡迎的帳戶由不同的碎片進行處理,那麼這可能需要進行頻繁的跨碎片通訊和狀態交換。確保跨碎片通訊不會超過狀態分片的效能收益仍然是一個值得公開的研究問題。
減少跨碎片通訊開銷的一種可能方法,是限制使用者進行跨碎片交易。以我們上面的例子來說,這就意味著系統不允許Alice直接與Bob進行交易。如果Alice必須與Bob交易的話,她將不得不在那塊碎片中佔有一個帳戶。雖然這確實消除了任何跨碎片通訊,但它可能會限制平臺的可用性。
狀態分片的第二個挑戰是資料的可用性。我們可以考慮這樣一個場景,由於某種原因,一些特定的碎片遭到了攻擊而導致其離線。由於碎片並沒有複製系統的全部狀態,所以網路不能再驗證那些依賴於離線碎片的交易。因此,在這樣的情況下區塊鏈基本上是無法使用的。解決此問題的方法是維護存檔或進行節點備份,這樣就能幫助系統進行故障修復以及恢復那些不可用的資料。但是,這樣就使得節點將不得不儲存系統的整個狀態,因此這還可能會引發一些中心化的風險。
我們在任何分片機制(當然不是特定於狀態分片)中需要考慮的另一個要點是,確保碎片在抵禦攻擊和失敗時是具有彈性的; 網路必須接受新的節點並以隨機的方式將這些分配給不同的碎片。換句話說,網路必須在一段時間內進行節點的重新分配。
然而,在狀態分片的情況下,重新分配節點是非常棘手的。由於每個碎片只保留了狀態的一部分,所以在一次重新調整網路的過程中,在同步完成前可能會出現導致使整個系統失效的問題。為了防止系統的中斷,我們必須對網路進行逐步調整,以確保每個碎片在所有節點被清空前仍有足夠多的舊節點。
類似地,一旦一個新節點加入了一個碎片中,系統就必須確保該節點有足夠的時間與碎片狀態進行同步;否則,傳入節點將完全拒絕每一筆交易。
結論
綜上所述,分片技術是區塊鏈的一個令人興奮的技術,他讓我們看到了希望,它可以在不影響去中心化和透明度的情況下解決擴容問題。然而,毫無疑問的是,分片技術,尤其是狀態分片,在設計層面和實現層面都是非常困難的。
我們應該小心的處理分片技術。此外,開發者們還需要做更多的研究來確定狀態分片的可行性,因為它可能不是解決儲存問題的法寶。研究人員和開發者們正在積極尋找那些可替代的解決方案。也許,答案就在我們眼前。
轉自:分片技術