区块链开发课第二讲 MEV套利原理

MEV

最大可提取价值 (Maximal Extractable Value, 简称MEV)

矿工 (或验证者、序列器) 在其生产的区块中通过其能力任意打包、排除或重新排序交易可以获得一定的利润,而 MEV 便是衡量该利润的一种度量。

MEV的详细解释请参考:

MEV有两个参与方,搜寻者(searcher)和矿工(miner)。

searcher搜索以太坊上面有利可图的交易(transaction),例如Dex套利、三明治套利、清算交易、NFT minting等等,他们通过智能合约实现一笔复杂的交易,发送给到mem pool中,矿工将mem pool中的所有交易排序、打包、执行,searcher会将交易利润的一部分作为燃油费(gas fee)支付给矿工,矿工则根据燃油价(gas price)的大小决定在下一个区块中这些交易的顺序(indexing)。

注:gas_fee = gas_price * gas_use

还有一种特殊类型的searcher,他们不会自己去搜索机会,而是会观察mem pool中别的searcher提交的交易,把交易的签名者变成自己的钱包地址,以更高的gas price发送给矿工抢先成交,这种人统称为抢跑者(front runner,有办法可以避免自己的交易被front running,在后面的教程中会详细说明)。

gas price非常重要,因为它决定了交易的顺序。在以太坊黑暗森林里不只一个猎人,当一个机会出现时会有许多searcher发现并提交自己的交易,在下一个区块中如果你的交易没有排名第一,那么就会失败,因为利润已经被其它的searcher抢走了。这就不可避免的出现一场gas战争(gas war),seacher会把交易利润的90%以上变成gas fee支付给矿工,以提高自己的排名。如果交易失败,矿工并不会把gas fee返还给searcher。最后造成恶性竞争,网络拥堵,而矿工成了这场战争的唯一赢家。

Flashbots

