这种名为时间加权自动做市商的新型 AMM,旨在帮助以太坊上的交易者有效地执行大额订单。

撰文: Dave White Dan Robinson Hayden Adams ,前两位为 Paradigm 研究合伙人,后者是 Uniswap 创始人
作者授权链闻发表该文中文版本

这篇论文介绍了一种新型的自动做市商(AMM),可帮助以太坊上的交易者有效地执行大额订单。

我们称其为时间加权自动做市商(TWAMM)(发音为「tee-wham」)。

它的工作原理是将长期订单分拆为无限多的无限小块,并利用嵌入式常数乘积 AMM,利用时间跨度顺利执行它们。

摘要

假设 Alice 想在链上购买价值 1 亿 USDC 的 ETH,在 Uniswap 等现有 AMM 上执行这种规模的订单,成本非常昂贵,它们必须向 Alice 收取高价,以防 Alice 知道一些他们不知道的事情。

在当前,Alice 的最佳选择是手动将她的订单分成几部分,并在几个小时内的时间内一一执行,让市场有时间意识到她没有内幕消息,这样可以给她一个更好的价格。

如果她发送了几个非常庞大的子订单,每个订单仍然会对价格产生重大影响,并且很容易受到恶意交易者的三明治攻击。另一方面,如果她发送很多小的子订单,她将不得不承担活跃交易的巨大工作负荷和风险,且逐笔交易支付 gas 费用,因此向矿工支付了高额成本。

TWAMM 可以通过代表 Alice 进行交易,帮她解决这个困境。TWAMM 将她的订单分拆成无数个无限小的虚拟订单,以确保利用时间跨度而完美地得到执行,并且使用的是嵌入式 AMM 的特殊函数公式,能够在这些虚拟订单中分摊 gas 成本。因为它在区块之间处理交易,所以它也不太容易受到三明治攻击。

做市的基本概念

做市商

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

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

逆向选择

做市商利用价差获利,实际上是他们对每笔交易收取的费用。当价格走势与其交易相反时(例如,当他们买进资产后,其价格随后下跌,或出售资产后价格随后上涨),他们会赔钱。

不幸的是,对于做市商来说,价格走势往往与他们的操作相反。这种现象被称为「逆向选择」。发生这种情况是因为,掌握价格未来走势信息的交易者更有可能与做市商进行大额交易。

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

自动做市商 (AMM)

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

恒定乘积公式

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

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

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

当交易者与 AMM 进行交易时, 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 的瞬时价格为 2,000 / 1 = 2,000 USDC/ETH。

一个交易者来了,要买 2000 USDC 的 ETH,这意味着他要在 x 储备中存入 2000 USDC,因此我们有 x=2000+2000=4000。

如 k = 2000,我们必须在上述交易后得到 y = k/x = 2000/4000 = 0.5。由于 y 最初是 1, 1 – 0.5 = 0.5 ETH, 因此上述交易者在此交易中获得了 0.5 ETH。

由于交易者用 2000 USDC 购买了 0.5 ETH,因此他们实际支付的平均价格为 4,000 USDC/ETH。高价格与瞬时价格这一关系,反映大规模订单与 AMM 的流动性息息相关。

价格冲击和逆向选择

在上述情况中,小订单的成本仅为 2,000 USDC/ETH 时,交易者却必须为其大规模订单支付 4,000 USDC/ETH 的高昂价格。这种价格差异称为订单的价格冲击。 传入的订单越大,对价格的冲击就越大。

这就是 AMM 对抗逆向选择的手段:大订单更有可能是在知情前提下发起交易,因此 AMM 使他们付出高昂的代价。它相当于自动化的淡入订单。

利用当前 AMM 执行大规模交易

手动分拆订单

我们可以看到,AMM 的设计机制决定了在 AMM 上执行单笔大额订单的成本很高。这篇精彩的 文章 深入探讨了这个问题,并推荐了一些解决方案。

简而言之,希望在 AMM 上执行大额订单的交易者不应该用单笔交易来执行:他们最好将订单分拆成几部分。这就会涉及一次向多个 AMM 发送订单,但这些 AMM 在任何给定时间点的流动性可能也有限。订单越大,利用时间跨度将其拆分就越有吸引力。

例如,假设一位投资者想在链上购买 1 亿 USDC 的 ETH。他们没有任何有关 ETH 价格的短期信息,因此不会介意自己的订单是否需要一些时间跨度来执行。在这种情况下,他们可能会将其订单拆分成 10 个部分,每个部分 1000 万美元,每隔一小时执行一个部分,从而限制每个部分受到的价格冲击。

子订单规模权衡

显然,如果一个非常大的订单被分成几部分,每部分单独的子订单仍然很大,也会相应地产生价格冲击。将订单拆分成更小的部分会取得降低成本的效果,但这会带来两个新的问题。

第一个问题是操作的复杂性,这意味着风险和工作量增加。交易者可能会把给定交易的输入值输错甚至选错方向。或者电脑可能会崩溃,导致她无法执行部分订单。即使一切顺利,这个过程也很耗费时间和精力,使人们无法专注于更有利可图的交易。

第二个问题是每笔交易都会产生固定的交易成本,例如支付给以太坊矿工处理交易的 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 提交长期订单,这些订单是在固定数量区块上出售固定数量的某种资产的订单——例如,在接下来的 2,000 个区块中售出 100 ETH 的订单。

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

