读懂MEV链上套利操作
01
什么是 MEV?
我经常被问到 MEV 是什么,以及抢先交易(front-runs)和尾随交易(back-runs)是如何工作的,那么我就以我自己的机器人工作机制为例,在这篇长文中做一个解释。
链上流动性是碎片化的,虽然类似 Uniswap 这样的流动性池子很多,但是它们之间没有相互通信,每个池子都提供实时交换资产的报价,而正是这种分散的流动性,创造了在不同池子中低买高卖的机会。
举例:一个用户在 Uniswap 的 WETH-USDC 池子卖出了 500 万美元的 WETH,当他卖出的时候,Uniswap 上的 WETH 价格下降,那么它就会允许其他用户以相较于 Sushiswap 上更便宜的价格购买 WETH。
因此,精明的用户就可以在 Uniswap 上购买 WETH,然后在 Sushiswap 上面出售。
02
链上套利有什么不同?
上面举例说的是传统套利的原理,链上 defi 还多了一点不同的东西:原子性。
我们都知道,区块链的状态逐块更新,这意味着一个交易里面可以执行多个操作,前提是这个交易的最终状态是正确的,即这个交易最终要是成功的。
例如,我可以从 Aave 借贷池免费借到 500 万美元的 USDC,前提是我在交易结束时将 500 万美元的 USDC 准确归还给借贷池,这就是传说中的「闪电贷」,相信你在很多项目被盗的新闻中经常听到。
(译者注:即借贷和还贷两个动作在一条交易里面执行,通过借贷而来的资金赚取更多的收益,这样就能一瞬间还清贷款,并保留收益。)
闪电贷为那些没有大量资金的用户免费创造了大规模链上套利的机会。当然了,这种钱并不容易赚。以上套利思路的出现,就带来了「套利空间的竞争」。
而大多数原子套利的空间都由少数地址主导,这些地址获得了大部分的利润,所以这大概率是所有领域中竞争最激烈的一块儿。套利的成功,是套利者的智慧、网络的低延迟以及良好的基础设施的结合。
(译者注:少数地址获得大部分利润,这符合经济学中的二八原则,即 20% 的因素影响 80% 的结果。)
03
机器人是如何工作的?
机器人会直接连接到内存池(mempool),内存池是一个队列,里面存储着一组等待被确认的交易。机器人会埋伏在池子里面,等待可以创造套利机会的交易出现。
一旦发现可套利的交易,机器人会自动计算套利的最佳方式,然后将一系列操作,放到一个交易里面,直接将这个交易提交到内存池中,和可套利的那个交易放在同一个区块中进行打包。
我的机器人会在类似 Uniswap 这样的交易所中寻找的套利机会,它可以在目标交易出现后执行,最后以利用不同池子之间流动性的差异,来获取利润。
为了搞明白什么样的交易算是可套利的机会,你必须先要了解 Uniswap V2 的工作原理。
04
Uniswap V2 的工作原理
假设一个池子里面包含 X 个 WETH 和 Y 个 USDC,并且它允许用户在池子中进行 WETH 和 USDC 的交易。那么池子的管理原则是:保证这个 X 和 Y 的乘积始终是一个常数我们称之为「Uniswap 不变量」。
因此,对于一个储备为 (X, Y) 的池子,我们可以通过求解以下等式计算出我们期望将 ΔX WETH 卖出多少 USDC 到矿池中:
(译者注:这里的 ΔX WETH 指的是一个增量,是数学中函数的相关概念,读者可跳过复杂的公式计算,继续往下看。)
实际操作中,池子还会收取大概 30bps(约 0.3%)的手续费,在计算上面的公式时,你可以通过将 ΔX WETH 乘以 0.997 来保证计算结果的准确性。为了解释起来方便,我们这里简化一下,省略这个步骤。
重要的是,我们可以重新拓展和排列这个方程,然后根据 WETH 输入的 ΔX,得到一个 UDDC 输出的 ΔY 的表达式:
不错,现在在任何一个 Uniswap V2 池子中给你一个输入量,相信你都能确切地计算出预期输出量了。
05
套利机会是如何运作的?
套利一般可以简化为「低买高卖」,在这种情况下,我们需要找到一个 A 池去购买 WETH,A 池的 WETH 价格比 B 池的便宜,然后我们将 WETH 在 B 池中出售,即在 A 池中低买,在 B 池中高卖。
假设 A 池有储备金 (X, Y),B 池有储备金 (X̂, Ŷ),那么如果我们在 A 池中卖出 ΔX 个 WETH,收到 ΔY 个 USDC,那么我们可以计算这些 USDC 在 B 池中能后换到多少个 WETH,如果有得赚,那么一个套利机会就形成了。
所以让我们计算一下,在第一次交易中,我们将 X 换成 Y,第二次交易中,我们又将Ŷ 换成 X̂,根据前面的方程,计算如下:
这里的 ε 表示输入的 ΔX 与执行两次交易之后的输出之间的差异。如果我们能找到将 ε > 0 最大化的方法,我们就找到了有利可图的套利。
(译者注:这个差异 ε 即你套利前投入的 WETH 与套利完成后的 WETH 的差,如果 WETH 变多了,说明套利成功,如果操作结束,WETH 反而还少了,那说明这是一次失败的套利。)
所以我们可以用下面这个表达式来简化我们上面的方程:
套利机器人的其中一项工作就是使得利润最大化,在我们的方程中,这相当于最大化 ε。只有当 A > B 时,方程才会有一个唯一的最优解,一旦 A < B,那就不存在套利机会了。
06
机器人如何从机会中获利?
一旦我们弄清楚了如何执行交易以获得最大利润的话,剩下的事儿就简单了,我们需要让机器人获得初始资金来进行套利,放到上面的公式里,就是获得 ΔX。
初始资金可以从 AAVE 中操作闪电贷中获取。机器人需要将借贷、交易以及还贷三个操作,捆绑在一个交易里面。这个过程,我们可以通过使用预先部署在链上的自定义智能合约来完成。
一旦我们的交易被创建,同时签名成功,它就会被提交到内存池等待矿工挖矿,即等待交易成功。但是由于还有其它很多的机器人同样也在寻找套利的机会,我们需要保证我们的交易被首先通过。
这意味着我们的套利交易应该跟随目标交易,被打包在同一个区块中,然后立刻完成交易。
这就是所谓的尾随交易(back-runs),这种情况下,开采区块中的交易顺序如下所示:
为了实现尾随交易,机器人必须要先知道目标交易所提供的 gas 费是多少,然后将这些参数准确的复制到我们的套利交易中。最后,套利交易由机器人进行签名,并提交到内存池中进行验证,利润到手!