zkUniswap:首创zkAMM
本文介绍zkUniswap,这是一种首创的zkAMM,它使用zk协同处理器来减轻swap计算负担。
原文标题:zkUniswap: a first-of-its-kind zkAMM
原文作者:diego
原文来源:ethresear
编译:Kate
感谢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的代码
免责声明:本文仅代表作者个人观点,不代表链观CHAINLOOK立场,不承担法律责任。文章及观点也不构成投资意见。请用户理性看待市场风险,以及遵守所在国家和地区的相关法律法规。
图文来源:Marsbit,如有侵权请联系删除。转载或引用请注明文章出处!