zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

Author:0xhhh|EthStorage (Twitter:@hhh69251498)

Editor:Red One

在polygon zkEVM的第一篇文章裡( zkEVM系列(1)|Polygon zkEVM的整體架構和交易執行流程),我們總結了Polygon zkEVM 的整體框架以及交易執行流程,同時也分析了Polygon zkEVM是如何實現計算擴容的同時繼承了L1的安全性的;在這篇文章裡,我們將依托上篇文章建立的框架,深入polygon zkEVM關於Sequencer和Bridge更多的技術細節,同時也探討未來潛在的去中心化Sequencer架構的不同特點。

一、深入解析zkEVM Bridge

在上一篇文章裡,我們介紹Ploygon zkEVM的過程中,實際上缺失了很重要的一個部分,就是Polygon zkEVM 的原生橋。 (注:在本文L2特指Rollup, L1特指Ethereum。)

1.跨鏈數據狀態管理

Polygon zkEVM在L1和L2分別維護了一棵Exit Tree,名字分別為L1 Exit Merkle tree和L2 Exit Merkle tree。但是為了更好的管理這兩棵樹,Polygon zkEVM 很聰明的將這兩棵樹結合在了一起,如下圖:

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

也就是用分別把L1 Exit Tree Root 作為Global Exit Tree的左葉子節點,把L2 Exit Tree Root 作為Global Exit Tree 的右葉子節點。不過需要注意這裡L1 Tree Root 和L2 Tree Root是Sparse Merkle Tree(SMT),而Global Exit Tree是Binary Merkle Tree。

L1/L2 Exit Tree葉子節點的基本信息如下:

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

2.跨鏈流程

在Polygon zkEVM的合約設計中,還是盡可能將Bridge和Consensus合約盡可能解耦。目前其在L1部署的合約主要分為3個,如下圖所示:

需要注意的是他們之間不是繼承關係,都是獨立的合約,PolygonZkEVMBridge和PolygonZkEVM都會調用PolygonZkEVMGlobalExitRoot來更新或驗證Global Exit Tree Root 。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

1) L1 → L2 的跨鏈流程

L1 → L2的跨鏈流程對應上圖的橙色標識的三個步驟:

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

對應以下代碼中的BatchData的結構體中的globalExitRoot :

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

PolygonZkEVMBridge在L2的合約

https://testnet-zkevm.polygonscan.com/tx/0x2a742f2f8a7b8635a76cc70b4574bebb1a81b2c0c1a618188773a1f8f2283bb8

https://testnet-zkevm.polygonscan.com/address/0x39e780d8800f7396e8b7530a8925b14025aedc77#code

2)L2 → L1 的跨鏈流程

用戶調用部署在L2的Bridge合約(PolygonZkEVMBridge.sol)中的Bridge()函數發送一筆L2-Bridge-Tx,這會更新添加一個新節點在L2 Exit Tree中,然後依次更新L2 Exit Tree Root和Global Exit Tree Root。

接下來當Sequencer會把這筆L2-Bridge-Tx放到某一個Batch中發送到L1的共識和DA合約(PolygonZkEVM.sol)中。

然後在之後Aggregator調用trustedVerifyBatches()往L1提交validity proof的時候,實際上也會把L2 Exit Root也一併作為Input進行上傳,也就是以下函數的中的NewLocalExitRoot,它代表了L2有新的BridgeToL1的交易,但是這些交易目前在L1還不能提款,需要等待這個新的NewLocalExitRoot被驗證成功。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

接下來這個傳入的New Local ExitRoot也會作為驗證電路的一部分,輸入這個驗證邏輯是我在L2發生的這些新的BridgeToL1的交易是不是導致L2Exit Tree Root變成當前這個提交的New Local ExitRoot。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

如果這個這個Validity Proof驗證通過,那麼L1的Global Exit RootManager 會更新L2 Exit trre Root和Global Exit Tree Root:

globalExitRootManager.updateExitRoot(newLocalExitRoot);

這個時候,用戶就可以調用部署在L1的Bridge合約(PolygonZkEVMBridge.sol)的C laimAsset()函數並給出相應的Merkle Path進行提款,跨鏈交易的也就完美結束。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

二、 Polygon zkEVM如何抗審查

在上篇文章,我們介紹了Trusted Sequencer ,由官方運行的Single Sequencer,基本上L2網絡的交易都會提交給這個Trusted Sequencer,並且可以獲得一個及時Sequencer Finality。

而實際上用戶還可以通過另一種方式直接提交交易到L1的合約中,而不需要通過Trusted Sequencer,從而保證了整個網絡仍然具備一定的抗審查的特性。

