想象一下:你在一個繁忙的廚房裡,廚師們必須等一個人切完蔬菜後,另一個才能開始烤土豆。這聽起來既慢又低效,對吧?這就像計算和區塊鏈中的同步執行:一個任務必須完成後,下一個才能開始。現在,再想象一個協調良好的廚房,每個廚師同時在不同的菜餚部分上工作,準備食材、烹飪和裝盤。這就是異步執行——任務可以併發運行,創造更高效、更快速的工作流程。
在區塊鏈發展過程中,同步可組合性成為熱議話題,因為它似乎能解決以太坊網絡中分散的 Layer 2 系統的整合問題。這種方式解決了用戶體驗(UX)和開發者體驗(DevEx)的問題,比如 Layer 2 之間的簡單轉賬可能會花費 1 美元,並且延遲長達 7 天。Vitalik 參與這些討論,指出並非所有問題都必須依賴普遍的同步性。我們認為,事務執行的有效性並不一定要同步,且同步基礎設施的構建和維護會帶來不小的成本。同步與異步不是非此即彼的選擇,它們可以共存,且未來可能更多地向異步執行轉型。
在區塊鏈技術的擴展性能挑戰中,智能合約的並行執行受到了廣泛關注。儘管多鏈和 Layer-2 系統的出現使得性能有所提升,智能合約的執行仍然受限於單個虛擬機(EVM)的能力。而並行虛擬機提供了一個有前景的解決方案,可以並行處理智能合約的多個交易,充分利用更多 CPU 核心,從而顯著提高性能。
並行中繼執行分佈式架構(PREDA) 是一種面向分佈式多 EVM 區塊鏈系統的高級編程模型,旨在實現智能合約的內在並行化。PREDA 提供了一種新的架構,通過異步執行和可分解性,使得合約功能能夠完全並行化,從而極大地提高交易併發性。這種方法確保所有 EVM 實例的資源都能夠高效利用,實現最佳性能與可擴展性。
在深入探討具體細節之前,讓我們先澄清本文中幾個關鍵術語的含義:
Tx1 = 交易 1
Tx2 = 交易 2
我們假設:
目前最先進的 EVM 並行化方法,如 Sei、Aptos 和 Sui 所實現的那樣,嘗試同步執行每筆交易的所有步驟。想象一下,放大到單筆交易的場景中,在這些系統裡,交易在一個區塊高度內執行完成,無論所涉及的數據依賴(即訪問不同的合約狀態部分)如何分散。因此,如果兩筆交易之間訪問的合約狀態步驟存在共享或更新,它們將被識別為讀寫衝突或寫寫衝突,無法並行執行,從而阻礙系統的整體吞吐量和可擴展性。當鏈上活動突然飆升時,這種情況會顯著惡化。
PREDA 採用了一種不同於上述系統的新穎方法。它引入了一種實現異步可分解性的智能合約執行模型,根據數據訪問依賴將交易的各個步驟分解,從而允許這些步驟異步執行。PREDA 的執行模型實現了更高的效率,並在理論上具備無限的可擴展性。我們將進一步探討 PREDA 如何實現這一點,並展示實驗結果以支持這一論點。
通過吞吐量和可擴展性評估 Sei (V2)、Aptos、Sui 和 PREDA,回放歷史 ETH 代幣轉賬交易。需要注意的是,我們的評估採用了真實世界的歷史 ETH 代幣轉賬交易,而非在隨機地址對之間創建一組轉賬交易。隨機交易會產生明顯高於實際情況的實驗結果,因為真實交易涉及彼此相關的地址,從而引入了大量的數據依賴性。
實驗設置如下:
圖1的比較強調了採用 PREDA 編程模型以實現顯著吞吐量提升的必要性。在以太坊網絡上的真實歷史轉賬交易中,PREDA 的 TPS 比 Aptos 高出 3.3 倍至 28.2 倍。
由於這些系統採用不同的編程語言(包括 Go、Rust 和 C++)及不同的虛擬機實現,我們通過相對於單個 EVM 基線的相對加速比來評估不同系統的可擴展性,以排除不同系統實現所帶來的影響。
圖1. 在 Sei、Aptos、Sui 和 PREDA 上執行的等效代幣轉賬智能合約的絕對吞吐量(TPS)
圖2. Aptos、Sui、Sei 和 PREDA 相對於各自基線的相對加速比
為了幫助熟悉並行 EVM 的讀者理解 PREDA,目前的並行 EVM 區塊鏈系統中存在兩種典型的並行化機制¹:
Optimistic並行化(例如 Aptos、Sei (V2) 和 Monad):忽略交易之間的狀態依賴,同時執行並驗證交易,在發生衝突時回滾交易並重新執行。
悲觀並行化(例如 Solana (Sealevel)、Sui 和 Sei (V1)):在執行之前對每筆交易的狀態依賴進行預檢查,分析其狀態依賴,僅並行執行沒有衝突的交易。
兩種方法均採用共享一切架構(Shared-everything Architecture),在併發控制中將交易視為一個整體;所有步驟(如訪問不同的合約狀態)不可分解,必須同步執行。而 PREDA 模型提出了共享無架構(Shared-nothing Architecture),通過消除狀態依賴,確保不同的 EVM 實例永遠不會訪問同一部分合約狀態,從而完全避免寫入衝突。
PREDA 的核心是引入可編程合約範圍(Programmable Contract Scopes),將合約狀態分解為非重疊、可並行的小塊,以及異步功能中繼(Asynchronous Functional Relay),用來描述跨不同 EVM 的執行流程切換。
為進一步解釋這些概念,在 PREDA 中,合約函數被分解為多個有序步驟,每個步驟依賴於一個沒有衝突的、可並行的狀態片段。用戶發起的交易首先被定向到一個確定性持有該用戶地址狀態的 EVM,例如通過用戶地址到 EVM 的映射方法。在交易執行過程中,執行流程可以通過發起中繼交易,從一個持有所需合約狀態的 EVM 切換到另一個 EVM。這樣,PREDA 通過根據數據依賴將執行流程在 EVM 之間移動,同時保持數據不動。
在每個 EVM 中,用戶發起的交易和中繼交易按順序執行,而不同 EVM 上的交易則因不存在數據依賴而可以並行執行。這種機制避免了基於Optimistic並行化方法中因衝突導致的重執行,也避免了基於悲觀並行化方法中的運行時狀態依賴分析及鎖定/解鎖所帶來的開銷。因此,PREDA 為區塊鏈系統提供了一種並行且共享無的架構,不同於 Solidity 和 Move 中順序且共享一切的架構,這種架構可能會引發顯著的併發控制開銷。
我們將 PREDA 編程模型實現為一種類似於 C/C++ 和 Javascript 的 Algo 風格語言。以下展示了 Solidity 和 PREDA 語言中簡化的代幣轉賬函數。
圖(a)所示的 Solidity 代碼包含一個表示地址餘額的合約狀態(balances)以及一個 transfer 函數,用於將指定數量的代幣從交易發起者(msg.sender)轉給接收者(payee)。
圖(b)展示的 PREDA 實現中,關鍵字 @address 定義了可編程合約範圍,其中屬於合約變量(balance)的狀態按照地址分區,由不同的 EVM 分散管理。關鍵字 relay 標識了一個異步功能中繼。
在 PREDA 的實現中有三個部分:
上圖展示了 PREDA 並行 EVM 系統中代幣轉賬交易的執行流程。Bob 發起一筆調用 transfer 函數的交易,該交易將被引導至託管 Bob 餘額的 EVM,在那裡完成提款操作。之後,發起一筆中繼交易並將其引導至託管 Alice 餘額的 EVM,完成存款操作。並行化通過以下兩種方式實現:
PREDA 標誌著區塊鏈性能,尤其是可擴展性方面的重要進步。通過實現異步可分解性,它能夠高效處理交易,避免傳統同步並行化模型的瓶頸。此方法根據數據依賴將交易分解為微交易,允許併發狀態變更,徹底避免寫入衝突。
PREDA 的通用性不僅限於通過 @address 按地址劃分合約狀態。它還支持使用 @type 等關鍵字自定義劃分類型,其中類型可以是任意 Solidity 基本類型,如 @uint。此外,PREDA 支持使用 @global 聲明未劃分的合約狀態,確保每個 EVM 為此類狀態維護一致的值。這種狀態劃分的靈活性增強了模型在各種智能合約中的適應性和有效性。
我們的實驗表明,PREDA 在吞吐量和可擴展性方面顯著優於其他並行化方法。PREDA 團隊將在後續文章中深入探討我們的研究成果,提供針對不同類型智能合約的更全面比較及對 PREDA 編程模型和語言的詳細分析。請持續關注這些深入探索。
想象一下:你在一個繁忙的廚房裡,廚師們必須等一個人切完蔬菜後,另一個才能開始烤土豆。這聽起來既慢又低效,對吧?這就像計算和區塊鏈中的同步執行:一個任務必須完成後,下一個才能開始。現在,再想象一個協調良好的廚房,每個廚師同時在不同的菜餚部分上工作,準備食材、烹飪和裝盤。這就是異步執行——任務可以併發運行,創造更高效、更快速的工作流程。
在區塊鏈發展過程中,同步可組合性成為熱議話題,因為它似乎能解決以太坊網絡中分散的 Layer 2 系統的整合問題。這種方式解決了用戶體驗(UX)和開發者體驗(DevEx)的問題,比如 Layer 2 之間的簡單轉賬可能會花費 1 美元,並且延遲長達 7 天。Vitalik 參與這些討論,指出並非所有問題都必須依賴普遍的同步性。我們認為,事務執行的有效性並不一定要同步,且同步基礎設施的構建和維護會帶來不小的成本。同步與異步不是非此即彼的選擇,它們可以共存,且未來可能更多地向異步執行轉型。
在區塊鏈技術的擴展性能挑戰中,智能合約的並行執行受到了廣泛關注。儘管多鏈和 Layer-2 系統的出現使得性能有所提升,智能合約的執行仍然受限於單個虛擬機(EVM)的能力。而並行虛擬機提供了一個有前景的解決方案,可以並行處理智能合約的多個交易,充分利用更多 CPU 核心,從而顯著提高性能。
並行中繼執行分佈式架構(PREDA) 是一種面向分佈式多 EVM 區塊鏈系統的高級編程模型,旨在實現智能合約的內在並行化。PREDA 提供了一種新的架構,通過異步執行和可分解性,使得合約功能能夠完全並行化,從而極大地提高交易併發性。這種方法確保所有 EVM 實例的資源都能夠高效利用,實現最佳性能與可擴展性。
在深入探討具體細節之前,讓我們先澄清本文中幾個關鍵術語的含義:
Tx1 = 交易 1
Tx2 = 交易 2
我們假設:
目前最先進的 EVM 並行化方法,如 Sei、Aptos 和 Sui 所實現的那樣,嘗試同步執行每筆交易的所有步驟。想象一下,放大到單筆交易的場景中,在這些系統裡,交易在一個區塊高度內執行完成,無論所涉及的數據依賴(即訪問不同的合約狀態部分)如何分散。因此,如果兩筆交易之間訪問的合約狀態步驟存在共享或更新,它們將被識別為讀寫衝突或寫寫衝突,無法並行執行,從而阻礙系統的整體吞吐量和可擴展性。當鏈上活動突然飆升時,這種情況會顯著惡化。
PREDA 採用了一種不同於上述系統的新穎方法。它引入了一種實現異步可分解性的智能合約執行模型,根據數據訪問依賴將交易的各個步驟分解,從而允許這些步驟異步執行。PREDA 的執行模型實現了更高的效率,並在理論上具備無限的可擴展性。我們將進一步探討 PREDA 如何實現這一點,並展示實驗結果以支持這一論點。
通過吞吐量和可擴展性評估 Sei (V2)、Aptos、Sui 和 PREDA,回放歷史 ETH 代幣轉賬交易。需要注意的是,我們的評估採用了真實世界的歷史 ETH 代幣轉賬交易,而非在隨機地址對之間創建一組轉賬交易。隨機交易會產生明顯高於實際情況的實驗結果,因為真實交易涉及彼此相關的地址,從而引入了大量的數據依賴性。
實驗設置如下:
圖1的比較強調了採用 PREDA 編程模型以實現顯著吞吐量提升的必要性。在以太坊網絡上的真實歷史轉賬交易中,PREDA 的 TPS 比 Aptos 高出 3.3 倍至 28.2 倍。
由於這些系統採用不同的編程語言(包括 Go、Rust 和 C++)及不同的虛擬機實現,我們通過相對於單個 EVM 基線的相對加速比來評估不同系統的可擴展性,以排除不同系統實現所帶來的影響。
圖1. 在 Sei、Aptos、Sui 和 PREDA 上執行的等效代幣轉賬智能合約的絕對吞吐量(TPS)
圖2. Aptos、Sui、Sei 和 PREDA 相對於各自基線的相對加速比
為了幫助熟悉並行 EVM 的讀者理解 PREDA,目前的並行 EVM 區塊鏈系統中存在兩種典型的並行化機制¹:
Optimistic並行化(例如 Aptos、Sei (V2) 和 Monad):忽略交易之間的狀態依賴,同時執行並驗證交易,在發生衝突時回滾交易並重新執行。
悲觀並行化(例如 Solana (Sealevel)、Sui 和 Sei (V1)):在執行之前對每筆交易的狀態依賴進行預檢查,分析其狀態依賴,僅並行執行沒有衝突的交易。
兩種方法均採用共享一切架構(Shared-everything Architecture),在併發控制中將交易視為一個整體;所有步驟(如訪問不同的合約狀態)不可分解,必須同步執行。而 PREDA 模型提出了共享無架構(Shared-nothing Architecture),通過消除狀態依賴,確保不同的 EVM 實例永遠不會訪問同一部分合約狀態,從而完全避免寫入衝突。
PREDA 的核心是引入可編程合約範圍(Programmable Contract Scopes),將合約狀態分解為非重疊、可並行的小塊,以及異步功能中繼(Asynchronous Functional Relay),用來描述跨不同 EVM 的執行流程切換。
為進一步解釋這些概念,在 PREDA 中,合約函數被分解為多個有序步驟,每個步驟依賴於一個沒有衝突的、可並行的狀態片段。用戶發起的交易首先被定向到一個確定性持有該用戶地址狀態的 EVM,例如通過用戶地址到 EVM 的映射方法。在交易執行過程中,執行流程可以通過發起中繼交易,從一個持有所需合約狀態的 EVM 切換到另一個 EVM。這樣,PREDA 通過根據數據依賴將執行流程在 EVM 之間移動,同時保持數據不動。
在每個 EVM 中,用戶發起的交易和中繼交易按順序執行,而不同 EVM 上的交易則因不存在數據依賴而可以並行執行。這種機制避免了基於Optimistic並行化方法中因衝突導致的重執行,也避免了基於悲觀並行化方法中的運行時狀態依賴分析及鎖定/解鎖所帶來的開銷。因此,PREDA 為區塊鏈系統提供了一種並行且共享無的架構,不同於 Solidity 和 Move 中順序且共享一切的架構,這種架構可能會引發顯著的併發控制開銷。
我們將 PREDA 編程模型實現為一種類似於 C/C++ 和 Javascript 的 Algo 風格語言。以下展示了 Solidity 和 PREDA 語言中簡化的代幣轉賬函數。
圖(a)所示的 Solidity 代碼包含一個表示地址餘額的合約狀態(balances)以及一個 transfer 函數,用於將指定數量的代幣從交易發起者(msg.sender)轉給接收者(payee)。
圖(b)展示的 PREDA 實現中,關鍵字 @address 定義了可編程合約範圍,其中屬於合約變量(balance)的狀態按照地址分區,由不同的 EVM 分散管理。關鍵字 relay 標識了一個異步功能中繼。
在 PREDA 的實現中有三個部分:
上圖展示了 PREDA 並行 EVM 系統中代幣轉賬交易的執行流程。Bob 發起一筆調用 transfer 函數的交易,該交易將被引導至託管 Bob 餘額的 EVM,在那裡完成提款操作。之後,發起一筆中繼交易並將其引導至託管 Alice 餘額的 EVM,完成存款操作。並行化通過以下兩種方式實現:
PREDA 標誌著區塊鏈性能,尤其是可擴展性方面的重要進步。通過實現異步可分解性,它能夠高效處理交易,避免傳統同步並行化模型的瓶頸。此方法根據數據依賴將交易分解為微交易,允許併發狀態變更,徹底避免寫入衝突。
PREDA 的通用性不僅限於通過 @address 按地址劃分合約狀態。它還支持使用 @type 等關鍵字自定義劃分類型,其中類型可以是任意 Solidity 基本類型,如 @uint。此外,PREDA 支持使用 @global 聲明未劃分的合約狀態,確保每個 EVM 為此類狀態維護一致的值。這種狀態劃分的靈活性增強了模型在各種智能合約中的適應性和有效性。
我們的實驗表明,PREDA 在吞吐量和可擴展性方面顯著優於其他並行化方法。PREDA 團隊將在後續文章中深入探討我們的研究成果,提供針對不同類型智能合約的更全面比較及對 PREDA 編程模型和語言的詳細分析。請持續關注這些深入探索。