Time-Weighted Average Market Maker (TWAMM)

AuthorDave White:Paradigm研究员;Dan Robinson:Paradigm研究员;Hayden Adams:Uniswap创始人

Translate:LI KE

时间加权平均做市商(TWAMM)

目录 

1.介绍

2.概要

3.做市的基本概念

3.1.做市商

3.2.逆向选择

4.自动化做市商

4.1.恒定乘积公式

5.在目前的AMM上执行大订单

5.1.手动拆分订单

5.2.子订单大小权衡

6.传统金融类比

6.1. TWAP 订单

7.时间加权平均做市商

7.1.概述

7.2.以太坊基本常识

7.3.基本设计

7.4.无穷小虚拟订单

8.部署

8.1.懒惰求值

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隐瞒了什么信息。

今天,Alice的最佳选择是手动将她的订单分成几部分并在几个小时内执行,让市场有时间意识到她没有内幕消息,从而为她提供更好的价格。

如果她发送几个大的子订单,每个订单仍然会对价格产生重大影响,并且容易受到敌对交易者的三明治攻击。另一方面,如果她发送许多小的子订单,她将承担所有巨大工作量和风险,并向矿工支付每笔交易的gas费,因此付出高额成本。

TWAMM可以代表Alice进行交易为她解决了这个困境。将Alice的订单分解成无数个无限小的虚拟订单,以确保在一定时间内完美地顺利执行订单,并且,使用嵌入式AMM 的特殊数学算法,在这些虚拟订单中分摊gas成本。因为它在区块间(不是区块中)处理交易,所以它也不太容易受到三明治攻击。



做市的基本概念



做市商

考虑两种金融资产的市场,例如USDC和ETH。做市商是这个市场的参与者,它愿意在任何时候用其中一种资产去交易另一种资产。

如果你有1亿USDC并想用它来购买 ETH,你可能无法在同一时间找到一个交易对手。相反,您很可能会去一个由一个或多个做市商组成的市场,并与他们进行交易。

逆向选择

做市商从价差中获利,实际上是他们对每笔交易收取的费用。当价格对他们不利时,他们会赔钱——比如当他们购买后,价格下跌,或者卖出后,价格上涨。

不幸的是,对于做市商来说,价格往往与他们相反。这种现象被称为“逆向选择”。发生这种情况是因为了解未来价格走势信息的交易者更有可能与做市商进行大额交易,此时做市商处于弱势。

最危险的是既大又紧急的订单,因为这些订单正是内幕交易者倾向于下的订单类型。因此,最基本的做市策略是“淡入订单”,当有大买单时调高价格,当有大卖单时调低价格。

自动化做市商(AMM)

在过去的一年中,以Uniswap为首的自动做市商 (AMM) 在以太坊上非常受欢迎,每天处理数十亿美元的交易量。顾名思义,AMM自动化了大部分做市过程。

恒定乘积公式

恒定乘积公式是一个简单的规则,它允许任何人立即为一对新资产创建新市场和新的AMM。

为了在两个资产X和Y之间创建新的恒定乘积AMM (CPAMM),流动性提供者或LP存入这两个资产的准备金x和y。

在任何时间点这些资产的比率代表AMM上的瞬时价格,或者它对一个非常小的订单收取的价格。例如,如果一个CPAMM的储备中包含2000 USDC和1 ETH,则其 ETH 的瞬时价格将为2000 USDC。

当交易者与AMM进行交易时,它会根据公式 **x * y = k 决定给他们什么价格,其中 x 和 y是储备大小,k是常数。这意味着其储备大小的乘积在交易期间保持不变(忽略费用)。

举一个例子

假设一个有ETH/USDC的CPAMM,其储备中有2000 USDC 和1 ETH,因此 x = 2000、y = 1 和 x * y = k = 2000。该AMM中每个ETH的瞬时价格为 2000 / 1 = 2000 USDC。

如果交易者来购买价值2000 USDC的ETH,这意味着他们将 2000 USDC 存入X储备,因此我们将有 x = 2000 + 2000 = 4000。