1.執行流程

1)用戶調用L1合約中的Force Batch函數,通過這個函數可以用戶可以把自己想要執行的L2交易直接送到L1的合約中的。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

2)合約中會將這些Transactions打包成一個Batch,並且記錄在合約中一個Force Batches的Mapping中。 zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

3)Trusted Sequence 監聽到Force Batches中有新的Force Batch的時候,會將其同步到本地的節點中,然後會在下次往L1提交Batches的時候包含這個ForceBatch。

4)不過這裡還存在一種特殊情況,如果Trusted Sequence如果宕機了,或者故意不提交某個用戶提交的Force Batch, 那麼在五天之後用戶可以自己調用L1合約中的SequenceForceBatches() 函數,讓這筆ForceBatch進入到L1合約中的Sequenced Batches ,也就意味著這筆Force Batch在Rollup中的交易順序被L1合約最終確定,即便是Trusted Sequence也無法再更改這個Force Batch的交易順序。 (實際上所有Rollup都會有這樣的特性來提供抗審查特性比如Arbitrum的Sequence Inbox和Inbox)。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

不過這裡推薦大家盡可能不要通過Force Batch的方式提交Rollup的交易,因為通過這種方式,你在調用Force Batch往L1提交自己的交易的時候會暴露你的交易內容,而這個時候交易順序還沒被確認(需要等待Sequence同步ForceBatch並通過Sequence Batch()再一次提交到L1的時候交易順序才被真正確認)同時你已經沒辦法取消你的交易了,這個時候你有很大的可能被搶跑。

這似乎這並不能真正的抗審查,因為Force Batch的方式存在被搶跑的風險,用戶真的會用這個功能嗎?

2.Sequencer的真正狀態

從上文我們可以得知,Sequence會從L1同步Force Batch中的交易到本地節點進行執行,於是Sequence的真正狀態如下圖所示:

Bn表示用戶直接提交給Sequence的交易執行後得出的結果;

FBn表示Sequence同步Force Batch的交易進行執行後得出的結果。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

 https://zkevm.polygon.technology/

三、L2網絡存在的三種不同的Finality

接下來我們回顧下Ploygon的整體架構,為接下來的去中心化Sequencer思考做好鋪墊。

我們需要關注到。對於Sequencer 和Aggregator來說,他們的狀態都是通過Syschronizer從一層合約中進行同步的,他們之間並不是直接通信的。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

1 )三種Finality

因此我們可以認為目前整個網絡存在三種不同程度的Finality,我們給命名成Sequencer Finality, DA Finality和Verified Finality。

a. 第一種Sequecer Finality,在有一些文章中也將這種Finality稱為Soft Finality,但是我覺得叫做Sequenecer Finality更為合適,因為這個Finality其實是Single Sequencer 給的狀態承諾。

Sequencer接受到用戶交易之後,執行後給出的狀態,這是最不安全的狀態;但是在目前官方Single Sequencer的場景下,卻可以在保證安全的同時帶來極致的用戶體驗。在目前單一Sequencer的Rollup網絡中,基本上都可以體驗到即時確認的快樂。不過,Single Sequencer最大的風險就是Sequencer宕機,這會導致整個L2網絡基本癱瘓,不過由於DA層是位於以太坊上的,依然可以在之後部分恢復L2網絡宕機前的狀態;不過那部分來不及發送到L1的L2交易將無法被恢復。

b. 第二種DA Finality,代表這些交易已經被提交到L1的DA層合約上,此時交易順序也被確定了。

Trusted Sequencer已經調用Sequence Batch 將交易發送到L1上,在這種情況下,交易已經被DA層包含;在Polygon的設計中, 由於單一Trusted Sequencer的原因,所以可以確保上傳到L1合約上進行DA的交易都是有效交易。我們可以認為當一筆交易被Trusted Sequencer 上傳到L1合約中的時候, 這個時候它已經被Rollup網絡承認了,並且在之後Aggregator會提供Validity Proof讓這筆交易真正無法被Revert(除非L1 Reorg)。

c. 第三種Verified Finality指的是這筆交易已經通過Validity Proof的驗證了,屬於真正的Finality;在一些文章中也把它叫做Hard Finality。

當Aggregator為一批上傳到DA層的交易提供的Validity Proof被合約驗證通過的時候,這個時候我們認為這些交易已經無法Revert了(除非L1 Reorg)。我們在上一篇文章裡提到過,目前提交到DA層的交易到驗證validity proof的通過的時間是30分鐘,同時Aggregator也可以通過提供Validity Proof從而獲得足夠的Matic報酬。

