天天看點

「密碼學探秘」EVM鍊和并行執行交易

作者:PlatON技術團隊

概述

在web3.0世界中,交易的處理性能一直是公鍊面臨的一大技術挑戰,如何在不降低安全性和去中心化程度的前提下顯著的提升區塊鍊交易的TPS無疑成為衆多公鍊技術專家追逐的目标。以Solana、Aptos為代表的新一代公鍊的出現更是吹響了通過并行執行交易來攻克公鍊可擴充性瓶頸的号角。

以太坊虛拟機因其最早在區塊鍊中引入智能合約,不僅擁有最多的DApp開發者,更有衆多新生公鍊直接将EVM采用作為其智能合約交易執行引擎,其在web3.0中的受歡迎程度可見一斑,然而受限于順序執行(Sequential Execution)EVM無疑在擴充性方面廣受诟病。

是否也可以既做到對EVM的相容,又可以通過并行執行交易來達到提升性能的目的呢?今天我們就來對這個話題做一些探讨。

EVM交易執行機制

衆所周知,EVM中交易的執行實際上是狀态的轉換,交易執行前的狀态 σt和交易transaction作為EVM的輸入,輸出為交易執行後的狀态σt+1為輸出:

「密碼學探秘」EVM鍊和并行執行交易

要說明的是,每個交易執行前的狀态 σt 和執行後的狀态 σt+1 都是‘世界狀态’,也就是整個賬本所有賬戶的實時狀态(如balance、nonce、storageroot等),這種賬戶模型在一定程度上友善了實際應用的開發,但由于每筆交易的執行都需要依賴一個确定的’世界狀态‘,這也給可擴充性帶來諸多限制,正是因為這一點,EVM-based鍊鮮有通過并行執行交易提升TPS的案例。

并行執行的挑戰

基于這種賬戶模型,想要通過并行執行重複利用節點的硬體資源提高網絡吞吐量是很困難的。舉個簡單的例子:A轉賬給B的交易tx1和C轉賬給D的交易tx2在理論上是可以并行執行的,因為兩個交易沒有任何關聯,但如果将tx2調整為B轉賬給C情況會是怎麼樣呢?假如最初B的餘額是0,tx1中A轉給B5個Token,tx2中B轉給C3個Token,我們會發現,tx1沒有執行前tx2注定會失敗,因為B此時的狀态是餘額不足。這種情況在鍊上被稱為’狀态沖突‘(State conflicts)

當然,對于隻做轉賬的交易,是可以通過靜态分析來确定交易彼此的依賴關系的,事實上,DApp開發者們經常通過複雜的智能合約邏輯在EVM虛機中實作某些特殊的業務需求,在一個智能合約交易中,EVM會根據合約的Code邏輯執行使用者千奇百怪的操作,這就不能通過簡單的對交易内容分析來确定交易間的依賴關系了。

「密碼學探秘」EVM鍊和并行執行交易

可嘗試的改進

Solidity被稱為圖靈完備的智能合約語言,通過對交易指令集的靜态分析來确定交易依賴關系的可行性基本是不存在的,但這并不意味着我們隻能按順序執行,我們可以從近期一些優秀的區塊鍊項目中得到更多啟發。

樂觀執行是一種可嘗試的方案

既然不能事先分析交易的關聯關系, 那我們是否可以先樂觀的将交易全部獨立執行,然後再事後分析呢?

Aptos項目的PE(parallel execution) 方案便是這種思路的代表,根據項目方公布的資料,在低關聯交易集合的場景(low inter-dependence),交易的執行效率最高可以是串行執行的16倍之多。

EVM中雖然沒有類似Block-STM的機制,但我們完全可以通過對區塊中交易的執行邏輯稍加優化就可以做到既和EVM保持相容,又能支援将明顯無關的交易分成不同批次進行支援,即:可以先根據交易發送方和接受方賬戶位址将交易依賴關系建構成可逐批執行的交易集合,樂觀的在不同的線程(或協程)中獨立執行,等所有交易都被執行完以後,再将執行過程中使用的讀集(所有用到的狀态變量)和寫集(所有由交易産生的需要記錄到鍊上的結果)做對比分析,檢查交易序号(區塊中的交易順序編号)靠後的交易的讀集是否與交易序号靠前的所有交易寫集有交集,如果沒有,說明執行結果是正确的, 否則意味着該交易需要依賴之前交易的最新狀态, 需要根據前面交易的結果重新執行。

「密碼學探秘」EVM鍊和并行執行交易

由使用者指定交易的讀寫集

普通的轉賬交易可以簡單的通過 from 和 to 确定交易彼此的依賴關系,而智能合約交易雖然在EVM執行它之前不能确定其對哪些賬戶有依賴,但發送交易的使用者多數情況下是可以确定交易的讀寫集的,而Sui項目正是将交易的依賴和結果完全交由使用者來指定并最終簽名确定,這将極大的簡化了分析交易關聯性的邏輯。

然而EVM現在并沒有這種機制,雖然 Vitalik 和 Holiman 送出的關于指定交易通路lists的提案 [EIP-2930](EIPs/eip-2930.md at master · ethereum/EIPs · GitHub) 已經在以太坊上通過并實施,但該提案并沒有強制要求使用者必須指定所有的access lists, 如果要在EVM中實作使用者指定讀寫集,需要在以太坊送出新的EIP提案,除此之外,使用者确定讀寫集還需要SDK的支援。

通過DAG建構交易的依賴關系

對于單純的轉賬交易或是上面提到的由使用者指定了讀集的交易,是完全可以事先确定交易的依賴關系的,有向無環圖(Directed Acyclic Graph)可以有效的解析這種依賴關系。

關于如何使用DAG分批并行執行交易的内容可以參見我們之前的技術文章。

一些要思考的問題

  • EVM 架構适合并行執行嗎?

雖然并行執行可以做到有效利用硬體資源,提升鍊處理交易的能力,但正如我們在開頭提到的這絕不能以犧牲安全性和去中心化程度為代價,Ilya Sergey 就曾經在 EVM 技術架構基礎上對并行執行做過深入的研究,根據其研究的結論,對于非垃圾回收類語言,對象在記憶體中的重複聲明和使用過程必然會違反狀态完整性,這給形式化驗證智能合約帶來巨大的挑戰。這或許是 EVM 設計者在最初的設計中沒有考慮到的問題。

  • 公鍊适合處理海量的交易嗎?

公鍊是公衆基礎設施,其使用者可以是任何人或團體,不可否認的是它處理能力越強越好, 然而這并不意味着任何交易都需要上鍊,雖然 gas 機制可以減少垃圾資料上鍊的可能性,但随着節點處理交易能力的提升, 礦工為了增加收入必然會打包盡可能多的交易,這将必然使gas價格越來越低,鍊上将不可避免的充斥着大量垃圾資料,這将使賬本資料越來越膨脹,到難以維護的程度。

  • 過度依賴硬體資源将使網絡去中心化程度降低

通過提升CPU核心數可以做到高交易處理性能,增加磁盤容量可以存儲更多資料,這将不斷提升節點的運作維護成本,最終導緻的結果必然是隻有少數人或團體有能力支付這些成本,不利于去中心化。