然后,由于k = 2000,我们一定在交易后得到 y = k/x = 2000/4000 = 0.5。由于y最初是1,因1 – 0.5 = 0.5 ETH一定已经流向了交易者。

因为交易者用2000 USDC 购买了0.5 ETH,因此他们支付的平均价格为每个ETH 4000 USDC。瞬时的过高价格反映了AMM的流动性对大订单价格的影响。

价格影响和逆向选择

在上述情况下,当小订单的成本仅为每个ETH 2000 USDC时,而交易者必须为其大订单支付每个ETH 4000 USDC的价格。这种价格差异称为订单的价格影响。下的订单越大,对价格的影响就越大。

这就是AMM对抗逆向选择的方式:大订单交易者更有可能掌握不对称内幕信息,因此AMM使他们付出高价,它相当于自动淡入订单。

在目前的AMM上执行大订单

手动拆分订单

正如我们看到,在AMM上的单笔交易大订单的成本设计得很高。这篇优秀的文章深入探讨了这个问题,并推荐了一些解决方案。

简而言之,在AMM上交易大订单时不应在单个交易中执行:最好将订单分成几部分。这可能涉及一次向多个AMM发送订单,但这些AMM在任何给定时间点的流动性也有限。订单越大,随着时间的推移将其拆分就越有吸引力。

例如,假设一个投资者想在链上购买1亿USDC的ETH。他们没有任何关于ETH的短期内幕消息,因此不介意多花一些时间来执行订单。此时,他们可以将大订单分成10个,每个1000万USDC,每隔一小时执行一个,从而限制每部分的价格影响。

子订单大小权衡

很明显,如果一个非常大的订单被分成几个小的,但每个子订单仍然很大,并且会相应地产生价格影响。将订单分成更小的部分会有所帮助,但这会引入两个新的问题。

第一个问题是操作复杂性,这意味着风险和工作量增加。交易者可能会输错交易数量或把买卖搞错。或者她的计算机可能会崩溃,从而影响执行部分订单。即使一切顺利,这个过程也很花时间和精力,会分散人们对更有利可图的事情的注意力。

第二个问题是每笔交易都会产生固定的交易成本,比如支付给以太坊矿工的gas费。如果交易者将他的订单分成太多部分,她最终可能花的交易费比实际购买ETH的钱还多。

传统金融类比

在传统金融领域,如果投资者或机构想购买1亿美元的苹果股票,他们不会直接向交易所发送1亿美元的买单。他们也不会发送10个1000 万美元的订单。对于没有专门的交易人员和基础设施的大多数人来说,将订单分成比这小得多的部分是不切实际的。

相反,他们很可能会将大笔订单发送给经纪人,经纪人会为他们提供算法交易服务以收取费用。经纪人将在指定的时间段内(比如八小时)以某个价格基准执行交易,因为经纪商有专门负责安全和降低交易成本的团队。

TWAP(时间加权平均价格)订单

也许最基本的算法交易类型是时间加权平均价格或TWAP(发音为“tee-whap”)订单。顾名思义,在八小时内购买1亿美元的苹果股票的TWAP订单,将以该时间段苹果股票时间加权平均价格成交。

例如,如果苹果股票在这段时间内其中四个小时价格​100美元,四个小时价格为120 美元,那么时间加权平均价格将为 ($100 4 + $120 4)/8 = $110,经纪人将以大概这个价格执行该TWAP订单。

细节可能稍有相同,但经纪商很有可能在一天内将这个大订单分成许多个小订单来执行。在 8小时内购买1亿美元的苹果股票相当于每100毫秒购买大约 350 美元的苹果股票,估计经纪人大概会这样做。

经纪商拥有足够的基础设施,来减少如此多小额交易的操作复杂性,并且由于它们与市场有直接联系,因此可能无需支付太多的交易成本。

时间加权平均做市商(TWAMM)

重点来了,时间加权平均做市商 (TWAMM) 在链上提供类似于的TWAP(时间加权平均价格)交易功能。TWAMM拥有订单拆分的专门逻辑,它与嵌入式交易所直接关联,以低gas成本平滑地执行订单。套利者的买卖套利行为使TWAMM的嵌入式交易所的价格与市场价格保持一致,确保交易在资产的时间加权平均价格范围内执行。