2)Aggregator同步狀態的取捨

假如我們這裡假設提供Validity Proof是有利可圖的,那麼對於Aggregator來說,最好的同步交易的方式,不是在L1的DA層合約中同步,而是直接跟Trusted Sequencer建立rpc鏈接,直接從Trusted Sequencer獲取最新的交易,這樣生成Validity Proof會更快,從而相比其他從DA合約中獲取交易的Aggregator更有競爭優勢,因為提供Validity Proof這件事情是先到先得,對於一批交易來說也僅僅需要一個聚合的validity proof,第一個提交Validity Proof的Aggregator可以拿走對應交易的Matic獎勵,其他Aggregator生成的Validity Proof也無法再獲得任何獎勵。

不過目前實際上Polygon跟Trusted Sequencer角色一樣,也有一個Trusted Aggregator, 來處理生成和提交Validity Proof的工作。

https://zkevm.polygon.technology/

四、Sequencer 的未來

接下來,我們繼續是關於去中心化Sequencer的思考。首先第一個問題是我們為什麼需要去中心化的Sequencer?因為我們希望Rollup能在擴容以太坊的計算能力的同時,繼承以太坊的安全性和去中心化程度。而當前Single Sequencer的方案顯然達不到繼承以太坊的去中心化程度的目標。再繼續勾畫去中心化Sequencer的未來之前,我們先來回顧Sequencer的工作。以Polygon zkEVM為例,目前Trusted Sequencer對交易的處理會遵循FCFS,先到的交易先進行處理,並行Mempool也是私有的,盡可能保護用戶的交易不被MEV。

當收集到一定量的交易之後,會把它們封裝成Batches上傳到L1合約中對應的DA的位置,並且在第一篇文章中我們也提到了這些了Sequencer上傳的Batch中實際上已經通過在後一個Batch包含前一個Batch的哈希的方式確定了交易的順序。因此我們認為Sequencer的工作類似L1 Proposer的工作,提議了一批交易,並且確認了交易的順序。

因為我們是從Polygon zkEVM 開始介紹去中心化Sequencer的,我們就先介紹Polygon zkEVM的去中心化Sequencer方案Proof Of Efficiency(效率證明)。

1.Proof-0f-Efficiency

1)方案描述

在POE的設計中,允許任何人成為Sequencer並且向L1提交Rollup Block的,Rollup網絡的交易順序取決於交易被提交到L1的Rollup DA 合約的順序。 (在Polygon zkEVM 裡Batch 等價於Block。

如下圖,用戶都可以自行選擇將交易發送給哪個Sequencer,甚至可以自己成為Sequencer, 這些Sequencer在收到足夠的交易之後,會將這些交易打包成Batch,然後往L1上提交。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

這些Sequencer需要考慮利潤問題:

Sequencer 成本= L1 gas cost + generate zkProof fee

Sequencer 收入= L2 gas fee

所以Sequencer 需要考量將至少多少筆交易打成一個Batch提交L1才是有利可圖的。但是Sequencer還需要考慮另外一個問題,時效性問題,如果一個Sequencer的提交交易速度過慢,那麼它的用戶可能會流失到其他提供更快確認的Sequencer那裡。

2) 方案可行性

首先這個方案能運轉的核心原因是Polygon的DA部分沒有做任何狀態承諾,僅僅確定了交易順序;狀態承諾(Sequencer承諾交易執行後對應的新的世界狀態,但是這個狀態未被Validity Proof或者Fraud Proof驗證的狀態)是在提交Validity Proof的時候才會給出,這是這個方案能執行的核心原因。

實際上像Arbitrum在提交交易到DA合約中的時候也沒有做任何狀態承諾,但是Optimism在提交交易到DA層的時候是攜帶狀態承諾的,所以理論上Arbitrum也可以運用POE來實現去中心化Sequencer ,但是Optimism則不行。

3) 為什麼攜帶狀態承諾就不能運用POE?

因為在多個Sequencer幾乎同時往L1提交Batch的時候,實際上沒有一個Sequencer可以保證最終在DA合約上L2的交易順序到底是怎樣,所以如果攜帶狀態承諾,大概率會導致整個Batch無法通過Validity Proof或者Fraud Proof的驗證。

4) 如何處理無效交易?

無效交易指的是比如賬戶的Nonce過低,賬戶餘額不足以支付Gas費用的交易,當這些交易在L1(Geth)是不會被放入到區塊的,因為如果一個區塊中包含一筆無效交易,都會導致整個區塊變成無效區塊,Validator不會給這種區塊投票,Propoer也不會提案這種區塊。

