作者:Ali Sheikh,加密分析師;翻譯:金色財經xiaozou
本文將概述區塊鏈的平行設計架構,借用三個相關範例:Solana、Sei和Monad。本文強調樂觀並行和確定性並行之間的區別,並了解這些鏈上的狀態和記憶體存取的細微差別。
1、前言
1837年,計算機科學家和數學家Charles Babbage(查爾斯·巴貝奇)設計了“Analytical Engine(分析機)”,為平行計算奠定了理論基礎。如今,並行化是加密世界的關鍵主題,區塊鏈正試圖擴展處理、效率和吞吐量的邊界。
並行計算使許多計算或進程能夠同時執行,而不是必須按順序或一個接一個地執行計算。平行計算指的是將較大的問題分解成多個較小的獨立部分,這些部分可以由多個透過共享記憶體進行通訊的處理器來執行。平行系統具有許多優點,例如提高效率和速度、可擴展性、改進可靠性和容錯性、優化資源利用率以及處理超大資料集的能力。
然而,認識並行化的效力取決於底層體系結構和實現的細節是至關重要的。區塊鏈的兩個核心瓶頸是加密功能(雜湊函數、簽名、橢圓曲線等)和記憶體/狀態存取。對於區塊鏈來說,設計高效並行系統的關鍵組件之一在於狀態存取的細微差別。狀態存取是指交易讀取和寫入區塊鏈狀態的能力,包括儲存、智慧合約和帳戶餘額。為了使並行區塊鏈有效且具有高效能,必須優化狀態存取。
目前在優化並行化區塊鏈的狀態存取方面有兩個思想流派:確定性並行和樂觀並行。確定性並行要求程式碼明確地預先聲明區塊鏈狀態的哪些部分將被存取和修改。這讓系統可以事先確定哪些交易是可以並行處理的,而不會發生衝突。確定性並行支援可預測性和高效率(特別是在大部分獨立交易的情況下)。然而,它確實為開發人員帶來了更多的複雜性。
樂觀並行不需要程式碼預先聲明其狀態存取就可並行處理交易,就好像不會發生衝突一樣。如果出現衝突,樂觀並行將重新運行、重新處理或串行運行衝突交易。雖然樂觀並行化為開發人員提供了更大的靈活性,但衝突需要重新執行,因此當事務不衝突時,這種方法是最有效的。至於哪一種方法比較好,還沒有正確答案。它們只是實現並行化的兩種不同的可行方法。
以下我們先來探索非加密平行系統相關的一些基礎知識,然後再來看區塊鏈並行執行的設計空間,我們將重點放在三個核心領域:加密並行系統概述、記憶體和狀態存取方法以及平行設計機會。
2、非加密平行系統
透過我們剛剛了解到的關於平行計算的功能和平行系統的優勢,現在就很容易理解為什麼平行計算的採用在最近幾年開始流行起來。而且在過去的幾十年裡,並行計算就已呈現日益流行之勢並實現了許多突破。
-
醫學影像:平行處理從根本上改變了醫學影像,帶來各種影像模式(如MRI、CT、X射線和光學斷層掃描)的速度和解析度的顯著提高。英偉達處於這些進步的最前沿,透過其平行處理工具包為放射科醫生提供更強大的人工智慧功能,使影像系統能夠更有效地處理更多的數據和計算負載。
-
天文學:一些新的天文現象,例如對黑洞的理解,只有使用平行超級電腦才能實現。
-
Unity遊戲引擎:Unity引擎使用GPU能力(專為大規模圖形工作負載建構)以幫助提高效能和速度。該引擎配備了多執行緒和平行處理功能,帶來無縫的遊戲體驗,能夠創造複雜逼真的遊戲環境。
讓我們來看看三個已部署並行執行環境的區塊鏈。首先,我們來看Solana,然後是兩個基於EVM的鏈——Monad和Sei。
3.並行設計概述
(1)Solana
從高層來看,Solan的設計理念是區塊鏈創新應隨著硬體進步而發展。隨著時間的推移,硬體根據摩爾定律不斷改進,Solana的設計將受益於性能和可擴展性的提高。 Solana聯合創辦人Anatoly Yakovenko在五年多前就設計了Solana的最初並行架構,今天,並行性作為區塊鏈設計原則正迅速傳播開來。
Solana使用確定性並行方式,這來自於Anatoly過去處理嵌入式系統的經驗,在嵌入式系統中,通常會預先聲明所有狀態。這使CPU能夠知道所有的依賴關係,從而使它能夠預先載入記憶體的必要部分。結果就是優化了系統執行,但再一次,它要求開發人員預先做好額外的工作。在Solana上,程式的所有記憶體依賴都是必需的,並在建置的交易(即存取清單)中進行聲明,從而使運行時(runtime)能夠高效地調度及並行執行多個交易。
Solana架構的下一個主要元件是Sealevel VM,它是Solana的平行智慧合約運行時。 Sealevel原生支援基於驗證者的核心數量並行處理多個合約和交易。區塊鏈中的驗證者是負責驗證交易、提議新區塊以及維護區塊鏈完整性和安全性的網路參與者。由於交易預先聲明哪些帳戶需要讀寫鎖定,因此Solana調度器能夠決定哪些交易可以並行執行。正因如此,當涉及驗證時,「區塊生產者」或Leader就能夠對數千個待處理交易進行排序,並且並行調度非重疊交易。
Solana的最後一個設計元素是「pipelining」。當需要以一系列步驟處理數據,並且每個步驟由不同的硬體負責時,就會觸發pipelining。這裡的關鍵想法是獲取需要串行運行的數據,並使用pipelining將其並行化。這些pipelines可以並行運行,並且每個pipeline階段可以處理不同的交易包。
這些優化允許Sealevel同時組織和執行獨立的交易,利用硬體的能力,一次使用一個程式處理多個資料點。 Sealevel按programID對指令進行排序,並在所有相關帳戶上並行執行相同指令。
透過這些創新,我們可以看到Solana被有意設計為支持並行化。
(2)Sei
Sei是一個通用的、開源L1區塊鏈,專用於數位資產交易。 Sei V2採用樂觀並行方法,因此,它對開發人員來說更友善。在樂觀並行模式下,智慧合約可以更無縫地並行執行,不需要開發人員預先聲明它們的資源。這意味著鏈樂觀地並行運行所有交易。儘管如此,當發生衝突時(即多個交易存取相同的狀態),區塊鏈將追蹤每個衝突交易所影響的特定儲存組件。
Sei區塊鏈使用「樂觀並發控制(OCC)」機制來執行交易。並發交易處理發生在有多個交易同時在系統中活動時。這種交易方式有兩個階段:執行和驗證。
在執行階段,交易被樂觀地處理,將所有讀取/寫入暫時儲存在特定交易儲存中。此後,每個交易都將進入驗證階段,在驗證階段,臨時儲存操作中的資訊將根據先前交易所做的狀態變更進行檢查。如果交易是獨立的,則交易將並行運行。如果一個交易讀取的資料被另一個交易修改過,將會產生衝突。 Sei的平行系統將透過比較交易的讀取資料集與多版本儲存中的最新狀態變更(這些變更是按交易順序索引的)來識別每個衝突。 Sei將在出現衝突的位置重新執行並重新驗證實例。這是一個迭代過程,涉及執行、驗證和重新運行,才能修復衝突。下圖說明了當出現衝突時Sei是如何處理交易的。
Sei的實現為EVM開發人員提供了更低的gas費和更廣闊的設計空間。一直以來,EVM環境被限制為小於50 TPS,這迫使開發人員創建遵循反模式的應用程式。 Sei V2讓開發人員能夠接近通常要求高效能和低費用的領域,如DeFi、DePIN和遊戲。
(3)Monad
Monad正在建立一個具有完全字節碼相容性的並行EVM L1。 Monad的獨特之處不僅在於它的平行引擎,還在於他們在底層建造的優化引擎。 Monad採用了一種獨特的整體設計方法,結合了幾個關鍵特性,如pipelining、非同步I/O、共識執行分離,以及MonadDB。
Monad設計的一個關鍵創新是帶有輕微偏移量的pipelining。偏移量允許透過同時運行多個實例來並行化更多進程。因此,pipelining被用來優化許多功能,如狀態存取pipeling、交易執行pipelining、共識和執行內部pipelining以及共識機制自身內的pipelining。
接下來,我們將具體來看Monad的平行化部分。在Monad中,交易在區塊內是線性排序的,但目標是透過利用並行執行更快地達到最終狀態。 Monad的執行引擎設計採用了樂觀並行演算法。 Monad的引擎同時處理交易,然後執行分析,以確保如果交易被一個接一個地執行,也將取得相同的結果。如果存在任何衝突,則需要重新執行。這裡的平行執行是一個相對簡單的演算法,但將它與Monad的其他關鍵創新結合起來,就讓這種方法變得新穎了。這裡要注意的一點是,即使發生重新執行,通常也很便宜,因為無效交易所需的輸入幾乎一直保留在快取中,所以這將是一個簡單的快取查找。重新執行被確保一定會成功,因為你已經執行了區塊中先前的交易。
Monad也透過分離執行和共識(類似於Solana和Sei)以及延遲執行來提高效能。其中的想法是,如果你放寬執行條件,以便在達成共識之前完成執行,則可以並行運行執行和共識,從而為兩者增加額外的時間。當然,Monad使用確定性演算法來處理這種情況,以確保其中的一個不會跑得太遠而失控。
4.狀態存取和記憶體的獨特方法
正如我在本文開頭所提到的,狀態存取是區塊鏈的典型效能瓶頸之一。狀態存取和記憶體的設計選擇最終可以決定並行系統的特定實作是否會在實踐中提高效能。下面我們來具體了解並比較Solana、Sei和Monad所採用的不同方法。
(1)Solana狀態存取:AccountsDB / Cloudbreak
Solana利用水平擴展來跨多個SSD設備分發和管理狀態資料。如今,許多區塊鏈使用通用資料庫(即LevelDB),這在處理大量並發讀寫狀態資料方面存在限制。為了避免這種情況,Solana利用Cloudbreak建立了自己的自訂帳戶資料庫。
Cloudbreak是為跨I/O操作的平行存取而設計的,而非單純依賴RAM,本身就很快。 I/O操作(輸入/輸出)是指從外部來源(如磁碟、網路或週邊設備)讀取資料或向其寫入資料的操作。最初,Cloudbreak使用RAM內部索引將公鑰對應到持有餘額和資料的帳戶。然而,在撰寫本文時,V1.9索引已經從RAM移到了SSD上。這種轉變允許Cloudbreak在其佇列中同時處理32個(I/O)操作,從而增強了跨多個SSD的吞吐量。因此,可以有效地存取區塊鏈數據,例如帳戶和交易,就像在使用記憶體映射檔案的RAM中一樣。下圖顯示了記憶體結構。雖然RAM更快,但它的容量比SSD小,而且通常更昂貴:
透過橫向擴展和跨多個裝置分發狀態數據,Cloudbreak降低了延遲,提高了Solana生態系統的效率、去中心化程度和網路彈性。
(2)Sei狀態存取:SeiDB
Sei重新設計了它的存儲——SeiDB——以解決以下幾個問題:寫入放大(維護數據結構需要多少元數據,越小越好)、狀態膨脹、操作緩慢以及性能隨著時間的推移而下降。新的再設計現分為兩個組件:狀態儲存和狀態承諾。記錄和驗證對資料的任何變更由狀態承諾處理,而在任何時候記錄所有資料的資料庫由狀態儲存(SS)處理。
在Sei V2中,狀態承諾使用記憶體映射IAVL樹架構(MemIAVL)。記憶體映射IAVL樹儲存較少元數據,這減少了狀態儲存和狀態同步時間,並使運行完整節點變得更加容易。記憶體映射IAVL樹表示為磁碟上的三個檔案(kv檔案、branch檔案和leaf檔案);因此,需要追蹤的元資料更少,這有助於將狀態儲存減少50%以上。新的MemIAVL結構有助於減少寫入放大因子,因為它減少了維護資料結構所需的元資料。
更新後的SeiDB允許對狀態儲存層提供靈活的資料庫後端支援。 Sei認為,不同的節點業者的需求和儲存需求不同。因此,SS設計是為了適應不同的後端需求,為營運商提供自由度和靈活性,如PebbleDB、RocksDB、SQLite等。
(3)Monad狀態存取:MonadDB
Monad的狀態存取有一些重要的細微差別。首先,大多數以太坊用戶端利用兩種類型的資料庫:B-Tree資料庫(即LMDB)或日誌結構合併樹(LSM)資料庫(即RocksDB、LevelDB)。這兩種都是通用的資料結構,不是為區塊鏈專門設計的。此外,這些資料庫沒有利用Linux技術的最新進展,特別是在非同步操作和I/O最佳化方面。最後,以太坊本身使用MPT樹管理狀態,MPT樹專用於加密,驗證和證明。主要的問題是,客戶端必須將這個特定的MPT樹整合到更通用的資料庫(即B-Tree / LSM)中,這會帶來嚴重的效能缺陷,例如過多的磁碟存取。
所有這些都有助於為Monad決定創建自訂MonadDB資料庫奠定基礎,MonadDB資料庫專用於更有效率地處理區塊鏈資料和狀態存取。 MonadDB的一些關鍵特性包括並行存取資料庫、針對Merkle Trie資料最佳化的自訂資料庫、優於標準RAM所使用的高效能狀態存取、去中心化特性和可擴展性。
MonadDB專為區塊鏈設計,使其比使用通用資料庫的效能更高。自訂MonadDB專用於高效管理Merkle Trie類型數據,支援同時並行存取多個Trie節點。雖然MonadDB與上述一些通用資料庫的單次讀取成本是相同的,但MonadDB的關鍵特性是它可以並行運行多個讀取,從而帶來巨大提速。
MonadDB支援對平行存取資料庫的同步狀態存取。因為Monad是從頭開始建立這個資料庫的,所以它能夠利用最新的Linux核心技術和SSD的全部功能來實現非同步I/O。使用非同步I/O,如果一個交易需要從磁碟讀取狀態,這不應該為待完成操作帶來阻力。相反,它應該立刻開始讀取並同時繼續處理其他交易。這就是非同步I/O顯著加快MonadDB處理速度的做法。 Monad能夠透過優化SSD使用以及減少對過多RAM的依賴,收穫更好的硬體效能。這具有與去中心化和可擴展性對齊的額外好處。
5、結論
總之,透過Solana、Sei和Monad的視角來探索區塊鏈中的平行化發展,可以全面了解不同架構和方法是如何提高效能和可擴展性的。 Solana的確定性並行注重預先聲明狀態訪問,提供了可預測性和效率,使其成為高吞吐量需求的應用程式的有力選擇。另一方面,Sei的樂觀並行方法優先考慮了開發人員的靈活性,非常適合交易衝突不頻繁的環境。憑藉其獨特的樂觀並行方式和自訂MonadDB,Monad提供了一個創新解決方案,利用最新的技術進步來優化狀態存取和效能。
每個區塊鏈都提供了一種獨特的方法來解決平行化挑戰,並有一套自己的優缺點權衡。 Solana的設計旨在最大限度地提高硬體利用率和吞吐量,而Sei則專注於簡化開發過程,Monad則把重心放在了為區塊鏈資料提供量身定制的資料庫解決方案。這些差異凸顯了區塊鏈生態系統的多樣性,以及根據應用程式的特定需求選擇合適平台的重要性。
隨著區塊鏈領域的不斷發展,Solana、Monad和Sei所展現的平行化技術的進步無疑將激發進一步的創新。邁向更有效率、更可擴展且對開發人員更友善的區塊鏈的旅程正在進行中,從這些平台中吸取的經驗將對塑造區塊鏈技術的未來發揮至關重要的作用。