簡析以太坊 Layer 2 技術方案及擴容特性

原文標題:《L2 – 理解和思考》

撰文:Star Li

Layer2 是個大的話題。是否去中心化,是否安全,資金狀態確認時間是 Layer2 的主要的討論話題。最近有點時間,總結一下 Layer2 的理解和思考。

Layer2 交互模型

Layer2,相對于 Layer1,在 Layer1 的基礎上提供更豐富功能,更好的用戶體驗,抽象一下 Layer2 的邏輯以及交互模型如下:

除了 Layer1 的交易外(入金),其他 Layer2 的交易都在 Layer2 執行,為了 Layer2 在必要時恢復交易狀態,所有 Layer2 的交易數據需要安全存儲。簡單起見,也為了和 Layer1 保持一樣的安全性,所有 Layer2 的交易數據一般存儲在 Layer1。這種交易數據的隨時可訪問,稱為 「Data Availability」(數據可用性)。所有的 Layer2 交易都在 Layer2 執行,并同步到 Layer1,如何證明 Layer2 同步的狀態正確,不同的 layer2 方案有不同的實現方法,

Layer2 實現分類

從 Layer2 狀態同步方式,Layer2 分為兩類:一類是側鏈實現(Side Chain),一類是 Rollup,側鏈,就是通過不同于 Layer1 的共識進行 Layer2 狀態向 Layer1 的同步,僅從這一點,整個側鏈的安全性,就降低到 Layer2 的共識的安全性,Rollup 又分為兩種:一種是 zkRollup,一種是 Optimistic Rollup。所謂 Optimistic Rollup,樂觀性 Rollup,期望絕大多數情況下 Rollup 正確向 Layer1 同步狀態。同時,為了防止同步錯誤的狀態,提供了挑戰機制,樂觀預計挑戰的機率比較小,在需要挑戰的情況下,Layer1 可以判斷正確狀態。zkRollup 是最直接的狀態同步方式,通過零知識證明技術,在向 Layer1 提交狀態的同時提供狀態變化的證明,Layer 實現分類如下:

zkRollup,按照采用的零知識證明協議又分為三類:1/ Groth16 2/ PLONK 3/ STARK。Groth16 協議需要針對每一個電路進行初始設置 (Trusted Setup),PLONK 協議在一定規模下的電路只需要一次初始設置。STARK 協議不需要初始設置,但是,相對另外兩種算法,STARK 協議,證明數據量大,驗證時間長。相對來說,在 Layer2 的場景下,PLONK 是目前廣泛使用的算法。

STARK 協議和 SNARK(Groth16/PLONK) 協議比較(來源于 Matter Labs 的 github 鏈接):

https://github.com/matter-labs/awesome-zero-knowledge-proofs

總結一下,從安全性角度看,各種 Layer2 的排序如下:zkRollup,optimistic Rollup,側鏈。從提現的時間也印證了安全性,zkRollup 的提現是分鐘級別,其他兩種方案,小時甚至是天級別,zkSync 是比較完善的 zkRollup 開源項目zkRollup,雖好,目前存在很大的缺陷:可編程性差。

細看 zkRollup

相對其他 Rollup 方案,zkRollup 方案多了 zk 證明系統,也就是說,在 Layer2 每個交易除了「執行」外,還需要生成證明,證明執行過程的正確性。熟悉零知識證明技術的小伙伴都知道,零知識證明的安全性在于「電路」的安全性,對于 Layer2,每種交易的處理「固化」為電路,電路邏輯完全公開,對應于每種電路,存在唯一的驗證秘鑰。驗證秘鑰用在 Layer1 驗證狀態證明。通過驗證的狀態證明,符合固化電路的邏輯,

關鍵就在于 Layer2 交易的執行和固化電路語義是否一致。公開電路就是一種共識方式,供所有人查閱電路邏輯,簡單的說,為了實現 zkRollup,需要實現 Layer2 執行對應的電路。事實上,電路的實現相對復雜,沒有高級語言,很多情況下都是手寫 R1CS,進一步,為了利用 zk 證明系統,為了優化電路的實現,整個 Layer2 的狀態經常優化為電路友好結構(merkle 樹),所以,zkRollup 的系統需要考慮電路的結構,從而約束了 Layer2 交易以及賬戶模型,細心的小伙伴可以發現,不管是 zksync/zkswap/loopring,都只實現了特定交易場景,