概述

每个TWAMM实例促进特定资产对之间的交易,例如ETH和USDC。

TWAMM包含一个嵌入式AMM(自动做市商),即这两种资产的标准恒定乘积做市商。任何人都可以随时使用这个嵌入式AMM进行交易,就像普通AMM一样。

交易者可以向TWAMM提交长期订单,这些订单是在固定数量的区块上出售固定数量的一种资产的订单——例如,在接下来的 2000 个区块中出售100 ETH的订单。

TWAMM将这些长期订单分解为无限多个无限小的虚拟子订单,这些子订单在一定时间内以均匀的速率与嵌入式AMM进行交易。如果单独处理这些虚拟子订单将花费无限多gas,但一个封闭型的数学公式允许我们仅在需要时才计算它们的累积影响。

随着时间的推移,长期订单的执行将推动嵌入式AMM的价格远离其它市场的价格。发生这种情况时,套利者将根据嵌入式AMM的价格进行交易,使其恢复平衡,从而确保长期订单的良好执行。

例如,如果长时卖出使得嵌入式AMM上的ETH比中心化交易所便宜,套利者将从嵌入式AMM购买ETH,使其价格回升,然后在中心化交易所出售以获取利润。

以太坊基本常识

区块

以太坊将交易捆绑成连续区块,大约每13 秒一个区块。出于本文的目的,我们将对每个块进行编号:区块1之后是区块 2,然后是区块3,依此类推。

矿工

分布式矿工竞争着处理每个块。任何连接互联网的人都可以成为矿工。这意味着在以太坊上运行的AMM之类的程序没有秘密可言:每个人都能够通过给定的输入计算出他人会做什么。

Gas费

以太坊上的计算量是一种稀缺资源,因此用户必须以gas的形式向矿工支付费用。交易中涉及的计算量越大,它消耗的Gas费就越多。这笔gas费用完全由提交交易的人支付。

基本设计

长期订单

Alice想在接下来的8小时内购买1亿USDC的ETH,通过大约2000个区块。她在TWAMM中输入了一个长期订单,通过2000个区块购买1 亿USDC的 ETH,每个区块50,000 USDC。

如上所述,我们事先不知道哪些矿工将处理TWAMM上的未来交易。这意味着Alice的订单对所有人可见,从而引起了我们将在下面讨论的信息泄漏问题。

订单池

Bob想在接下来的5,000个区块中把500 ETH卖成USDC,即每个区块出售 0.1 ETH。

Charlie想在接下来的2000个区块中把100 ETH卖成USDC,即每个区块出售0.05 ETH。

在Charlie的订单在2000个区块处理完成前,Bob和Charlie 的订单将被组合到一个订单池中。

该ETH销售池将在接下来的2000个区块中以每个区块0.15 ETH的速度出售 ETH。Bob 将获得池中USDC的0.1/0.15 ≈ 66%。Charlie 将获得矿池中USDC的0.05/0.15 ≈ 33%。

虚拟订单

假如在接下来的2000个区块,TWAMM 需要代表Alice购买价值50,000 USDC的ETH,并代表ETH销售池以USDC出售0.15 ETH。

我们可以想象,TWAMM将这两个订单分别拆分为数万亿个微小的子订单,我们称之为虚拟订单(实际上,它将它们分解为无数个无穷小的虚拟订单)。

然后TWAMM通过其嵌入式AMM轮流执行这些虚拟订单:第一个是 Alice的虚拟订单,然后是ETH销售池的一个虚拟订单,然后是Alice的另一个虚拟订单,依此类推。

套利

因为Alice购买的ETH比ETH池出售的多得多,嵌入式AMM上的ETH价格将逐个区块上涨。

当这个价格相对于其他地方的ETH价格足够高时,套利者将在其他交易所购买更便宜的 ETH并在嵌入式AMM上出售,使其价格与市场平均水平保持一致并确保Alice的订单得到良好执行。

订单到期

在第2000个区块之后,Alice的订单将被执行完成,Charlie的也是如此。Bob出售ETH的订单在接下来的3,000个区块内仍然有效,在此期间TWAMM将继续以每个区块0.1 ETH 的速度执行它。