为了解决这种乱象,Flashbots应运而生。Flashbots提供这样一种服务,searcher不用把交易发送到mem pool,而是把一笔或者多笔交易捆绑(bundle)直接发送给矿工,如果成功开采下一个区块的矿工恰好也运行了Flashbots的客户端(Flashbots的哈希率目前大概是80%),他就会按照如下规则执行所有bundle:

  1. 模拟独立执行所有的bundle,记录每个bundle的price,bundle_price =矿工从bundle中获得的总收益/bundle的总gas_use,具体计算公式参考:https://docs.flashbots.net/flashbots-auction/searchers/advanced/bundle-pricing
  2. 将bundle_price从高到低排序,按照顺序模拟执行一遍,把包含失败(revert)交易的bundle剔除掉,剩下成功的bundle按照既定顺序打包上链(include),在一下个区块中,这些bundle会排在最前面
  3. 如果一个bundle中包含多笔交易,只要其中一笔交易失败,整个bundle都不会被include,searcher也不会有任何损失(但是有5%的概率发生uncle bandit攻击,bundle会被泄露到mem pool中被其它矿工执行,如何避免被uncle,参考https://docs.flashbots.net/flashbots-protect/rpc/uncle-bandits)

由于交易不发送到mem pool,searcher就不用担心被抢跑,由于失败的交易不会上链,也不用担心交易失败造成的燃油费损失,避免了大规模gas war造成的网络拥堵。接下来,searcher只需关心如何提高自己的bundle_price获得排名第一的位置。

  1. 提高矿工的总收益,即把交易利润中的更多比例变成矿工费
  2. 减少gas_use,通过优化代码减少交易中gas使用量

支付矿工费有两种方式:

  1. maxPriorityFeePerGas(tip price),在EIP-1559中,gas_price = base_price + tip_price,其中base_price直接燃烧掉,tip_price支付给矿工。
  2. 在智能合约中直接通过coinbase.transfer向矿工转账ETH

以上两种方式是完全等价的。

MEV套利

目前主流的mev套利有三种方式:

  1. 三明治夹击(Sandwich Attack)

监控mem pool,发现其他用户提交的swap交易。比如有一笔交易,调用Uniswap Router合约,发送了一笔WETH兑换为USDT的交易,并设置了10%的滑点(slippage),searcher会在它之前,提前在Uniswap的WETH/USDT池子中将WETH兑换为USDT,然后在它之后将USDT换回WETH,把三笔交易捆绑成一个bundle发送给矿工:

(1) searcher: WETH=>USDT

(2) 用户: WETH=>USDT

(3) searcher: USDT=>WETH

由于用户的兑换行为提高了USDT的价格,所以searcher会得到更多的WETH,除去本金以及交易成本,获得利润。

searcher会精心计算WETH的初始数量,保证用户的兑换结果恰好在10%滑点范围之内,因为如果超出了10%,用户的交易就会失败,从而整个bundle不会被矿工include。

2. 背后套利(BackRun)

监控mem pool,发现其它用户提交的swap交易。比如有一笔交易,调用Uniswap Router合约,发送了一笔WETH兑换为USDT的交易,由于数额巨大,该交易如果完成,将会显著抬高WETH/USDT池子中的USDT价格,和其它的Dex(比如Curve)出现价差。searcher会在它之后,在Uniswap和Curve之间进行套利,两笔交易捆绑成一个bundle发送给矿工:

(1) 用户: Uniswap WETH=>USDT

(2) searcher: Curve(WETH=>USDT) => Uniswap(USDT=>WETH)

由于Uniswap中USDT的价格比Curve中要高,所以searcher低买高卖,获得更多了WETH,除去本金以及交易成本,获得利润。

3. 普通套利

由于有些用户提交的swap交易是很隐蔽的(比如使用private transaction,或者通过dex aggregator进行),所以背后套利的机会并不能全部被发现,会有一些漏网之鱼被mev searcher所忽略。这就导致在一个区块结束后,仍然会出现Dex之间的套利机会,这时searcher只要发现这些机会,同样可以把一笔套利交易捆绑成bundle发送给矿工,获得利润。

MEV套利的风险

理论上mev套利是无风险的,但是对于三明治夹击,有一种情况需要注意。

2021年4月,有人部署了一种称为沙氏门菌的token合约(Salmonella token),在Uniswap中添加流动性,并发送一笔钓鱼swap交易,吸引机器人进行三明治夹击,机器人的第一笔交易用100个ETH买入token,第二笔交易卖出token失败,导致100个ETH留在池子中。

三明治机器人一般会通过两种措施防止这种瘸腿事故的发生:

  1. 在发送bundle之前会先在测试环境模拟,如果模拟失败则不发送
  2. 在第二笔卖出token的交易成功后再向矿工支付贿赂,这样如果交易失败,矿工不会收到贿赂,从而不会include bundle

但是这个Salmonella token有效地绕过了这两项防御措施,实施了对机器人的攻击,具体可参考:https://twitter.com/bertcmiller/status/1381296074086830091

闪电贷

在背后套利和普通套利中,由于套利是在一笔交易中完成的,所以可以通过闪电贷获得初始本金。

闪电贷(Flashloan),是一种不需要抵押品的贷款,贷款和还款在同一笔交易内完成。

一些Defi协议会提供这种闪电贷,通过乐观转账(optimistic transafer),先向用户发放贷款,在回调函数中用户实现套利交易并归还贷款,协议只收取一部分手续费(AAVE),或者0手续费(KeeperDao, 提供WETH/DAI/USDC/renBTC四种token的闪电贷)。这样一笔套利交易就会变成:

(1) searcher: 从KeeprDao闪电贷WETH

(2) searcher: Curve(WETH=>USDT) => Uniswap(USDT=>WETH)

(3)searcher: 向KeeperDao归还WETH

闪电兑

有一些Dex提供闪电兑(Flashswap),比如通过Uniswap把 USDT兑换为WETH,可以调用Uniswap池子的swap()函数,先通过乐观转账从池子中获得WETH,在回调函数中,用户实现套利交易并归还一定数量的USDT,这样相当于通过Uniswap完成了一次USDT=>WETH的兑换,并且账户中不需要有USDT作为本金。

searcher: Uniswap(USDT=>WETH) => Curve(WETH=>USDT)

结语

在解释了mev套利的基本概念之后,在下一讲我会带你编写一个简单的Solidity智能合约,实现闪电贷的功能。

欢迎来即刻App与我互动,即刻账号: 月影007

Subscribe to yueying007
Receive the latest updates directly to your inbox.
Verification
This entry has been permanently stored onchain and signed by its creator.