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

By [yueying007](https://paragraph.com/@yueying007) · 2022-04-15

---

MEV
---

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

MEV的详细解释请参考：

[

Maximal extractable value (MEV) | ethereum.org
----------------------------------------------

An introduction to maximal extractable value (MEV)

https://ethereum.org

![](https://storage.googleapis.com/papyrus_images/a2f4796307f924bab5bfc9c7cc5d2e56c6d4cd00a64075af07b94771f8b35745.png)

](https://ethereum.org/en/developers/docs/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](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](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_](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_

---

*Originally published on [yueying007](https://paragraph.com/@yueying007/mev)*
