这笔交易中,A 的价格为 10/90.9 = 0.11,相比于原来 A 的价格,价格滑点为 :
一笔交易就让币价产生了 10% 的滑点,可见越是流动性差的池子,遇到大额交易,越是容易产生滑点。而如果,能在用户正常的大额交易前(预计该交易会产生较大滑点),抢先买入 A,再在用户正常交易后,将刚买入的 A 卖出,就可以获得一笔不菲的收益。沿用刚才的例子,假设在 Alice 的交易前,Bob 抢先花 5 个 ETH 购买 A,然后在 Alice 的交易完成后,Bob 再把之前买入的 A 卖出,我们看看会有什么样的结果。 首先是 Bob 的抢跑交易:
即,Bob 用 5ETH 购得 47.62 个 A 接下来是 Alice 的正常交易,注意此时流动池中 A 的数量变为 952.38,ETH 的数量变为 105:
最后 Bob 卖出 47.62 个 A 的交易,此时流动性中 A 的数量为 869.57,ETH 的数量为 115:
通过这一次抢跑攻击,Bob 净赚 5.97-5 = 0.97 个 ETH,而 Alice 净亏 90.9-82.81 = 8.09 个 A,Bob 通过使 Alice 蒙受更大的滑点损失来获得自己的收益! 当然,实际的抢跑攻击会更复杂,攻击者需要进行更精密的计算,以求实现以下两个目标:
我们用图表来更好的描述这一过程:
解决方案既然我们已经看到了 Front-Running 的杀伤力,那我们有什么办法阻止抢跑攻击呢? 作为一般用户,应对 Front-Running 可以有以下几种手段:
|