前 言
宇宙就是一座黑暗森林,每个文明都是带枪的猎人,像幽灵般潜行于林间,轻轻拨开挡路的树枝,竭力不让脚步发出一点儿声音,连呼吸都小心翼翼……他必须小心,因为林中到处都有与他一样潜行的猎人。如果他发现了别的生命,不管是不是猎人,不管是天使还是魔鬼,不管是娇嫩的婴儿还是步履蹒跚的老人,也不管是天仙般的少女还是天神般的男孩,能做的只有一件事:开枪消灭之?在这片森林中,他人就是地狱,就是永恒的威胁,任何暴露自己存在的生命都将很快被消灭。这就是宇宙文明的图景,这就是对费米悖论的解释。 —— 刘慈欣《三体2:黑暗森林》
在普通的交易者或者区块链使用者来说,区块链世界是美好的,因为它的去中心化机制和加密算法的安全性,以及矿工尽心尽力地打包交易,生产并广播区块,最终完成共识。
但在区块链世界的另一面,存在着一片深不可测的黑暗森林,在那里,无数的猎人都在静静地等待猎物的到来,并且悄无声息地完成猎杀。
这片黑暗森林指的就是区块链中的memory pool,这里存放着所有尚未被打包入区块的交易,而猎人就在这茫茫的交易中寻找到可以获取到利润的交易,并毫无情面的掠夺它。
正所谓天下武功唯快不破,在区块链的黑暗森林中,猎人之间的竞争只取决于两个字:速度,谁能够更快的找到有利润的交易,并且提供给矿工完成区块打包并上链,谁就能够获取到这笔利润。
因此,普通的交易者可以被看做是猎物,猎人则指的是在memory pool或者区块链中寻找利润的掠夺者,而矿工在某种意义上可以认为是上帝的存在(他们是最终决定交易的人)。
1
概述
MEV(Maximal extractable value)这个概念最早被用于POW网络中,特指矿工在生产新的区块时所能够得到的最大收益。
矿工生产区块所产生的收益一般来说,来源于区块奖励和gas费用,而矿工可以通过调节交易在区块中的顺序,尽可能地将gas price较高的交易放在区块的前面,从而获取最大的收益。
而在POS网络中,矿工的角色转变为了验证者,但MEV这个名词被保留了下来,并且拓展其含义为“最大可提取价值”(Maximal Extractable Value)。
在MEV这个概念中,存在三种角色,分别为搜索者(Searcher),矿工(Miner)和普通的交易者。搜索者会设计特定的金融模型,在区块链中寻找任何可能可以盈利的地方(DeFi,Dex等)来获取一笔利润。
矿工也可以分得一部分利润,因为搜索者会通过设置更高的gas price来将他们的交易尽可能早地纳入到区块链中(Gas Price Acution)。
普通的交易者在MEV中则获取不到任何的利润,反而可能会因为搜索者互相设置更高的gas price,而导致交易迟迟无法上链,不得已也提高gas price,最终导致以太坊的阻塞(互相内卷)。
为了缓解这样的问题持续在以太坊链上影响着正常的交易者,以太坊的开发者提出了很多方案,其中最著名的就是EIP-1559提案。
在EIP-1559提案中大幅度地调整了gas的收取机制,几个关键点:
引入了基础手续费(Base Fee)概念,计算规则为:如果上一个区块所消耗的gas limit如果使用超过一半,则提高下一个区块的Base Fee,最多提升12.5%。反之,则降低下一个区块的Base Fee,最多减少12.5%。
引入燃烧的概念,燃烧的数量为Base Fee * gas used ETH、
矿工能获取到的费用:
Min( Max fee - Base fee, Max priority fee)
因此,在 EIP1559 的规则之下,矿工失去了对 gas 费的定价权:如果他们只打包少量高 gas 的交易导致区块容量不满一半,以太坊系统就会减少 Base fee,降低用户的使用费用。
在MEV套利中,主要包含套利(Arbitrage),清算(Liquidation),抢跑(Front run),被跑(Back run),三明治机器人(Sandwich trading)等多种模式。
套 利
理论上,套利是一种无风险的交易,但在实践中大多数套利都是统计套利,即计算交易获利的概率和损失的概率。
套利交易的风险始终存在,轻微的风险包括成交价格的滑点误差减少了利润,严重的风险包括给标的物定价的货币币值大幅波动、经济基本面急剧变化导致原有的比价规律不复存在。
套利在传统金融中最常见的存在于商品之间,并且在汇率,股市以及金融衍生品等任何可能存在价差的地方,均可以进行套利。
而在区块链的世界中,最常见的套利模型有“cex-dex”和“dex-dex”。cex-dex主要是交易所与swap中存在价差,对于同一个交易对来说,当交易所的价格高于swap的价格时,可以通过在swap进行买入,并在交易所进行卖出来获取利润。
同样的,当交易所的价格低于swap价格时,可以通过在交易所进行买入,并在swap中进行卖出来获取利润。
dex-dex则关注两个不同的swap中的价差,比如以太坊链上的uniswap和sushiswap。
对于同一个交易对来说,只要swap之间存在价差,那么就可以通过在价格较低的swap中进行买入,在价格较高的swap中进行卖出来获取利润。
不同于传统金融的套利模式,dex-dex套利模型中还可以使用闪电贷(flash loan)或者闪电兑(flash swap)这样类似的金融服务来成倍的放大价差所产生的利润,只要计算好每一步的手续费和价差的关系,就可以真实地做到“无本万利”。
下图则是一个利用aave的闪电贷在uniswap和sushiswap对WETH/DAI交易对进行套利的过程:
详细步骤如下:
从aave的池子中闪电贷出1000 WETH
在uniswap中将1000 WETH换成1,293,896.750455517300702289 DAI
在sushiswap中将1,293,896.750455517300702289 DAI换成1,045.621665215839804691 WETH
将借出的1000 WETH进行归还,并支付小部分的手续费
完成获利,最终获利45 WETH
套利是一种友好的行为,因为套利者会在dex之间不断地进行买卖操作来赚取其中价差所导致的利润,这会使得dex之间的价差维持在很小的一个变化范围,从而保证了dex的良好运转。
抢 跑
顾名思义,抢跑(Front run)就是在目标交易之前进行交易来获取其中的利润,目标交易可以是一些能够触发价格变化的事件,比如在swap中新增了某个币种的流动性。
抢跑的方法也很简单,通过设置比目标交易略高的gas price可以使得searcher的交易紧跟在目标交易之前。
抢跑有很多种获取利润的方式,其中有一种套利方法与背跑类似,主要的思路也为低买高卖。
还有一种操作是通过监控swap中新增币种的池子,在所有人之前先进行抢跑获取一定的token。
当池子比较浅时,这样的做法会显著的提高token的价格,后序的交易者则需要承受更高价格来购买token,抢跑者在合适的价格后再将token卖出,获取利润。(详细例子可见uniswap上WTF/WETH的抢跑攻击)
不过抢跑这种操作会对后序的交易者带来金额上的损失,让区块链的环境变得更加恶劣。
背 跑
背跑(Back run)就是在目标交易之后紧接着进行交易来获取其中的利润,目标交易可以是大单的交易,也可以是预言机更新。
背跑的方法也很简单,通过设置比目标交易略低的gas price可以使得searcher的交易紧跟在目标交易之后。
举个例子,此时searcher在memory pool中发现了一笔在uniswap上将USDT换成WETH的swap交易,由于数额巨大,该交易如果完成,将会显著抬高WETH/USDT池子中的USDT价格,和其它的Dex(比如Curve)出现价差。
searcher会在它之后,在Uniswap和Curve之间进行套利。由于Uniswap中USDT的价格比Curve中要高,所以searcher低买高卖,获得更多了WETH,除去本金以及交易成本,获得利润。这其实是最原始的套利模型,只是加上了价格的预测机制。
背跑交易是一种聪明且取巧的行为,它不会对目标交易造成任何的影响,searcher只是抢在了其他人前面抓住了获利的机会。
清 算
清算是DeFi借贷协议中不可缺少的一环。借贷协议提供了一种以去中心化方式连接借方(Lenders)和贷方(Borrowers) 的平台,一方面,它允许贷方从平台借贷数字加密货币并支付利息,另一方面它允许储户向平台存入数字加密货币以赚取利息。
为什么使用借贷平台?
借贷平台的可操作性十分高,其中常见的一个操作是使用交易者进行杠杆交易。比如说,现在有一个投资者手上有AAVE,并且它在近期有向上涨的趋势,同时投资者还看好UNI,认为它在近期也有向上涨的趋势,又不想卖出AAVE来买入UNI。那么此时就可以将AAVE进行抵押,从借贷平台中借出一些ETH出来进行投资。在等到适当的时机后,将UNI卖出换成ETH,并将一部分的ETH还给借贷平台拿回AAVE。
为了减轻风险,借贷协议一般采取超额抵押的模式,要求必须要有150%以上价值的抵押品,这能够保证在抵押品跌至低于贷款价值之前留有足够的缓冲空间。
如果此时借出资产的价值上升,或者抵押品的价值下跌,而借款人没有及时的存入更多抵押品,那么就会面临清算。衡量是否会被清算的值叫健康度,健康度计算公式为:抵押资产总价值 / 借出资产总值。
在区块链世界中,借贷协议由智能合约来实现。由于智能合约的特性,在合约层面无法自动进行清算,只能提供执行清算的入口函数,供外部程序调用,调用清算函数的外部程序也被称为清算人。
清算人的主要任务是在市场中寻找健康度低于1的账户(underwater accounts),执行清算函数,获取利润(liquidation incentive)。
如何能够更快的发现利润高,且需要被清算的账户,是在清算竞争中赢得其他竞争者的关键。
在清算中,主要利用两种竞速的机制:gas拍卖和背跑。
gas拍卖(Gas Auction)
gas拍卖主要是设置更高的gas price,以此能够跑赢竞争者,获取清算的利润。
在 0x35e334927757c618a1702d3bd618b735d6b249a3a5d56ff1bc638375d1ce7db6这笔清算中,清算人使用了8,898.471487863 Gwei(约8 ETH)来获得清算的优先权,清算得到的收益为25 ETH,最终获利约17 ETH。
背跑**(Back run)**
背跑主要是监控了触发清算的事件,比如价格预言机的价格更新,然后尽可能地抢在事件之后立刻进行清算。
在0x61247978224b2742375399c6c6c3bbe7c0aa9245ac3c9ae154fdeca026158f2f这笔清算中,清算人在价格预言机更新DAI/ETH价格之后(0xf3753b1870098694e6bf3d0e01a0205fe2d24b6d0d9dcd1fd6ad281b7e2b2e5b),紧接着发起了清算,抢在其他人面前获取到了清算的利润(6.49 ETH)。
仔细观察一下这个表格,可以发现从5个不同的清算人总共发起了12笔清算的尝试,有两笔交易甚至还发生在预言机更新价格之前。这有点像堆喷射技术,在各个地方都插入交易来尝试进行清算。
三明治交易
三明治交易是另一种常用的获取MEV的方法,他是一种把抢跑和背跑结合在一起的套利方式。
具体来说,在进行三明治交易之前,searcher需要实时地监控memory pool,寻找dex上准备进行大笔金额的交易。
比如,此时某个用户打算在uniswap上使用DAI来换取10,000 UNI,这样大量兑换UNI的操作,势必会对UNI/DAI池子有一定的影响,从而导致价格的变化,在这里UNI的价格会上涨。
那么searcher就可以在用户交易前先买入UNI,等待用户的交易完成后(UNI价格上涨),紧随其后立刻卖出UNI,从中挣取利润。
而利润的根源在于用户进行swap时设置的滑点,当轮到受害者进行交易时,虽然此时的价格相比于用户想要的价格稍高,但是因为滑点的存在,交易不会被撤回,用户仍然能够完成交易,只不过会承受更多滑点所造成的损失。
因此三明治交易在某种意义上是对普通用户的一种攻击。
下图呈现了两种比较典型的三明治攻击方法,左图是以交易者的身份进行攻击,右图是以流动性提供者的身份进行攻击。
在现实的区块链世界中,searcher一般由机器人来充当。它们主要职责就是,在区块链上搜索可能存在MEV的交易,并自动化地进行三明治交易。
需要注意的是:
只要进行UNI买入操作,就会提高UNI的价格。机器人需要精心计算第一步买入操作时买入的数量,使得受害者进行交易时的价格不会高于最大滑点的价格,否则受害者的交易会被撤回,导致攻击失败。
机器人容易受到恶意token的攻击。最有名的就是沙门氏菌攻击,攻击者在设置好恶意token和合约后,通过一步步设置陷阱诱导机器人进行三明治交易,最终从机器人手中获取了130 ETH。
相比于套利模型,三明治攻击不具有原子性。三明治攻击需要多笔交易来完成,并且还需要控制交易的顺序,这无形中增加了很多风险和不确定性。
下图是一个在bsc链的pancakeswap上利用机器人进行三明治攻击的过程:
•机器人在检测到当前有一笔在pancakeswap上进行swap的交易
•机器人通过设置较高的gas price,抢先在交易者前以$0.1516买入一部分的token
•受害者以$0.1532完成进行swap交易
•机器人紧接着在交易者之后以$0.1534将买入的token卖出,最终赚取0.8939-0.8836=0.0103 BNB
交易详情:
机器人买入操作:
0xab7951bddd2613fec8f82a07b6bac05a8cfec2d489c1a02e2fc5a75d7205b31b
。gas price:32.355903976 Gwei
。position:0
交易者正常交易:
0x5e6ca0ffc44c3d2edaa478ade7873d6b49f98fff4ca5d0679e425f49d0a99377
。gas price:22.503153478 Gwei
。position:2
机器人卖出操作:
0xe4bf63626bf6a35f57b99ebae6a58e68dfc92eab358954622521f92d634adda9
。gas price:5.000000001 Gwei
。position:37
这里机器人在进行卖出时,略微的将gas price提高了0.000000001 Gwei(当前bsc链上标准gas price为5 Gwei),这会使得这笔交易能够跑赢大部分(没有特意修改gas price)的交易。
2
缓解方案
许多人都在致力于为了减轻MEV所带来的负面影响,保障交易者的利益,使得MEV收入能够更加的民主化,公开和透明。其中,使用最广泛的有以太坊上的flashbots服务。
flashbot
MEV带来的负面影响的根本原因在于:交易在被打包上链前会在memory pool中以pending的形式存在,而所有人都能够查询memory pool内的交易。
因此,flashbot通过定制化的mev-geth,使得交易者能够直接与矿工进行交互,不再经过memory pool,把交易的内容发送给矿工进行打包和上链。
flashbot提供的这类服务叫做隐私交易(Private Transaction),在etherscan上有对应的标签来标识这笔交易是否是隐私交易。
因为此时区块内交易不再是根据gas price来进行排序的,所以区块上也对应有一个标签(Unconventional Ordering)。
flashbot还提供了sendbundle的服务,这个服务能够将多个交易按照交易者所需要的顺序执行,并且支持在memory pool中的交易。
具体的使用方法和详细的说明文档可以参考:https://docs.flashbots.net/。
flashbot为什么有这样的服务,实际需求有多少不得而知。
但是,这在某种意义上给三明治机器人提供了巨大的便利,sendbundle这个服务解决了三明治攻击在实际操作的过程中遇到的交易顺序难以确定的问题。
三明治机器人只需要监控memory pool中可以进行攻击的交易,并将这笔交易的哈希与自己的交易(抢跑和背跑)打包发给flashbot的矿工,即完成一次三明治攻击。
通过Arbitrage Scan平台可以看到链上进行三明治攻击的具体步骤,其中大部分都是通过flashbot来完成交易的。
NodeReal
在bsc链上也拥有和flashbot一样类似的服务(direct route),这个服务由NodeReal验证节点提供,具体可以参考:https://directroute.nodereal.io/。
目前,direct route服务目前有3个验证节点,占14%(3/21),上链速度一般。
参考资料
https://ethereum.org/en/developers/docs/mev/
https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest
https://rekt.news/return-to-the-dark-forest/
https://arxiv.org/pdf/2009.14021.pdf
https://medium.com/flashbots/frontrunning-the-mev-crisis-40629a613752
https://hackmd.io/@norswap/mev
https://medium.com/coinmonks/defi-sandwich-attack-explain-776f6f43b2fd
https://hackernoon.com/no-sandwich-please-popular-defi-attack-strategy-analysis-jk1734rf
https://gerhard-wagner.medium.com/the-defi-liquidation-game-aaef5c0b903d