注:原文作者是paradigm研究合伙人Dave White、Dan Robinson以及Uniswap创始人Hayden Adams。在这篇文章中,他们描述了一种称为时间加权平均做市商(TWAMM)的新型AMM,它可以帮助以太坊上的交易者有效地执行大订单,而其工作原理是将长期的大订单分解为无限多个无限小的虚拟订单,并根据嵌入的恒定乘积AMM随时间平滑地执行它们。
目录
1、介绍
2、概要
3、做市基础
3.1 做市商
3.2 逆向选择
4、自动化做市商
4.1 恒定乘积公式
5、在当前 AMM 上执行大订单
5、1 手动拆分订单
5、2 子订单大小权衡
6、传统金融类比
6.1 TWAP 订单
7、时间加权平均做市商(TWAMM)
7.1 概述
7.2 以太坊术语复习
7.3 基础设计
7.4 无穷小虚拟订单
8、实施
8.1 延迟计算(Lazy Evaluation)
8.2 Gas优化
8.3 虚拟交易涉及的数学
9、潜在的攻击向量
9.1 三明治攻击(又名夹心攻击)
9.2 信息泄露
10、Python 参考实现
11、结论
本文介绍了一种新型的自动化做市商(AMM),它可帮助以太坊上的交易者有效地执行大订单。
我们称其为时间加权平均做市商,或TWAMM(发音为“tee-wham”)。
它的工作原理是将长期订单分解为无限多个无限小的订单,并根据嵌入的恒定乘积AMM随时间平滑地执行它们。
假设 Alice 想在链上购买价值 1 亿USDC的ETH,那么她在Uniswap 等现有 AMM上执行这种规模的订单将是昂贵的,如果Alice知道别人所不知道的事情(内幕消息),则其执行这样的大额交易会遭遇很大的滑点。
在今天,Alice 的最佳选择是手动将她的订单分成几部分,并在几个小时内执行,让市场有时间意识到她没有内幕信息,因此可以给她一个更好的价格。
如果她发送了几笔大的子订单,而每个子订单仍将对市场价产生重大影响,并且很容易受到对手交易者的三明治攻击。另一方面,如果她发送了许多小的子订单,她将不得不承担所有的工作和活跃交易的风险,并向矿工支付大量的gas交易费用。
TWAMM通过代表Alice进行交易来解决这一难题。它将Alice的订单分解为无限多个无限小的虚拟订单,以确保随时间的推移完美平滑地执行,并且,使用带有嵌入式 AMM 的特殊数学关系,能够在这些虚拟订单中分摊 gas 成本。此外,因为TWAMM是在区块之间执行的交易,所以它也不太容易受到三明治攻击的影响。
考虑一个由两种金融资产组成的市场(比如USDC和ETH),而做市商就是这个市场的参与者,他们在任何时候都愿意用其中一个资产交易另一个资产。
如果你有1亿USDC并想用它来购买ETH,你可能找不到另一个人在同一时间做相反的交易。相反,你很可能会去一个由单个或多个做市商组成的市场,并与他们进行交易。
做市商从价差中获利,即他们对每笔交易收取的费用。当价格与他们相反时,他们会赔钱(比如当他们购买价格下跌的资产,或者出售价格上涨的资产。)
不幸的是,对于做市商来说,市场价格往往与他们相反,这种现象被称为逆向选择。发生这种情况,是因为拥有有关未来价格走势信息的交易者,更有可能与做市商进行大额交易。
一般而言,最危险的订单就是那些规模又大又紧急的订单,因为这些订单正是知情交易者倾向于下的订单类型。因此,最基本的做市策略就是淡化入市订单,即当大量买入订单进来时,调高价格;当大量卖出订单进来时,调低价格。
在过去的一年中,以Uniswap为首的自动化做市商 (AMM) 在以太坊上变得非常受欢迎,这些AMM每天处理数十亿美元的交易量。顾名思义,AMM 自动化了大部分的做市过程。
恒定乘积公式是一个简单的规则,它允许任何人立即为一对新资产创建新市场和新AMM。
为了在两个资产 X 和 Y 之间创建新的乘积 AMM (CPAMM) ,称为流动性提供者(LP)的用户存入这两种资产的x和y储备金。
这些资产在任何给定时间的比率代表 AMM 上的即时价格。例如,如果 CPAMM 的储备中包含 2,000 USDC 和 1 ETH,则ETH 的瞬时价格将为 2,000 USDC。
当交易者与 AMM 进行交易时,它会根据公式x * y = k决定给他们什么价格,其中 x 和 y 是储备规模,k 是常数。这意味着其储备规模的乘积在交易期间保持不变(忽略费用)。
例子:
考虑一个ETH/USDC CPAMM,其储备中有 2,000 USDC 和 1 ETH,因此此时x = 2,000、y = 1 以及 x * y = k = 2,000。该 AMM 的瞬时价格为每 ETH 2,000 / 1 = 2,000 USDC。
如果交易者来购买价值 2,000 USDC 的 ETH,这意味着他们将 2,000 USDC 存入 X 储备,因此我们的x变成了4,000(2000+2000)。
然后,由于 k = 2000,在这笔交易后,我们的y就变成了0.5 (y = x/k=2000/4000)。由于y最初是 1,因此有0.5 ETH流向了交易者。
由于交易者用 2000 USDC 购买了 0.5 ETH,因此他们支付的ETH平均价格为4,000 USDC。
价格影响与逆向选择
在上述情况下,交易员必须为其大额订单支付4000美元/ETH,而小额订单的成本仅为2000美元/ETH。这种价格差异被称为订单的价格影响。订单越大,价格影响(滑点)就越大。
这就是AMM对抗逆向选择的方式:大订单更有可能和内幕消息有关,因此AMM让他们付出了高昂的代价,它是淡化订单的自动化等价物。
正如我们所看的,在单笔交易中对AMM执行一个大订单是昂贵的,这篇优秀的文章深入探讨了这个问题,并推荐了一些解决方案。
简而言之,希望在 AMM 上执行大订单的交易者不应该在单笔交易中执行:他们最好将订单分成几个部分。这可能涉及一次向多个 AMM 发送订单,但这些 AMM 在任何给定时间点的流动性也有限。订单越大,随着时间的推移将其拆分就越有吸引力。
例如,假设一个投资者想在链上购买价值1 亿USDC的 ETH。他们没有关于ETH价格的任何短期信息,因此不介意其订单是否需要一些时间来执行。在这种情况下,他们可能会将订单拆分成10个小订单,每个订单1000万美元,并且每隔1个小时执行一次,从而减小订单的价格影响。
很明显,如果一个非常大的订单被拆分成几个部分,每个单独的子订单仍然会很大,并且会相应地产生价格影响。将订单分成更小的部分会有所帮助,但这会引入两个新的问题。
第一个问题是操作复杂性,这意味着风险和工作量的增加。交易者可能会为给定的交易输入错误的交易数量或错误的方向。或者她的计算机可能会崩溃,从而阻止她执行部分订单。即使一切顺利,这个过程也需要时间与精力,它会分散人们对更有利可图的努力的注意力。
第二个问题是每笔交易都会产生固定的交易成本,例如支付给以太坊矿工处理交易的 gas。如果交易者将她的订单分成太多部分,其最终可能在交易费用上消耗的资金超过了其实际购买到的ETH。
在传统金融领域,如果投资者或机构想购买 1 亿美元的苹果股票,他们不会直接向交易所发送 1 亿美元的市场买单。他们也不会发送 10 个价值1000万美元的订单,而对于没有专门的交易人员和基础设施的大多数人来说,将订单分成比这小得多的部分是不切实际的。
相反,他们很可能会将大笔订单发送给经纪商,经济商会为他们进行算法交易以换取费用。经纪商将在指定的时间段内执行交易,比如八小时,并且价格类似于某个基准。经纪商将有一个专门负责安全且廉价地执行此类交易的团队。
也许最基本的算法交易类型是时间加权平均价格或TWAP(发音为“tee-whap”)订单。顾名思义,在八小时内购买价值 1 亿美元的苹果股票的 TWAP 订单,将以接近该时期苹果股票时间加权平均价格的价格成交。
例如,如果苹果股票在四个小时的定价为 100 美元,另外四个小时的定价为 120 美元,那么时间加权平均价格将为($100*4+$120*4)/8=$110,经纪商将执行接近该价格的TWAP订单。
细节各不相同,但经纪商最有可能通过在一天内将其分成许多个小块并将它们发送到市场来执行此交易。在 8 小时内购买 1 亿美元的苹果股票,相当于每 100 毫秒购买大约 350 美元的苹果股票,我们可能预计经纪商或多或少会这样做。
经纪商拥有减少或消除如此多小额交易的操作复杂性的基础设施,并且由于他们与市场有直接联系,因此可能无需支付太多的交易成本。
时间加权平均做市商 (TWAMM) 提供 TWAP 订单的链上等价物。TWAMM 具有用于订单拆分的专门逻辑以及与嵌入式交易所的直接连接,以低 gas 成本提供平稳执行。套利者将 TWAMM 嵌入式交易所的价格与市场价格保持一致,确保在资产的时间加权平均价格附近执行。
每个 TWAMM 实例促进特定资产对之间的交易,例如 ETH 和 USDC。
TWAMM 包含一个嵌入式 AMM,这是这两种资产的标准恒定乘积做市商。任何人都可随时使用这个嵌入式 AMM 进行交易,就好像它是一个普通的 AMM。
交易者可以向 TWAMM 提交长期订单,这些订单是在固定数量的区块上出售固定数量资产的订单 -例如,在接下来的 2,000 个区块中出售 100 ETH 的订单。
TWAMM 将这些长期订单分解为无限多个无限小的虚拟子订单,这些子订单随着时间的推移以均匀的速率与嵌入式 AMM 进行交易。单独处理这些虚拟子订单的交易将花费无限的 gas,但封闭形式的数学公式允许我们仅在需要时计算它们的累积影响。
随着时间的推移,长期订单的执行将推动嵌入式 AMM 的价格远离其他市场的价格。发生这种情况时,套利者将根据嵌入 AMM 的价格进行交易,使其恢复一致,从而确保长期订单的良好执行。
例如,如果长期卖出使得嵌入式 AMM 上的 ETH 比特定中心化交易所便宜,套利者将从嵌入式 AMM 购买 ETH,使其价格回升,然后在中心化交易所出售以获取利润。
区块(Block):以太坊将交易捆绑成称为区块(Block)的连续组,大约每13秒一次。出于本文的目的,我们将对每个区块进行编号:区块1之后是区块2,然后是区块3,依此类推。
矿工(Miner):分布式矿工组竞争处理每个区块。任何能连接互联网的人都可以成为矿工,这意味着在以太坊上运行的AMM 之类的程序不能保守任何秘密:每个人都必须能够准确地计算出在给定输入的情况下他们会做什么。
Gas: 以太坊上的计算是一种稀缺资源,因此用户必须以 gas 的形式向矿工支付费用。给定交易中涉及的计算越多,它消耗的Gas就越多。这种gas费用完全由提交交易的人支付。
长期订单:Alice 想在接下来的 8 小时内购买价值 1 亿USDC的 ETH,即大约 2,000 个区块。她在 TWAMM 中输入了一个长期订单,以在接下来的2,000 个区块购买价值 1 亿USDC的 ETH,或每个区块 50,000 USDC。
如上所述,我们事先不知道哪些矿工将在 TWAMM 上处理未来的交易。这意味着 Alice 的订单必须对所有人可见,从而引入了我们在下面讨论的信息泄漏问题。
订单池:Bob 想在接下来的 5,000 个区块中将500 ETH兑换成USDC,或者每个区块出售 0.1 ETH。
Charlie 想在接下来的 2,000 个区块中将100 ETH兑换成USDC,即每个区块出售 0.05 ETH。
直到Charlie的订单在 2,000 个区块内到期,Bob和Charlie的订单将被分组到一个池中。
该 ETH 销售池将在接下来的 2,000 个区块中以每个区块 0.15 ETH 的速率出售 ETH。 Bob 将获得USDC池子的 ≈ 66%( 0.1/0.15),Charlie 将获得USDC池子的 ≈ 33%(0.05/0.15)。
虚拟订单:
对于接下来2,000 个区块的每一个区块,TWAMM 必须代表 Alice 购买价值 50,000 USDC 的 ETH,并代表 ETH 销售池出售 0.15 ETH以换取USDC。
我们可以想象,TWAMM 将这两个子订单中的每一个拆分为数万亿个微小的子子订单,我们称之为虚拟订单(实际上,是将它们分解为无数个无穷小的虚拟订单)。
然后 TWAMM 轮流针对其嵌入的 AMM 执行这些虚拟订单:第一个是 Alice 的虚拟订单,然后是 ETH 销售池的一个虚拟订单,然后是 Alice 的另一个虚拟订单,依此类推。
套利:
因为 Alice 购买的 ETH 要比 ETH 销售池出售的多得多,嵌入式 AMM 上的 ETH 价格将在每个区块经历上涨。
当这个价格相对于其他地方的 ETH 价格足够高时,套利者将在其他交易所购买更便宜的 ETH 并在嵌入式 AMM 上出售,使其价格回到市场平均水平,并确保 Alice 的良好执行。
订单到期:
在第 2,000 个区块之后,Alice 的订单将被完全执行,Charlie 的订单也是如此。 而Bob 出售 ETH 的订单在接下来的 3,000 个区块内仍然有效,在此期间 TWAMM 将继续以每个区块 0.1 ETH 的速度执行它。
除非有任何外部活动,否则随着时间的推移,这将推低嵌入式 AMM 上的 ETH 价格,这一次促使套利者在价格完全脱节后重新拉回至市场价。
经济学:
由于Alice、Bob或Charlie都不急于执行订单,因此其他市场参与者可以推断出,他们的订单所代表的逆向选择比其他情况下要少,并且可以为他们提供低价格影响的执行。
由于 TWAMM 将是像Alice、Bob和Charlie这样的人进行交易的最佳场所,所以TWAMM嵌入式AMM上的LP可能会与他们这样的大量未知flow进行交互。这有助于从费用中赚钱,同时减少逆向选择的风险。
上面我们提到 TWAMM 将长期订单拆分为无限多个无限小的子订单。这样做有两个原因:平滑度和效率
平滑度
TWAMM 的主要目标是随着时间的推移平滑执行其长期订单,以便它们的执行价格接近现行的时间加权平均价。
随着我们减少虚拟交易的规模,AMM上的价格波动变得越来越不规则。
在极限状态下,由于有无限多个无限小的交易,当执行虚拟交易时,价格运动是完全平滑的。
见https://github.com/para-dave/twamm/blob/master/splitting_exploration.ipynb
效率
由于 TWAMM 旨在用于以太坊,因此为每个区块明确计算多笔虚拟交易的交易成本会高得惊人。然而,当我们有无限多个无限小的交易时,我们可以在一次计算中计算交易者的结果(无论自上次检查以来已经有多少个区块)。
TWAMM 将虚拟子订单视为发生在区块之间的空间中,这对于避免三明治攻击而言是很重要的。
为了以一种节省gas的方式实现这一点,TWAMM 使用了延迟计算(Lazy Evaluation),仅在需要确定交互结果时才计算虚拟交易的影响。
每次用户与TWAMM 交互时(例如,通过使用嵌入式 AMM 进行交易或添加新的长期订单),TWAMM 都会追溯计算自上次交互以来发生的所有虚拟交易的影响。
由于这些虚拟交易仅与 TWAMM 的嵌入式 AMM 交互,因此 TWAMM 的行为在外部交互之间是完全确定的。即使 TWAMM 在外部交互之间移动了 100 万个区块,下次有人与之交互时,它也能够准确计算所有介入虚拟交易的结果。
插入 TWAMM 的前端将能通过跟踪当前区块编号并自行进行 TWAMM 计算来考虑尚未在链上表示的虚拟交易。
汇集订单
如示例所示,当我们在同一方向有多个长期订单(即出售ETH并兑换成USDC)时,我们将它们汇集在一起,然后将它们拆分为虚拟订单。然后,TWAMM 可使用用于跟踪 Compound 和 Uniswap 等协议中LP 奖励的十亿美元算法?来跟踪余额。
从技术上讲,每个TWAMM总是有两个长期订单池(每个资产一个):例如,卖 USDC 的订单池和卖 ETH 的订单池。在任何给定时间,这些订单池中的一个或两个可能是空的。
长期订单到期
将订单池与延迟计算结合使用时会出现一种复杂情况。
想象一下,Bob 下订单在接下来的 100 个区块中出售 100 ETH,而 Charlie 下订单在接下来的 200 个区块中出售 200 ETH。这两个订单都以每个区块1 ETH 的速率出售。
假设在接下来的 150 个区块中没有人与TWAMM 交互,此时会发生新的外部交互。他们的第一批订单是Bob和Charlie的共同订单,每个区块卖出2 ETH。然而,在那之后的50个区块,Charlie的订单是独立的,每个区块只卖出1 ETH。
这意味着我们必须进行两次单独的交易计算才能找出发生了什么:一次计算前 100 个区块的结果,一次计算后 50 个区块的结果。在最坏的情况下,如果过去 150 个区块的每个区块都有订单到期,这意味着 TWAMM 将不得不为每个区块处理一笔交易,从而破坏 gas 效率。
对此最简单的解决方法,是限制符合订单到期条件的区块数量:例如,TWAMM 可以指定订单只能每 250 个区块到期一次,或者大约每小时一次。
取消长期订单
用户可以随时取消长期订单。在实践中,这允许用户为他们的订单选择取消时间。这不会增加系统的 gas 负担,因为想要取消的用户需要自己支付 gas费用。
定义:
假设自 TWAMM 上次执行任何虚拟交易以来已经有 t 个区块。
为简单起见,假设没有长期订单过期,因此在整个时间段内,出售 X 的池子以每区块x_rate的速率出售,而出售 Y 的池子在整个时间段内以每个区块y_rate的速率出售。
那么在此期间售出的 X 总量为
,而在此期间售出的 Y 总量为
让我们将时间段开始时嵌入的 AMM 储备分别表示为
公式:
在处理完所有虚拟交易后,嵌入式 AMM 将有 X 储备
从这个恒定乘积公式,我们知道
出售 X 的池子获得了所有没有出现在嵌入式 AMM 中的 Y,换句话说,
以及类似的,
描述:在三明治攻击中,攻击者 Atticus 看到交易者 Trey 即将在 AMM 上进行一笔交易,随后Atticus 发送了两个订单并夹住了Trey 的订单,以此实现获利。
想象一下,Trey 向 AMM 发送了一笔用 USDC 购买 ETH 的订单。而攻击者 Atticus 在看到这个订单后,抢先在rey 之前在 AMM 上购买 ETH,以此推动ETH价格上涨。由于他正在向 AMM 支付费用并产生价格影响,因此 Atticus 在操作完这个订单后是亏钱的。
当Trey 的订单被执行时,他会以更高的价格购买ETH,因为Atticus 推高了价格,而Trey的订单进一步推高了ETH的价格。
现在,Atticus 立即将他的 ETH 卖回给 AMM,此时他卖出的价格要高于其买入的价格,因此能够实现盈利。
如果 Atticus 能够保证在 Trey 购买后立即将他的 ETH 卖回给 AMM,那么这种攻击对 Atticus 才有意义。在给定的区块内,如果 Atticus 是一名矿工、与某个矿工达成交易或使用 Flashbots 之类的服务,则这是可能的。
三明治攻击和虚拟订单
乍一看,虚拟订单似乎特别容易受到三明治攻击,因为每个人都知道它们会来。
但由于它们在** 区块之间执行,因此要进行攻击是不容易的,要夹住 TWAMM 的虚拟订单的攻击者必须在一个区块的末尾与嵌入的 AMM 进行交易,导致虚拟订单在区块之间以糟糕的价格执行,然后在另一个方向交易,在下一个区块开始时结束交易。
目前,攻击者没有办法保证实施这类攻击。当这种多区块MEV变得更加普遍,允许交易者在多个区块之间进行夹心交易时,这可能会成为一个更大的问题。
长期交易者在 TWAMM 中可能遇到的最大权衡是,他们在下公开可见订单时会面临信息泄露的问题,这是以太坊的性质所导致的。
如果一个交易者下了足够大的长期订单,其他交易者可能会试图抢先在TWAMM的嵌入式AMM和其他地方购买资产,以便在长期订单推高价格后将其出售给交易者。
由于用户可以随时取消他们的长期订单,我们预计过于激进的抢先交易者会被其他交易者利用,从而控制信息泄漏的整体影响。
想象一下,者Sally已经注意到 TWAMM 上的攻击性抢先交易,她从流动性聚合商那里购买了价值100 万USDC的 ETH,从而推高了整个市场的价格。然后她在 TWAMM 上下了一个巨大的长期订单,在接下来的 24 小时内每个区块购买 10 万USDC的 ETH。
抢先交易者Frank立即看到了这个订单,并通过聚合器购买了价值100万 USDC的ETH,进一步推高了价格。Sally 通过聚合商卖回她的 ETH 以获取利润,这导致ETH价格下降,并让Frank 蒙受损失。最后,她在任何订单完成之前取消了她的长期订单。
你可以在此处?查看 TWAMM 的 Python 参考实现。
这个 Jupyter 笔记?演示了TWAMM在多个长期订单和套利者存在下的情况。
为了简单起见,这个Python版本并没有实施gas优化,比如订单池顺序或真正的延迟计算。
我们已经勾勒出了TWAMM的设计,但我们的工作才刚刚开始。如果你有兴趣解决此问题或类似问题,可以发邮件至dave@paradigm.xyz或者在Twitter上给我发私信,或者你也可以通过ideas@uniswap.org联系Uniswap Labs。
致谢:Sam Sun, Georgios Konstantopoulos, Michael Bently, Michael Kustermann, Kevin Pang, Hasu, Sam Bankman-Fried, Henry Prior, Tom Cadwell, Alex Wice, Mewny, Big Magic, Lily Francus, Tarun Chitra, Moody Salem, Noah Zinsmeister, Teo Leibowitz。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。