原文標題:《智能合約中的并發性和并行性》
撰文:Doyun Kim
編譯:ChinaDeFi
以太坊很慢——極其緩慢。最近做一個簡單的 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,以及他們在智能合約中實現并行化的獨特方法。