在一定时间跨度内,长期订单的执行将推动嵌入式 AMM 的价格偏离其他市场的价格。发生这种情况时,套利者将在嵌入式 AMM 的价格基础上进行套利交易,使其与主流市场恢复一致,从而确保长期订单的良好执行。

例如,如果长期卖单使得嵌入式 AMM 上的 ETH 价格比某一特定中心化交易所的价格更便宜,套利者将从嵌入式 AMM 买进 ETH,导致其价格在该 AMM 上回升,然后在中心化交易所售出以获取利润。

以太坊中的基本概念

区块

以太坊将交易捆绑成区块的连续组,大约每 13 秒产出一次区块。本文为了解释得更清楚,我们将对每个区块进行编号:区块 1 之后是区块 2,然后是区块 3,依此类推。

矿工

呈分布式状态的矿工团队竞争处理每个区块。任何有互联网连接的人都可以成为以太坊矿工。这意味着在以太坊上运行的 AMM 之类的应用不能保守任何秘密:每个人都必须能够准确地计算出在给定输入的情况下他们会做什么。

Gas

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

基本设计原理

长期订单

Alice 想在接下来的 8 小时(大约 2,000 个区块)内购买价值 1 亿 USDC 的 ETH。她在 TWAMM 中输入了一个长期订单购买价值 1 亿 USDC 的 ETH,横跨 2,000 个区块,或每个区块 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。矿池以这种方式赚取的 USDC 中,Bob 将获得其中 0.1/0.15 ≈ 66%, Charlie 将获得其中的 0.05/0.15 ≈ 33%。

虚拟订单

对于接下来 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 可能会与像他们一样的大量不知情交易流进行交互。这有助于 LP 从交易费用中赚钱,同时减少他们遭遇逆向选择的风险。

无穷小虚拟订单

我们前文提到 TWAMM 将长期订单拆分为无限多个无限小的子订单。这样做有两个原因:流畅性和效率。

流畅性

TWAMM 的主要目标是在时间跨度内平稳执行其长期订单,以便它们以接近主流时间加权平均价格的价格执行。

随着我们将虚拟交易的规模尽可能小地压缩,AMM 上的价格变动曲线变得越来越平。

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

Uniswap 创始人与 Paradigm 研究团队勾勒新做市模型 TWAMM 请参阅 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 个区块, Charlie 的订单是独立的,每个区块只出售 1 个 ETH。

这意味着我们必须进行两次单独的交易计算,才能发现发生了什么:一次计算前 100 个区块的结果,一次计算最后 50 个区块的结果。在最坏的情况下,如果过去 150 个区块中每个区块都有订单到期,这意味着 TWAMM 将不得不每个区块处理一笔交易,原本期待的节省 gas 的效率将大打折扣。

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

取消长期订单

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

虚拟交易数学

定义

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

为简单起见,假设没有长期订单过期,因此在整个时间段内,出售 X 的矿池在每个区块中出售 x rate ,而出售 Y 的矿池在整个时间段内在每个区块中出售 y rate

那么在此期间售出的 X 的总量是 tx rate =x in ,而在此期间售出的 Y 的总量是 ty rate =y in

让我们将时间段开始时嵌入的 AMM 资产储备额分别设定为 x ammStart 和 y ammStart

公式

在处理完所有虚拟交易后,嵌入式 AMM 中的 X 储备额为

Uniswap 创始人与 Paradigm 研究团队勾勒新做市模型 TWAMM

同时

Uniswap 创始人与 Paradigm 研究团队勾勒新做市模型 TWAMM

从常数乘积公式,我们得出

Uniswap 创始人与 Paradigm 研究团队勾勒新做市模型 TWAMM

出售 X 的矿池获得了所有没有出现在嵌入式 AMM 资产储备中的 Y——换句话说,

Uniswap 创始人与 Paradigm 研究团队勾勒新做市模型 TWAMM

同样,

Uniswap 创始人与 Paradigm 研究团队勾勒新做市模型 TWAMM

潜在的攻击向量

三明治攻击

描述

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

想象一下,Trey 向 AMM 发送了一个用 USDC 购买 ETH 的订单。看到这一交易后,Atticus 在 Trey 之前下单在 AMM 上购买 ETH,推动价格上涨。由于他向 AMM 支付费用并产生价格冲击,因此 Atticus 在这一订单上将亏损。

当 Trey 的订单被执行时,他被迫以他原本更高的价格购买 ETH,因为 Atticus 推高了价格。Trey 的订单进一步推高了价格。

现在,Atticus 将他的 ETH 卖回给 AMM。由于自 Trey 的买入已经推高了 AMM 上的价格,因此 Atticus 卖出的价格高于其买入的价格,并且能够实现盈利。

如果 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,进一步推高了 ETH 的价格。Sally 通过聚合器卖回她的 ETH 以获取利润,压低价格并让 Frank 蒙受了损失。最后,她取消了她根本没付诸执行的长期订单。

Python 参考实现

大家点击 这里 可以看到一个 Python 参考实现。

Jupyter 笔记 演示了具有多个对冲长期订单和套利者的 TWAMM 的价格行为走势。

为简单起见,这个 Python 版本没有实现像订单池或真正的惰性求值之类的 gas 优化方案。

结尾

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

如果您有兴趣解决这一问题或类似问题,可以发送电子邮件至 [email protected] 或在 Twitter 上私信我,或通过 [email protected] 联系 Uniswap 实验室。

鸣谢: 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

来源链接: www.paradigm.xyz