Fount-running, MEV和Hacker

 

0x00 背景

最近,我们监控到了一笔抢跑的攻击事件,被攻击者是HopeLend,攻击交易为:

https://etherscan.io/tx/0x1a7ee0a7efc70ed7429edef069a1dd001fbff378748d91f17ab1876dc6d10392

在区块18377042中被抢跑的原始攻击交易为:

https://etherscan.io/tx/0xa414de03bbf7baccea6b5c95af9ebfbed43b1c3151debd29673df979a0f4b0b0

同样在区块18377042中由于,抢跑攻击交易position为0,被抢跑的攻击交易position为5,所以抢跑成功,真正的黑客攻击失败。

那么抢跑者如何控制交易顺序的呢?我们可以观察到抢跑的gas fee和被抢跑的gas fee没有多大的差异,那么真的这么巧,刚好让抢跑的交易在被抢跑的之前执行?

我们可以观察到一笔264ETH的转账

Fount-running, MEV和Hacker

随后我们可以打开这笔交易所在的区块,我们可以发现原来这个264 ETH是给区块的proposer转账。那么,这块就很好理解,哪个proposer能优先propose抢跑交易的区块,就会获得264 ETH的费用。这个264 ETH其实就是MEV。

Fount-running, MEV和Hacker

 

0x01 什么是MEV

MEV全称是Miner Extractable Value,就是矿工可提取价值。可提取价值不是指矿工打包区块收取的手续费,因为这块的手续费是交易发起的用户同意的且矿工无法自行手续超额手续费。MEV是指矿工通过增加、删除、修改交易顺序获得的超额利润。

不过在Ethereum升级后,MEV的术语已经变成了Maximal Extractable Value,即最大可提取价值。通常,MEV的相关案例最常见的有以下几种:

Arbitrage 套利

DEX由于使用不同的价格语言机可能会导致不同DEX之间的价格存在差异,所以可以通过一笔交易中在价格较低的DEX买入TOKEN,在价格高的DEX抛售TOKEN进行获利。

Liquidations 清算

借贷协议是连接借款人和出借人的DEX(例如 MakerDAO、Aave、Compound 等)。借款人提供平台支持的抵押品后可以借入一定价值的资产(通常需要超额抵押),当借款人的抵押品无法偿还债务时,就会发生清算,清算人可以以低价购买抵押品偿还债务。清算机器人通常会搜索借款人的资产,第一时间进行清算,获得借款人的抵押物。

Sandwich 三明治攻击

三明治攻击又叫夹子攻击,三明治攻击利用DEX的AMM机制,例如,CPMM算法下,大额买入会拉升对应Token的价格。所以,攻击者在监控到大额买入时,在其买入前发起一笔买入交易(使其的Slippage在客户允许的范围内),然后在其买入后再发起一笔卖出交易即可获利。

0x02 Flashbots和PBS

Flashbots

Flashbots是一个研究和开发组织,旨在减轻Maximal Extractable Value(MEV)对区块链的负面影响,特别是以太坊。他们的主要目标是通过MEV-Boost等产品为MEV打造一个无需许可、透明和可持续的生态系统。未来的 MEV 发展应专注于跨链 MEV 捕获、最小化价值流失、最小化对协议真实用户的潜在负面影响,并确保参与者公平分配等方向。

Fount-running, MEV和Hacker

PBS

PBS全称Proposer-Builder Separation,原意将PoW时代矿工的工作拆分成两个部分:1. 交易排序打包由Builder负责;2. 打包后的验证,投票由Proposer负责。这样做的好处就是让负责交易验证的节点门槛降低,吸引更多的节点加入进行验证,使得Ethereum的去中心化程度进一步增加。

如果Builder直接把transaction bundles发送给Proposer,那没法避免恶意的Proposer将其中的MEV机会替换为自己可获利的交易,那么Builders就会受到相应的损失。所以,flashbot在builder和proposer中间加了一层relay,relay不会直接把完整的区块内容发送给proposer,而是仅仅发送block header,那么proposer对block header进行签名,relay在拿到签名后再将完整的block发送给proposer。那么,如果此时proposer替换了区块的内容则会受到Ethereum机制的惩罚。

Pay Tips (bribe) to proposer

那么,黑客是如何支付带外费用呢?简单来讲,黑客通过Smart Contract向Coinbase转账即可,如下:

function payForTips public payable(uint256 payTips) {

block.coinbase.call{value: payTips}("");

}

其中,block可以获得区块的信息,coinbase为proposer的地址,于是可以通过这段代码给该区块的proposer支付费用。

在此次攻击事件中,抢跑黑客可以build一个bundle,将自己的交易放到最前,由于黑客的钱包交易成功执行后,proposer会获得264ETH的天价费用,则proposer会优先propose抢跑黑客的bundle。此时,就完成了攻击抢跑。

0x03 思考

在此次攻击事件,抢跑黑客通过支付天价Tips,使其先于其他黑客完成攻击。所以,似乎proposer也没做错什么,仅仅是选择收益最大的bundle进行propose。当然,很多攻击者也会针对正常的交易进行抢跑,三明治攻击等。如何防范这种攻击呢?其实当我们了解了MEV的原理后,就会明白,基本上所有的MEV机会都会在Public mempool中搜寻,只要我们将transaction提交到private pool即可避免这种风险,例如,flashbots就提供private mempool。

0x04 参考

https://ethereum.org/en/developers/docs/mev/

https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/block-proposal/

https://noxx.substack.com/p/order-flows-kingmaker-of-the-block

https://eips.ethereum.org/EIPS/eip-4895

https://medium.com/taipei-ethereum-meetup/after-the-merge-mev-309e836698cf