除非有任何外部活动,嵌入式AMM上的ETH价格将逐渐降低,这将促使套利者在价格完全脱节后将其重新拉回平均水平。

经济学

因为Alice、Bob或Charlie都不急于执行他们的订单,其他市场参与者可以推断出他们的订单存在较小的“逆向选择”可能性,因此为他们提供低价格影响的订单执行。

因为TWAMM将成为Alice、Bob和Charlie 等人进行交易的最佳场所,嵌入了TWAMM的AMM中的LP将倾向于与这样的非内幕信息大订单进行交易。这有助于 LP 从费用中赚钱,同时减少他们面对逆向选择的风险。

无穷小虚拟订单

上面我们提到TWAMM将长期订单拆分为无限多个无限小的子订单。这样做有两个原因:平滑度和效率。

平滑度

TWAMM的主要目标是平滑的执行长期订单,以便以接近现行时间加权平均价格执行订单。

随着我们减少虚拟交易订单的大小,AMM上的价格变动变得越来越小。

在极限情况下,由于有无数个无限小的交易,执行虚拟交易时的价格变动将很平稳。

This image has an empty alt attribute; its file name is twamm1-1024x750.png

见 https://github.com/para-dave/twamm/blob/master/splitting_exploration.ipynb

效率

由于TWAMM被设计用于以太坊上,因此明确计算每个区块的多个虚拟交易将会费用惊人。然而,当我们有无限多的无穷小的交易时,我们可以一次性为交易者计算结果,无论自上次核对以来经过了多少个区块。

部署

懒惰求值

TWAMM将虚拟子订单视为发生在块之间,这能有效避免“三明治攻击”。

为了以一种节省gas费的方式实现这一点,TWAMM使用惰性评估,仅在需要确定交易结果时才计算虚拟交易的影响。

每次用户与TWAMM交互时(例如,通过使用嵌入式AMM进行交易或添加新的长期订单),TWAMM 都会追溯计算自上次交互以来发生的所有虚拟交易的影响。

由于这些虚拟交易仅与TWAMM的嵌入式AMM 交互,因此TWAMM的行为在外部交互之间是完全确定的。即使TWAMM在外部交互之间经过了100万个区块,下次有人与之交互时,它也能够准确计算所有介入虚拟交易的结果。

插入TWAMM的前端将能够通过跟踪当前区块编号,自行进行TWAMM计算来处理尚未在链上表示的虚拟交易。

Gas费优化

订单池

如示例所示,当我们在同一方向有多个长期订单(以把ETH卖为USDC为例)时,我们将它们组合在一起,然后将它们拆分为虚拟订单。然后,TWAMM 可以使用用于跟踪 Compound和Uniswap等协议中的LP奖励的“十亿美元算法”来跟踪余额。

从技术上讲,每个TWAMM总是有两个长期订单池,每个资产一个:例如,卖USDC的池和卖ETH的池。在某个时间,这些池中的一个或两个可能是空的。

长期订单到期

将订单池与惰性求值结合使用时会出现一种复杂情况。

想象一下,Bob下订单在接下来的100个区块中出售100 ETH,而Charlie下订单在接下来的200个区块中出售200 ETH。两个订单都以每块1 ETH的速度出售。

假设在接下来的150个块中没有人与TWAMM交互,此时发生了新的外部交互。在Bob和Charlie下订单后的前 100 个区块中,他们的订单被组合到一个共同订单中,即每个区块出售 2 ETH。然而,对于之后的50个区块,查理的订单是独立的,每个区块只出售1个 ETH。

这意味着我们必须进行两次单独的交易计算才能找出发生了什么:一次计算前100个区块的结果,一次计算最后50个区块的结果。最糟糕的是,如果过去150个区块的每个区块都有订单到期,这意味着TWAMM将不得不每个区块处理一笔交易,从而破坏gas效率。

对此最简单的解决方法是限制允许订单到期的区块数:例如,TWAMM 可以指定订单只能每250个区块到期一次,或者大约每小时一次。

取消长期订单

