zkUniswap:首創zkAMM
感謝Cairo, William X, Trace, jseam, Barnabé Monnot, Xyn, Filip Siroky, Colin Roberts, Thogard, Alex Nezlobin和其他人的慷慨反饋。
什么是zkUniswap?
zkUniswap是Uniswap V3的一個分支的概念驗證研究,它使用zkVM (RISC Zero)來計算部分鏈下swap。當用戶开始swap時,在鏈上發出請求。該請求由一個中繼接收,該中繼使計算脫離鏈,然後將輸出(和相應的證明)發送給EVM中的回調函數。如果證明有效,則執行swap並滿足請求。
在GitHub上查看zkUniswap的代碼
什么是zkAMM?
zkAMM是自動做市商(AMM)的一種變體,它在協議中集成了零知識證明。這可以通過利用zk協同處理器減少swap步驟的計算來實現,就像這裏討論的情況一樣。值得注意的是,與zk-rollup上的AMM不同,證明的驗證是由協議本身完成的,允許它存在於不使用零知識證明的媒介中(如以太坊主網)。
zkAMM的意義是什么?
隨着計算zk證明變得更便宜,從長遠來看,計算鏈下swap可能會比計算鏈上swap更便宜。通過允許我們將部分交換過程外包到EVM之外,zkAMM讓我們在不放棄信任保證的情況下擺脫EVM的限制,因為證明可以很容易地在鏈上進行驗證。
swap步驟是什么?
swap步驟位於swap執行的核心。解釋文檔在UniswapV3的代碼庫中,swap步驟輸出如下:
1. 金額轉入和轉出後的價格
2. 要兌換的金額
3. 要收到的金額
4. 將收取費用的輸入金額
具體來說,由Uniswap V3Pool 3中的swap函數計算的步長為:
該邏輯是由專業庫SwapMath實現的。
技術藍圖
鏈下zk協同處理器
zkUniswap有效地利用zk協同處理器來執行swap步驟。該協議使用zkVM作為客戶機程序來運行該步驟。這個程序是用Rust編寫的,你可以在這裏找到它,它使用了一個Uniswap V3 math庫。
zkVM的證明程序生成一個收據,其中包括一個日志(該步驟的輸出被提交到其中)和一個密封,這是一個zk-STARK。此收據用於驗證日志中的輸出是否正確執行了步驟程序。
鏈上swap請求和結算
用戶通過在鏈上發出請求來啓動swap,這是通過調用requestSwap 完成的。它們傳遞的輸入和swap的輸入是一樣的。在本例中,中繼器Bonsai接收請求並計算脫鏈步驟。然後中繼將包括輸出和證明在內的數據發送給函數invokeCallback。該函數驗證證明,如果認為證明有效,則調用執行該步驟的回調函數,即settleSwap。
驗證證明
使用了STARK-to-SNARK包裝器,這樣密封的zk-STARK就會在Groth16證明器中進行驗證。這使得證明的驗證更加有效,以至於我們可以在鏈上進行驗證。用Solidity編寫的Groth16驗證器允許調用invokeCallback。
並發控制
由於交換是非原子的,因為請求和執行是在不同的交易中進行的,因為證明不是在EVM中進行的,所以在發出請求之後和執行交換之前,池的狀態可能會發生變化。這將是非常有問題的,因為證明是針對發出請求時池的狀態進行的。因此,如果在請求掛起期間對池進行更新操作,則要發布的證明無效。
為了防止這些問題,通過requestSwap將鎖放在池上,如果鎖處於活動狀態,則阻塞除settleSwap之外的所有操作。這可以防止在swap過程中池的狀態發生變化。如果回調成功調用,則由settleSwap解除鎖。如果swap在預定的時間(由LOCK_TIMEOUT定義)之前沒有完成,則鎖將超時。因此,如果中繼失敗,變得無響應或發布無效證明,則池不會永遠鎖定。超時時間可能是幾分鐘,如果不是幾秒鐘的話,因為生成證明所需的時間相對較短。
鎖拍賣
用戶為了能夠鎖定池而相互競爭,因為一個池一次只能持有一個鎖。調用requestSwap的第一個交易將鎖定它,而其他交易必須等待swap解決或鎖定超時。由於交易可以由構建器重新排序,因此用戶可能希望付費讓構建器首先包含自己的交易。這意味着價值將被MEV所損失。
然而,zkUniswap採取了不同的方式,使用可變利率漸進式荷蘭式拍賣(VRGDA)拍賣這些鎖。這使協議可以通過直接拍賣鎖來獲取該價值。此外,這些鎖是按照一個時間表連續拍賣的,這樣協議就可以最大限度地延長池被鎖定的時間。如果銷售提前,協議就會認識到需求數量的激增,並自動更新價格以反映這一點。同樣,如果銷售滯後,協議降低價格以匹配需求數量。總而言之,這被證明是協議的另一個收入來源。
拍賣由池智能合約執行,期望在對requestSwap的調用中至少以鎖的價格轉移ETH。如果提供的ETH多於必要的ETH,則在調用結束時將剩余部分自動返回給用戶。
Swap流程
我們使用BonsaiRelay智能合約在鏈上處理與中繼的交互,這是中繼接收回調請求(發出的事件)並最終發布數據的網關(具體來說,用到invokeCallback):
性能指標
zkVM中的程序大約需要~154720個周期。requestSwap消耗的平均gas量為~194141(最差的~254198),setteSwap消耗的平均gas量為~64076(最差的~100000)。作為參考,一個未修改的swap調用使用大約~71279(最差的~111330) gas。requestSwap可以得到顯著的優化,但這裏的情況並非如此,因為Bonsai請求最終比swap更昂貴。
這份gas報告是在啓用了優化器、運行了20,000次、Solidity版本為0.8.17的情況下完成的。
展望未來
這項研究的概念驗證表明,zkAMM目前要取代傳統的AMM還為時過早。然而,有幾種方法可以改進這種設計,利用其獨特的優勢,以便在未來它們的價值主張變得更具吸引力。
Swap並行化
Continuations可用於並行化Swap。從概念上講,Continuations允許將zkVM的單個會話的執行跟蹤拆分為許多段,每個段都被獨立證明。路徑相互獨立的swap可以用zkVM中的一個段來表示,然後這些段可以作為更廣泛會話的一部分,被並行地進行驗證。這允許對一批Swap的證明步驟進行並行化。
n 是批次中的swap數量, CAMM 是傳統 AMM 的計算成本,並且 CzkAMM 是 zkAMM 的計算成本。我們的假設表明
從本質上講,交換的執行可以在鏈上連續完成,但是實際swap步驟的計算將使用這種方法在鏈下並行完成。這允許批次中最重部分的並行化,這在EVM中是不可能的。
正如Trace所指出的那樣,對於並行swap,鎖可能是並行拍賣的,因為swap涉及不同的池。
差異隱私
zkAMM的實例化不是私有的。為此,我們需要一些噪音。雖然超出了本文的範圍,但值得指出的是,差異隱私可以通過利用統一隨機執行(Uniform Random Execution)等隱私增強機制來實現,如本文所述。
廉價或無gas請求
William X 的一個想法是將請求在一個更便宜的、可選的數據可用性層(如L2)上傳播到中繼用來完成請求或zkAMM所在的層。這有可能降低提出請求的成本。
另一種可能性是用戶通過生成他們在鏈下傳播的EIP712籤名來發出請求。然後,中繼可以在滿足鏈上請求的同時提供此籤名。這樣就有可能實現無gas的swap請求。
擺脫鎖
Cairo和jseam獨立提出的另一個想法是,不依賴於鎖定池,而是讓證明指定池的狀態可以改變多少。這將使swap的執行成為有條件的,就像常規swap交易指定他們可以接受的滑點一樣。
在這種方法中,證明的成本可能會更高,因為我們可能會為池本身的狀態生成證明,而不僅僅是為swap步驟生成證明。在任何情況下,這種權衡對於擺脫鎖在UX中的好處來說仍然是有意義的。
未來的工作
差異隱私整合的探索。
進一步優化證明生成過程。
批處理swap證明的並行化實現。
探索請求方法的替代實現。
在GitHub 上查看zkUniswap的代碼
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。
Arthur Hayes 新文聚焦 | 全球貨幣政策的真相,比特幣接下來何去何從?
作為一名宏觀經濟預測者,我試圖基於公开數據和當前事件,作出能夠指導投資組合資產配置的預測。我喜歡“...
Ouroboros DeFi:為什么 Usual Money 被低估了?
前言:Ouroboros DeFi 方法論在Ouroboros DeFi收益基金,我們的投資策略始...
WEEX 唯客交易所贊助臺北區塊鏈周 支持更多全球用戶Onboard Web3
第三屆臺北區塊鏈周(Taipei Blockchain Week, TBW)於 12 月 12-1...
coincaso
文章數量
3497粉絲數
0