智能合約中的並發性和並行性

以太坊很慢——極其緩慢。最近做一個簡單的USDC審批交易,大概花了3個小時進行驗證。這裡有一個更有啟發性的統計數據:以太坊平均每10~20秒發布一個區塊。每個區塊包含少於350個交易。所有這些大致轉換為每秒30個交易。當批評以太坊的緩慢時,Visa的2000 tps經常被提起。也許這是一個不公平的比較,因為以太坊仍處於開發階段。然而,以太坊似乎不太可能在短期內主宰數字金融。

以太坊的低吞吐量是一個基礎性問題。以太坊是一個基於賬戶的區塊鏈:賬本狀態被定義為一個從賬戶地址到一段數據的鍵值映射。簡單的ETH交易(價值轉移)可以實現賬戶對ETH餘額數據的增減。同樣,更複雜的交易(合約調用)將改變指定帳戶的數據。在這種情況下,以太坊交易是全球賬本狀態的轉換函數。這就是讓以太坊虛擬機(EVM)圖靈完成並允許智能合約成為可能的原因;以太坊智能合約本質上是一個可交互的賬戶數據。

現在讓我們看看EVM如何處理或驗證這些交易。並行處理所有交易是不合理的。按照設計,所有交易都試圖改變整個全局狀態。如果交易並行運行,EVM將偏向於競態條件:兩個程序(在本例中是交易)嘗試並行地增加uint變量。因為兩個程序同時訪問變量,所以變量只增加一次而不是兩次。為了解決此類並發bug,以太坊選擇逐個處理交易。換句話說,EVM是一個單線程狀態機。因此,以太坊實現了Concurrency(並發),而不是Parallelism(並行)。

以太坊類似於只有一個出納員的票務隊列,其處理時間不一致。排隊的人是等待驗證的交易,唯一的出納員是虛擬機。當我們考慮到gas費用時,事情就變得更加複雜了。現在,任何人都可以額外付費插隊。超長的隊伍意味著那些不能花錢買到更好位置的人將不得不等待過多的時間來處理他們的票。

以太坊的低吞吐量是個問題,尤其是從web3.0的角度來看。以太坊確實成為了所有web應用程序的媒介。如果它目前的吞吐量持續下去,像為Reddit上的一篇帖子加贊這樣微不足道的任務可能需要超過兩個小時的時間來處理。我們生活在一個速度決定一切的時代,以太坊太慢了。

可能會問,為什麼不選擇性地應用並發性呢?更詳細地說,為什麼不將並發應用到衝突的交易上——例如,將價值轉移到同一個帳戶上——並並行處理其餘的交易。不幸的是,Saraph和Herlihy已經向我們表明,所實現的加速充其量是適度的。

已經提出了許多加速以太坊並提高其可擴展性的解決方案。最近的EIP-1559——倫敦硬分叉——並不直接影響以太坊的交易速度,但理論上應該通過減少普通用戶在交易處理前必須等待的潛在區塊數量來穩定其在大規模交易峰值上的波動。然後是L2的rollup,這應該會直接影響以太坊的吞吐量,而不會破壞區塊鏈寶貴的去信任。

與此同時,其他模擬通用虛擬機的區塊鏈也在積極開發中。有些已經成功實現了並行,承諾吞吐量遠高於以太坊的30 tps。特別關注Algorand、Solana和Cardano,以及他們在智能合約中實現並行化的獨特方法。

來源:https://medium.com/coinmonks/concurrency-and-parallelism-in-smart-contracts-part-1-10e8f6ecfa12

Total
0
Shares
Related Posts