用户可以随时取消长期订单。在实践中,这允许用户为他们的订单选择取消时间到具体区块。这不会增加系统的gas负担,因为想要取消的用户自己支付gas。

虚拟交易数学公式

定义

假设自TWAMM上次执行任何虚拟交易以来已经有t个区块。

This image has an empty alt attribute; its file name is Screen-Shot-2021-09-21-at-6.47.40-PM-791x1024.png



潜在的攻击载体

三明治攻击

描述

三明治攻击中,攻击者Atticus看到交易者Trey即将在AMM上进行交易。Atticus发送两个订单,像三明治一样夹住Trey的订单,从而从中获利。

想象一下,Trey向AMM发送了一个以USDC购买ETH的订单。看到这个,Atticus赶在Trey之前下单在AMM上购买ETH,以推高价格。由于他正在向AMM支付费用并产生价格影响,因此导致Atticus在此订单上亏损。

当Trey的订单被执行时,他以比原本更高的价格购买ETH,因为Atticus推高了价格,Trey的订单继续将价格推得更高。

现在,Atticus将他的ETH卖回给 AMM。由于Trey的买入,推高了AMM上ETH的价格,因此Atticus卖出的价格高于买入的价格,并从中盈利。

如果Atticus能够保证在Trey购买后立即将他的ETH卖回给AMM,那么这种攻击对 Atticus才有意义。在给定的区块内,如果Atticus是一名矿工、与某个矿工达成交易或使用 Flashbots 之类的服务,则这是可能的。

夹心和虚拟订单

乍一看,虚拟订单似乎特别容易受到三明治攻击,因为每个人都可以看得到。

但由于虚拟订单在块之间执行,因此得以幸免。想要夹住TWAMM的虚拟订单进行攻击,必须在一个区块的末尾与AMM 进行交易,导致虚拟订单在区块间以较高的价格执行,然后在下一个块进行反向操作。

目前,攻击者没有办法保证会在给定区块的末尾进行交易,以及可以在下一个区块的开始进行交易。当这种多区块矿工可提取价值变得更加普遍时,允许交易者在多个区块之间进行三明治攻击,这可能会成为一个更大的问题。

信息泄露

长时交易者在TWAMM中可能遇到的不好的一点是,因为他们的订单是公开可见的,这就面临信息泄漏的可能,这是以太坊的性质决定的,所以透明也有两面性。

如果交易者下了一个足够大的长期订单,其他交易者可能会发起抢先交易攻击,在TWAMM嵌入式 AMM或其他地方购买,以便在价格推高后再以高价卖回给交易者。

由于用户可以随时取消他们的长期订单,我们预计过于激进的抢先交易者会被其他交易者利用,从而使信息泄漏的影响整体可控。

举个例子

螳螂捕蝉黄雀在后,想象一下,骗子Sally(黄雀)已经注意到TWAMM上的攻击者。她从TWAMM购买100万美元的 ETH,推高ETH的价格。然后她在TWAMM上假装下了一个巨大的长期订单,在接下来的24小时内每个区块购买10万美元的ETH。

三明治攻击者Frank(螳螂)立即看到了这个订单(他不知道该订单是引诱他的),并通过TWAMM购买了100万美元的ETH,进一步推高了价格。这时Sally通TWAM卖出她的ETH以获取利润,推低价格并让Frank蒙受损失。最后,她在任何订单完成之前取消了她的那个巨大的长期订单。

Python部署参考

您可以在此处查看TWAMM在Python上的参考部署。

这个Jupyter笔记展示了TWAMM的交易演示,其中包含多个买卖双方相互抵消的长期订单,以及套利者如何套利并使价格平稳。

为简单起见,这个Python演示版本没有部署像订单池或真正的懒惰求值之类的gas优化。

结论

我们已经勾勒出TWAMM的设计图,但我们的工作才刚刚开始。

如果您有兴趣解决这个或类似的问题,您可以发送电子邮件至dave@paradigm.xyz 或在 Twitter上私信我,或通过ideas@uniswap.org联系Uniswap实验室。

Blockshell    Blog logo
Subscribe to Blockshell Blog and never miss a post.