什么是三明治攻击,如何避免三明治攻击?

 2023-08-25 21:56:44发布 2023-09-03 15:21:57更新

三明治攻击是抢先交易的一种,攻击者在受害者待处理的交易前后各放置一个交易。 在去中心化交易所上,三明治攻击通常被用于从毫无戒心的交易者身上提取MEV。 攻击者通过识别受害者即将购买的代币,开展抢先交易以推高价格,然后在受害者的购买命令价格已经大大提高时,卖掉先前购买的代币,从而操纵资产价格。

三明治攻击流程

如图所示,三明治攻击主要流程如下:

三明治攻击流程

(1) 攻击者提前洞察了受害者的交易意图,认为有利可图,提前通过利用10个TokenA兑换了100个TokenB,同时抬高了TokenB的价格

(2) 受害者在不知情的情况下,通过意外价格滑点,以5个TokenA兑换了40个TokenB,原本5个TokenA可以兑换50个TokenB

(3) 攻击者再将100Token B兑换成12.5个TokenA,获利2.5个TokenA

在以X * Y = k理论基础的DEX生态中,每次购买Token时候,对应的价格将会上涨。因此,如果我们先购买它,然后其他人购买其他Token,价格就会上涨。如果我们随后立即卖出,我们将获利,因为我们低买高卖,实现了套利。

套利在某种程度上,是可以维护市场价格生态的平衡。但是,三明治攻击会牺牲正常交易者的利益为代价,攻击者最终谋取利润。

三明治攻击演示图

三明治攻击的方式

三明治攻击可能通过以下两种方式:

(1)流动性获得者攻击流动性获得者

流动性获得者试图攻击在区块链上有待处理的AMM交易的流动性获得者。看到等待批准的交易,掠夺者发出两个后续交易(前置和后置)以从交易者的交易中受益。

现在,通过一个流动性池和货币对连接了三个待处理的交易。矿工必须选择哪笔交易首先获得批准。这就是掠夺者可以通过实际贿赂矿工来影响这个决定的地方,即支付更高或更低的交易费用。

三明治攻击的方式

(2)流动性提供者攻击流动性获得者

在这种情况下,流动性提供者试图攻击流动性获得者。一切的开始都是一样的,攻击者在区块链上看到一个待处理的交易,然后执行三个交易:

(a)消除流动性:抢占先机(通过减少资产的市场流动性来增加受害者的滑点)

(b)添加流动性:恢复运行(将资金池中的流动性恢复到攻击前的水平)

(c)用B交换A:返回运行(将A的资产余额恢复到攻击前的状态)

在这次攻击中,攻击者在受害者的交易执行之前从流动性池中提取所有资产。在这样做的过程中,掠夺者放弃了受害者交易的佣金。流动性提供者根据他们向AMM提供的流动性收取佣金。

三明治攻击的方式2

但是,这些攻击都不一定有效。要使攻击有效,需要同时满足两个条件:

(1)利润需要高于gas费(矿工为处理每笔交易收取的费用):因为利润如果很小,用户需要获得相当多的Token数量才能克服gas费

(2)减少滑点:滑点是指用户在交易中愿意接受的理想价格的最大偏差。由于交易不是立即执行的,在同一Token内操作的其他交易可能会先被执行,从而导致价格的变化。

这意味着想要购买Token的用户无法知道他们的交易执行时的确切价格。这就带来了购买可能经历过大幅价格变化的Token问题。

三明治攻击分析

三明治攻击是经常发生的,我们来分析一个三明治攻击,Tx hash:0x65a6d6e7b88a3d7c6c11ef4658765bcd94e2a0f831a1e9752f711bbecc08740a。

三明治攻击分析图

该三明治攻击大概过程如下:

(1)受害者的地址(0x37a…d80fa)计划出售 1.4 WETH 换取 APE

(2)攻击者一直在扫描内存池(mempool),并且观测到受害者的意图

(3)攻击者的地址(0x01b…b0159)发起卖出 44.233706 WETH 换 176.994496 APE 的交易,并且降低了WETH 价格,提高了APE价格

(4)在 WETH 的较低价格下,受害者(0x37a…d80fa)只能获得 3.919601 APE,他本来可以获取更多

(5)攻击者(0x01b…b0159) 以 44.546633 WETH 的价格出售了 176.994496 APE

(6)最终,攻击者(0x01b…b0159) 获得 0.312927 WETH,扣除以太坊上的一些成本

(7)在此过程中,攻击者(0x01b…b0159) 发送 Miner (0x829…3a830) 0.2 WETH 用来提高交易排序

三明治攻击就一定能获利吗?

一切操作看起来有逻辑且简单。但最终问题是所有三明治攻击都能获得收益吗?

除非DEX不要求你支付手续费,那么交易尽可能多的代币将是获得最大利润的合理方式。举例子,Uniswap在每次交易中收取0.3%的手续费,这导致攻击者不得不至少提交两次交易。

而且别忘了每次交易都需支付的gas费用,如果你执行抢先交易,就必须支付更高的gas费用。因此可以得出,除了费用和佣金高于受害者的交易金额外,掠夺者并没有获得任何利润。

三明治攻击已经不是什么新伎俩了,这个概念和对整个市场用户的影响在去中心化金融概念被提出前就已经受关注。自动做市商似乎是去中心化交易最好的解决方案,但至今还有很多漏洞被恶意攻击行为利用。

随着DeFi吸引越来越多的人入场,对没有经验的交易者的保护将成为区块链专家的首要解决问题。而且去中心化的概念本身就意味永远不可能有一个被授权的第三方来保证用户资产安全、保证和对用户的损失作出赔偿。

以太坊的创造者V神在2018年谈到解决方案时说道:

“如果做市商从隐含价差中赚取利润,则这些利润可以事后分配给以不公平价格购买的用户。

例如,如果某个时期的价格从P1 变为P2,但在这两者之间的时间段内要么超过P2,要么低于P1,那么在做市商有可用资金的情况下,以该价格购买的任何人都可以在事后发送另一笔交易以索取一些额外资金。”

至今为止,无论是在单独一个场景还是整个行业,DeFi都极易受到价格操作和各种可疑策略的影响。

如何避免三明治攻击?

回顾了相关事件后,我们应该采取哪些适当的措施去避免三明治攻击?

(1)gas限制

三明治攻击之所以会发生,因为更高的gas费用交易优先于其他交易。通过对该gas费用设置一定的限制,影响将不会那么明显。其实,永远无法完全消除这个问题,因为gas费用总是存在差异的。但是,通过让这种差异变小,攻击的发生速度也会变慢。

(2)避免低流动性池

缺乏良好的流动性对这个问题是不利的。流动性池越小,投资者获得好价格的机会就越小,因为这更容易产生滑点。滑点越高,从三明治攻击中获得的利润就越多。

(3)小额交易

三明治攻击对较大的交易额感兴趣,交易额越大,利润空间越大。避免三明治攻击的一种方法是将我们的交易分成几个较小的交易,因为这些小额交易对于抢跑者来说不太具有吸引力。

推荐阅读