本文通過對 Starknet 的鏈上核心元件、optimistic/zk rollup 手續費結構、EIP-4844 的 blob 機制、SHARP 系統的費率進行了探索,向大家揭示了 Starknet 手續費下降 99% 的真相。本文源自作者 LXDAO 所著文章,由極客 Web3 整理及撰稿。
(前情提要:坎昆升級完成》以太坊L2的Gas費真的大幅降低?ARB、OP、STRK..幣價表現? )
(背景補充:Starknet被罵夠了!變更4月解鎖量從13%>0.64%,$STRK隨即反彈20% )
在本文中,LXDAO 的作者 0xSamo 通過對 EtherScan 進行靈活運用,對 Starknet 的鏈上核心元件、optimistic/zk rollup 手續費結構、EIP-4844 的 blob 機制、SHARP 系統的費率進行了探索,向大家揭示了 Starknet 手續費下降 99% 的真相:坎昆升級降低 DA 手續費只是輔助原因,真實原因是 Starknet 發幣後國庫有了其他收入來源,不必再依賴於手續費創收,所以大幅度下調了 L2 Gas Price 基準。
前言
EIP-4844 作為 The Merge 之後以太坊最大的升級,吸引了足夠多的關注。這次升級引入的 Blob 臨時儲存空間,相當於為以太坊這列火車增加了側掛車廂,在不影響火車原有執行狀態的前提下,提供了更便宜的 DA 空間。
Optimism、StarkNet、Arbitrum 等 Layer2 專案都在短時間內支援了 EIP-4844,並獲得了顯著的降費效果,以下是 LXDAO 國庫在 Optimism 上為貢獻者發放工資時生成的交易,在 EIP-4844 前後的 Gas 費竟然相差了 100 倍。
但在驚喜的同時,我們發現 StarkNet 作為 ZK Rollup 的代表,居然也獲得了驚人的降費效果,從以前動不動就超過 1 美元的 gas 水準,下降到了 0.01 美元。
Starknet 的手續費為何能降這麼多?
OP Rollup 與 ZK Rollup 對一層 DA 空間的需求不同
這兩者對 DA 空間的依賴程度是極為不同的。OP Rollup 會將近期交易的所有細節,包括使用者簽名等資料,打包壓縮後全部上傳到一層網路。它不需要在一層網路進行太多的驗算任務,幾乎所有的成本都在使用一層網路的 DA 空間上。
相比之下,ZK Rollup 對上鏈的資料擁有更高的壓縮率。比如,它可以不上傳 Layer2 交易的數位簽名,僅依靠 ZK Proof 來確保交易有效;並且,ZK Rollup 不需要打包所有交易細節,只需將狀態的變化結果打包上鏈。
舉個例子,在二層網路上,有 100 個使用者在 USDC/USDT 交易對進行了交易,每次交易後,資產合約裡的 USDC、USDT 的餘額都會發生變化。對 OP Rollup 來說,這些交易行為背後產生的 DA 資料,就是 100 條交易、200 個帳戶的 400 次餘額變動;
而對 ZK Rollup 來說, 資產合約共計發生的 200 次變化,可以壓縮為 2 次最終的狀態彙總變更,大大減小了 DA 資料的體積。
ZK Rollup 驗證 ZKP 消耗的額外 Gas
瞭解了兩者區別之後,大家的第一印象也許是 ZK Rollup 的 Gas 費會比較低,但實操過的同學們應該都知道,在 EIP-4844 之前,StarkNet、ZkSync 等 ZK Rollup,其費用顯著高於 OP Rollup,特別是 StarkNet,因為採用了 STARK 演算法,其零知識證明的尺寸更大, 轉帳費用往往高於其他 Layer2。
ZK Rollup 沒有一上線就將 OP Rollup 碾壓的原因很簡單:它雖然對交易資料有更高的壓縮率,節省了向一層傳輸資料的費用,但它要在一層網路上驗證零知識證明,增加了計算費用。
Blob 只能降低 DA 費用,對計算部分沒有多少幫助,相比於 OP Rollup,ZK Rollup 在 EIP-4844 上獲得的好處更少,所以當我們看到 Starknet 從手續費死貴的狀態,快速實現了美分級別 gas 費後,很難不讓人驚訝。
探索 Starknet 的手續費組成
ZK Rollup 往往比 OP Rollup 更復雜。下圖是 Optimism 排序器向一層網路釋出 DA 資料時,生成的交易記錄,任何人都能理解為什麼 EIP-4844 落地後,OP 的交易費用下降了兩個數量級。
但在調查 Starknet 手續費來源時,本文作者經歷了相當大的困難,因為 Starknet 不同元件之間的互動關係要更為複雜。下面讓我們來重溯這整個流程。
消失的一層 DA
因為有了探索 Optimism 手續費結構的經驗,我們很自然想到,找到 Starknet 向主網提交資料的合約地址就可以了,這種關鍵合約肯定在 Etherscan 的 Gas 消耗榜榜上有名,應該是不難找的,比如還沒適配 EIP-4844 的 Scroll,其合約至今還掛在 Gas 消耗榜的頂端。
當我們搜尋 Starknet 關鍵詞之後,會在 EtherScan 上找到 Operator、Core Contract、Memory Page Fact Registry 3 個相關元件,但第三個看起來和 DA 相關的合約,在接近兩年前就停止使用了。
目前我們能看到 Starkent 的 Operator 在不斷和 Core Contract 互動,不斷地呼叫 「Update State」 函式。
如果我們翻到坎昆升級啟用前後的鏈上記錄,會發現 Operator 的 「Update State」 行為確實產生了細節變化,首先函式名更改為 「UpdateStateKzgDA」 ,其次,舊的狀態更新函式會向 Core Contract 傳送 ProgramOutput、onchainDataHash 和 onchainDataSize,而新版函式中上傳的是 ProgramOutput 和 KzgProof。
這裡的 KzgProof,俗稱 KZG 承諾,起到的作用類似於 Blob 的 datahash,和 Blob 中存放的資料有著對應關係。值得注意的是,新版本的狀態更新函式,消耗的 gas 比舊版本的更多。那麼問題來了,Starknet 到底為何能夠把手續費降得這麼低?原因到底是什麼?
第一次挫敗後的分析
雖然第一次探索不太成功,但我們仍然能得到一些推論和猜想。看過 MyFirstLayer2 的小夥伴一定知道 Rollup 的核心問題就是 DA 問題(資料可用性),而它們都是將關鍵資料上傳到主網,來解決資料可用性問題,這樣一來,所有人都能輕鬆訪問到需要獲取的資料。
我們回溯一下,OP Rollup 簡單粗暴地把所有交易指令壓縮彙總,打包上傳到一層網路,其他人可以下載這些壓縮後的資料,然後再解壓,Replay 每一條交易來知曉二層網路的狀態變更。
ZK Rollup 則不需要上傳完整的交易細節,只需上傳 State Diff(每個 Batch 執行前後的狀態變化量)。ZKRollup 由 ZKP 來確保 State Diff 是有效無誤的,其他人則可以直接在 Prev_GlobalState 之上疊加 State Diff,知曉二層網路的最新狀態。
我們都知道,Blob 裡的資料只是一串亂碼一樣的二進位制文字,而一層網路只保證 Blob 資料上傳後不被某些惡意節點篡改,但不負責驗證這些資料的內容,當然,一層部署的智能合約也無法直接讀取 Blob 裡的內容。
因此,如果仍由一層來驗證 ZK Proof,那 ZK Proof 肯定不能放在 Blob 裡,所以我們可以判斷,Starknet 能夠有如此顯著的降費效果,與 ZKP 的關係不大,一定是因為 State diff 的存放位置變更所致。
下面的任務顯然就是確認,Starknet 到底把 State diff 放在哪裡了?過去是放在哪兒的,現在究竟是不是放 Blob 裡面。
此外,只能在 UpdateState 函式的輸入引數裡找到一個 StateRoot 也不禁讓人懷疑,Starknet 是否把原本應該直接上傳至主網的資料,改為傳送至自己的鏈下 DAC (資料可用性委員會)來,如果真的是這樣,那之前 Starknet 高昂的收費就完全沒有道理,只能解釋為……
SHARP 系統
所幸和 @0xYandhii 討論之後,讓我醍醐灌頂,Starknet 在通用型主網上線之前,第一個產品其實是 StarkEX,包括去中心化衍生品交易所 dYdX 也是那個時期的產物。
在主網上線後,原先的產品沒有被放棄,而是轉而與主網共享一個驗證器合約,即 SHARP: Shared Proving and Verifying System 系統,然後我們找到了 SHARP Blockchain Writer、SHARP Verifier 等相關合約。
開啟區塊瀏覽器查詢相關交易,可以發現 SHARP Blockchain Writer 進行了以下 4 類操作:
1. VerifyMerkle:驗證默克爾樹
2. VerifyFRI:用於確保提交的資料或計算結果遵循特定規則,不需要揭示資料的原像。
3. Register Continuous Memory Page:疑似是向一層網路寫入資料時呼叫的功能。
4. Verify Proof And Register:快則十分鐘被呼叫一次,慢則一兩個小時,應該是 Starknet 攢夠足夠大量的交易後,統一對這些交易的 ZKP 進行有效性驗證。
不難看出 1、2、4 是與 ZKProof 相關的函式,而第 3 個函式,顯然是向一層網路寫入資料的步驟,是最有可能與 State diff 上傳相關的功能。
我們推測,1、2、4 三個函式的呼叫手續費,在 Blob 升級前後沒有顯著變化,而第 3 個函式的使用成本,應該顯著的降低了,這樣就能解釋 Starknet 為何降費效果如此顯著。
於是筆者繼續翻閱區塊瀏覽器,在 EIP-4844 前倒數第二個舊版本、倒數第一個版本,已經升級後的最新版本 3 個時段各取一個驗證週期,統計 4 個函式每次呼叫時,各自消耗的 Gas 究竟如何。
結果如下,令人撓頭。
第 3 個和資料釋出相關的函式,其費用有下降一半,但從其在一整輪 ZK Proof 驗證過程中的費用佔比來說,這個 DA 費用下降水平證明不了我們前面提出的假設。
探索走到這裡幾乎就到了山窮水盡的一步,筆者感覺自己就像三體世界裡坐在大型粒子對撞機前的物理學家,每個腦細胞都在尖叫著:This doesn’t make sense ! 我甚至去 Starknet 社群發了一篇帖子詢問,但也許是因為問題太複雜,英文社群遲遲沒有人迴應。
SHARP 系統 GasUsed 探索
至此,我們還剩最後一個小 Trick ,之前下載的交易資料 csv 裡面,只有 Gas 費消耗的 ETH ,沒有 GasPrice、Gaslimit 等資訊,所以無法排除 Gas 單價波動對統計結果的影響。於是筆者寫了指令碼將之前涉及的每一筆交易實際消耗的 GasUsed(Gaslimit 裡被使用掉的部分)統計了出來。
這一次我們終於發現了端倪。可以看到在坎昆升級之前,那個名叫 Register Continuous Memory Page 的函式,在每次 DA 資料上傳時會觸發 2 次,一次消耗 5 萬的 gas,另一次消耗 30 萬 gas。
而坎昆升級之後,幾乎所有呼叫 Register Continuous Memory Page 函式的交易,都只消耗 5 萬 gas。
之前我們取的樣本太少,正好那一次升級後,正是主網 Gas 費暴漲的時期,這影響了我們的統計結果,導致我們認為,Register Continuous Memory Page 函式的呼叫成本,在坎昆升級前後都沒發生什麼變化,而當我們對統計資料進行更廣泛的採納時,很快就發現了問題所在。
按照這個思路我們重新整理了 3 個時刻的 GasUsed 資料,這回合理了許多。至此可以證實,與 DA 資料上傳相關的 Register Continuous Memory Page 函式,確實在坎昆升級後手續費顯著降低,這應該就是原本存放 State Diff 的步驟,而坎昆升級後,DA 資料轉移至了 Blob 中。
後續我們在 L2beat 網站上找到了 Starknet 的產品結構示意圖,可以發現,State diff 確實是通過上述函式來存放至以太坊鏈上的。
最終,我們根據 GasUsed 的數量計算(以目前隨機抽取的較小樣本量來寬泛估計),得出結論:Starknet 在坎昆升級之後,DA 費用大概有 4~10 倍的變化,略低於一個數量級。
這也符合我們最開始的猜測:在 EIP-4844 升級後,ZK Rollup 獲得的好處並不如 OP Rollup 那麼多。
總結
經過以上探索,我們終於理清了 Starnet 手續費大幅下降的原因,其結論還是有點耐人尋味。
DA 費用大降,但解釋不了兩個數量級的降幅
可以明確,Starnet 之前是把每個 Batch 中包含的狀態變化資料,直接上傳到一層網路中的,現在則是將這部分資料放在了 Blob 中,因此可以在 DA 資料這部分手續費中,獲得略小於一個數量級的降費效果。
但該如何解釋 Starknet 手續費下降 99% 這個結果?單純靠 DA 降費顯然遠不夠。唯一合理的解釋就是:Starknet 在坎昆升級前,確實 「心黑」 向用戶收了太多手續費。在 STRK 發幣前,Starknet 的所有活動、社群激勵都需要資金,除了燒投資人的錢之外,在向用戶收取的 ETH 和實際消耗的 ETH 之間設定剪刀差,可能是 Starknet 維繫營運的方式之一,這才使得此前 Starknet 的 Gas 費如此之高。
現在,STRK 代幣發行為 Starknet 帶來了足夠的資金,是時候讓 Gas 回到合理的水準了,趁著坎昆升級把綁在腳上的沙袋一起拆下,展現出的降費效果確實驚豔了許多人。
Rollup 歷史資料丟失問題
OP Rollup 在升級之後,將原本儲存在交易 Calldata 裡的資料,轉移到 Blob 這個臨時儲存區後,其實犧牲了一點去信任性。
在此前,Calldata 空間的資料是永久儲存的,意味著任何人都能從以太坊主網裡下載到足夠的歷史資料,來驗證和同步 OPR 當前的狀態。
但坎昆升級之後,Blob 的資料有過期淘汰的設定,如果全網沒有任何一個實體儲存過去的 Blob 資料,那麼 OPR 的歷史交易記錄有可能會丟失。
雖然當前最新的二層網路狀態仍然能被保護 —— 因為 Blob 的儲存期限超過 OP 的 7-14 天挑戰期,所以每個 Blob 在即將過期之前,它所對應的二層狀態仍然是可信的,這最新的十幾天的交易記錄滾動地維護著 OPR 的安全性。
ZK Rollup 如果要享受 Blob 帶來的好處,同樣需要把重要的二層狀態資料,從 Calldata 空間轉移到 Blob 空間裡去。這意味著在一段時間後,我們也不再能像以前一樣,依靠一層網路提供的資料來 Replay 二層的狀態。
也許這將成為一種常態,今後所有的二層網路,都依靠 Blob 維護最新狀態的安全,而每一條 L2 也需要自己另外想辦法解決歷史交易資料儲存問題,如此在安全和效率之間取得更好的平衡。
OP 與 ZK 的融合趨勢
過去,第一代的 OP Rollup 率先上線,而第一代的 ZK Rollup 上線後沒有帶來更具競爭力的 Gas 費。到後續 OP Stack、Polygon SDK 帶來的模組化風潮,OP Stack 甚至計劃在將來引入 ZK 技術來降低挑戰期。
這無疑都指向一個事實:OP 與 ZK 兩種技術路線並不是你死我活的競爭,他們會互相借鑑,有融合的趨勢,只不過這一次是 「高貴」 的 ZK 向 「簡單粗暴」 的 OP 學習的一次。
很難想像二層網路的技術在短短兩三年之間演化到如此的地步,也許這就是區塊鏈世界的魅力吧。