在當前Single Sequencer的情況下,L2網絡是有能力辨別這種無效區塊的,並且可以避免在L1 DA合約中避免包含這種交易,這可以避免浪費L1的區塊空間。

但是採用POE之後,Sequencer實際上失去了辨別這種無效交易的能力,因此在L1的驗證交易帶來的狀態變更過程中,也需要將這種情況考慮進去,並且Sequencer提交無效交易是無法獲得用戶的手續費的。

5) Public Mempool(公共交易池)?

採用POE之後,如果這些去中心化的Sequencer之間會存在Public Mempool,那麼會導致用戶一筆交易被不同的Sequencer提交多次,當然只有第一次提交的交易是有效交易,也只有這交易最終能獲得用戶的手續費。

6) Sequencer為何無法預測執行結果

在這種Permissonless Sequencer的模型下,一個Sequencer是無法給用戶提供及時的Sequencer Finality,因為Sequencer預測的最終上鍊的的交易順序和實際的交易順序會有偏差,這個偏差是由於可能有多個Sequencer在幾乎同個時刻向L1的DA合約提交了交易Batch,在這種情況下很難保證這些交易Batch的實際順序是否跟預測順序相同。

因此Sequencer同步自身狀態的時候,也會從L1的DA合約上同步最新被提交的交易Batch並執行來獲得最新狀態,而不是其他Sequencer那裡同步狀態。

7)L2的MEV流失到L1

由於交易任何人都可以成為Sequencer提交Rollup網絡的交易, 並且提交交易Batch的交易實際上跟L1的普通交易無異,因此它實際上還是會經過MEV Boost的整個流程,意味著L2網絡的MEV都會流失到MEV Boost模塊。

8) Aggregator的設計

在POE的設計上,Aggregator同樣也是Permissionless的,但是由於Validity Proof實際上只需要一個正確的交易,也就意味著只有第一個為交易提交正確的Validity Proof的Aggregator才能獲得獎勵。因此作為Aggregator,你需要權衡提交的Validity Proof的證明範圍,提交時間以及提交Validity Proof可以獲得的Matic獎勵之間的關係,最終找出一個最有競爭力的策略。

似乎,利用這種自由市場競爭策略,可以讓交易對應的Validity Proof的生成速度達到最快。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

 https://ethresear.ch/t/proof-of-efficiency-a-new-consensus-mechanism-for-zk-rollups/11988

9 )總結

POE可以帶來完全PermissionLess的網絡,並且整個網絡可能也不會有宕機的風險,但是L1的DA合約中可能包含無效交易(比如相同Nonce的交易),MEV都被L1網絡獲取,並且只能提供DA Finality和Verified Finality。

2. Based Rollup

Based Rollup 是期望將Rollup網絡的Single Sequencer的工作委託給以太坊的proposer去完成。它會要求每個Proposer提案L1的區塊需要包含一個有效的Rollup 區塊。

因此L1 網絡的Block Builder需要運行一個Rollup的全節點用來接受L2的交易,並且構建最大價值的Rollup Block。

這樣的方案的好處是可以最大程度的繼承了L1的安全性以及去中心化程度,但是也會導致只能提供Sequencer Finality和Verified Finality,L2的MEV也會都流失到L1 同時也需要對以太坊客戶端的代碼進行修改,這也可能會影響L1的安全性。

3.Share Sequencing

Shared Rollup 相比Based Rollup將構建和提交Rollup Block的工作交給以太坊的Propoer,則是將這個工作交給Share Sequencers中的委員會。

3.1.具體流程如下:

a.不同Rollup的用戶都可以直接向Shared Sequencers所在的網絡直接發送Rollup的交易

b.Shared Sequencers會在內部運行一個BFT共識,在每一輪選出一個Sequencer Leader來對交易進行排序並構建對應的Rollup Block.

c.然後將這些Rollup Block提交到不同的Rollup網絡對應在L1上的DA合約

d.不同的Rollup網絡再通過L1的DA合約同步網絡中的最新交易,然後進入到他們自身驗證Validity Proof或者Fraud Proof的流程。

zkEVM系列(2)|Polygon zkEVM關於Sequencer和Bridge更多的技術細節

3.2.Shared Sequencer 架構的潛在影響

1)多個Rollup網絡共用一個Shared Sequencer Committee

2)從單個Rollup的角度來看,只是把把官方運行的Single Sequencer委託給了這個Shared Sequencer Committee

