最大可提取价值 (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提供这样一种服务,searcher不用把交易发送到mem pool,而是把一笔或者多笔交易捆绑(bundle)直接发送给矿工,如果成功开采下一个区块的矿工恰好也运行了Flashbots的客户端(Flashbots的哈希率目前大概是80%),他就会按照如下规则执行所有bundle:
由于交易不发送到mem pool,searcher就不用担心被抢跑,由于失败的交易不会上链,也不用担心交易失败造成的燃油费损失,避免了大规模gas war造成的网络拥堵。接下来,searcher只需关心如何提高自己的bundle_price获得排名第一的位置。
支付矿工费有两种方式:
以上两种方式是完全等价的。
目前主流的mev套利有三种方式:
监控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套利是无风险的,但是对于三明治夹击,有一种情况需要注意。
2021年4月,有人部署了一种称为沙氏门菌的token合约(Salmonella token),在Uniswap中添加流动性,并发送一笔钓鱼swap交易,吸引机器人进行三明治夹击,机器人的第一笔交易用100个ETH买入token,第二笔交易卖出token失败,导致100个ETH留在池子中。
三明治机器人一般会通过两种措施防止这种瘸腿事故的发生:
但是这个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