反過來說,如果需要通過 zkRollup 支持 EVM 的交易執行,需要將 EVM 的交易抽象成電路友好的賬戶模型。這種抽象并不容易,再者,EVM 的描述電路可以預見比較大,從零知識證明的性能看,這方面會限制整個 zkRollup 的性能。

再看看 zkRollup 方案在 Layer1 的 gas 消耗,整個 zkRollup 方案的主要 gas 消耗為三部分(withdraw 不考慮在內):

  • Transaction Raw Data:在 zksync 中稱為 pub data。為了保證 data availability,所有的 Layer2 的交易都會以裸數據的形式提交到 Layer1,
  • Layer2 Block 管理:在 Layer2 提交區塊狀態時,Layer1 維護著 Layer2 的區塊結構和狀態。
  • 驗證 Layer2 Block 狀態:在 Layer2 提交證明時,Layer1 需要驗證狀態證明。

以一個區塊 350 筆交易,每個交易的 Transaction Raw Data 的大小為 20 字節為例,一個區塊處理的 gas 消耗:

雖然上述的數據不是精確值,但是足以說明交易原始數據在整個 zkRollup 方案中的 gas 消耗占比是非常高的,從這個角度看,Layer2 的有些項目選擇通過其他鏈下的方式存儲交易數據,

Optimism vs. Arbitrum

Optimistic Rollup 兼容 EVM。也就是說,Layer2 支持可編程性,并且在以太坊上的程式幾乎無縫遷移。為了保證鏈上的狀態正確,這兩種方案都提供一段時間內的挑戰機制。挑戰者提供挑戰的證據,Layer1 抉擇正確與否,

Optimism 采用 OVM 執行 Layer2 交易。取名 OVM 是為了區分 Layer1 的 EVM,因為提交到 Layer1 的狀態需要檢驗正確性,Layer1 需要「重放」Layer2 的交易,也就是說,Layer1 在有些情況下需要執行 OVM 交易的執行。Optimistic Rollup 最復雜的地方也在于此,用 EVM 模擬 OVM,并執行 Layer2 的交易,可想而知,在 Layer1 的 EVM 模擬 OVM 的執行是比較繁瑣,消耗較大的操作,

Arbitrum 也是采用挑戰機制,為了避免挑戰的 gas 費用低,Arbitrum 引入了 AVM:

相對于 EVM,AVM 是一個相對簡單的虛擬機。Arbitrum 在 AVM 虛擬機上模擬 EVM 執行環境,也就是說,所有的 Layer2 交易都是在 AVM 執行,交易的執行狀態可以用 AVM 狀態表示。在提交到 Layer1 的狀態有分歧時,挑戰雙方(Asserter 和 Challenger)先將狀態分割,找出「分歧點」。明確分歧點后,挑戰雙方都可提供執行環境,Layer1 執行相關操作確定之前提交的狀態是否正確,在 Layer1 挑戰的是 AVM 的狀態,分歧點的 AVM 的指令執行。

簡單的說,為了省挑戰的 gas 費用,Arbitrum 采用了精簡的 AVM (非常方便狀態表示),通過快速分割,在鏈上只需要執行一個指令,判斷狀態是否執行正確,Arbitrum 介紹文檔中提到,整個挑戰需要大概 500 字節的數據和 9w 左右的 gas。在 AVM 的基礎上,Arbitrum 設計了 mini 語言和編譯器,模擬了 EVM 的執行環境,從而兼容 EVM。

總結

Layer2,相對于 Layer1,在 Layer1 的基礎上提供更豐富功能,更好的用戶體驗。資金狀態確定性時長,安全性,可編程性是目前討論的焦點,zkRollup 是資金狀態確定性最快的方案。optimistic Rollup/ 側鏈具有可編程性。zkRollup 支持 EVM 的證明是個期待的方向。

0 条回复 A文章作者 M管理員
    暫無討論,說說你的看法吧