3)在每一輪從Shared Sequencer Committee中會選出一個Sequencer Leader,負責對接入這個Shared Sequencers網絡的Rollup Block進行構建,並且依次將這些Rollup Block提交到對應Rollup 在以太坊上的DA合約內。

a.比如A需要將Arbitrum上USDC跨鏈到Optimism上,那麼正常流程是它會在Arbitrum上先進行Lock,等待Lock成功之後,再去Optimism上提交自己在Arbitrum的Lock Proof(eg Merkle Tree Path + Tree Root),然後在Optimism上Mint出來對應的USDC資產;

b.當用戶向Shared Sequencers提交這樣一個交易的時候,每一輪的Seuqnecer Leader實際上可以將Arbitrum Lock的操作+Optimism Mint的操作放在同一時刻的Rollup Block進行執行,這樣可以帶來巨大的用戶體驗提升;

c.但是它依舊無法做到像同一個Rollup網絡的用戶體驗,比如Mint的時候你依然需要提供你的Lock Proof;

d.所以我們可以認為接入到這個Shared Sequencers網絡中的Rollup們是一個接近於完全同步的系統;

e.接近完全同步的系統有什麼作用呢?

f.可以提供原子跨鏈服務,因為每一輪選出的Sequencer Leader擁有排序所有Rollup交易的權力,所以他有能力構建原子跨鏈的交易。

4)跨鏈MEV的角度

因為每一輪的Leader Sequencer擁有所有Rollup Block的排序權力,所以理論上可以捕獲所有的跨鏈MEV,感覺之後Shared Sequencer也需要引入或者直接接入MEV Boost這種MEV架構,因為從目前看各個Rollup網絡的區塊間隔都會遠遠快於以太坊的區塊間隔,比如Optimism的2s每一塊,Arbitrum最快是0.25s出一塊。因此作為每一輪的Sequencer Leader構造Rollup Block的計算量其實並不小,因此感覺生態成熟起來之後也會有相應的MEV架構來輔助構造最大價值的Rollup Block。

5)從Decentralization和Liveness的角度看Shared Sequencers

因為Shared Sequencer Committee內部會用BFT共識來在每一輪選擇出一個Sequencer Leader來提案所有的Rollup Block,所以Decentralization 和Liveness 都要比目前的Single Sequencer方案強大不少。

6)從生態的角度

a.對於不同的Rollup擁有了更好的共存的理由,因為用戶可以很方便的在各個Rollup的網絡中進行資產轉移,也可以更好的對實現以太坊生態的負載均衡。

b.對於不同的正在構造Shread Sequencer的項目而言,可能就是你死我活的競爭,因為從用戶角度和目前各個Rollup都是Signle Sequencer的角度而言,似乎在Shared Sequencer這條賽道會出現贏家通吃的問題。

7)Finality角度

因為本質上還是Single Sequencer,所以無論是Sequencer Finality還是Verified Finality 都跟原來是一樣的。

3.3.潛在風險

因為Rollup之間不一定是同構Rollup,比如Arbitrum和polygon zkEVM之間的跨鏈,那麼意味著跨鏈交易對應在Arbitrum和polygon zkEVM之上交易的Verified Finality並不一致,比如我在Polygon zkEVM之上的mint交易已經獲得Verified Finality(提交了Validity Proof),但是此時我在Arbitrum上的Lock交易僅獲得了DA Finality(需要等待7天挑戰期),如果我在這個時候成功Revert了我在Arbiturm的交易,那麼也就意味著:我實際上在Polygon zkEVM無成本鑄造了很多跨鏈資產。

3.4總結

優勢:

a.MEV可以被Rollup網絡獲取,並且還可以額外獲取更多的跨鏈MEV;

b.用戶跨Rollup體驗好,並且能讓Rollup之間由競爭關係轉為共生關係,每個Rollup都可以提供自己獨特的價值,然後與其他Rollup網絡組合成可以為用戶提供各種各樣定制化服務的網絡;

c.相比Signle Sequencer,網絡的去中心化程度得到了大幅度增強,並且網絡的穩定性大大增強了,在某一個Sequencer Leader不出塊的時候,會及時輪換一個新的Sequencer Leader進行出塊;

d.網絡的三種Finality都跟原來Single Sequencer保持一致。

劣勢:

本質上還是Single Sequencer的模型,並且也引入了新的攻擊向量。

五、總結

在這篇文章我們詳細結構了Polygon zkEVM的bridge以及Sequencer更多的技術細節,在下篇文章也是最後一篇文章,會繼續解剖zkEVM的技術細節,敬請期待。

——待續——