1. 首页
  2. 开发者

三明治交易和沙门氏菌攻击简单科普

近期看到外网某位“科学家”大佬通过构造恶意的ERC20 token(被他称作Salmonella,即沙门氏菌),反向围猎三明治交易者的故事,感觉非常有意思

原创作者:比特币观察者(头条号)

近期看到外网某位“科学家”大佬通过构造恶意的ERC20 token(被他称作Salmonella,即沙门氏菌),反向围猎三明治交易者的故事,感觉非常有意思(抱歉啊,这个事情实在是戳中我的笑点了)。因此我试图把整个事件里包含的原理做一个简单的科普,就有了这篇文章。

我知道这样的文章基本上很难做到好看,但我的确试图向你们展示区块链领域比较黑暗的一面—“科学家”的世界。

坐好,开车了。

三明治交易和沙门氏菌攻击简单科普

如果我说,交易当中有一些方法可以做到稳赚不赔,你相信吗?

事实上,的确有。

无风险获利的交易方法有很多,有的合理合法,有的不合法,还有的缺乏道德。

我们在前面提到所谓三明治交易,就是属于缺乏道德的无风险获利方法。

先说一个概念,AMM。

AMM指自动做市商系统,即流动性提供者(LP)按照池子价格,将一个交易对的两个代币(比如:USDT和UNI),按比例存入池子。

当最终用户进行USDT-UNI交易时,实际上是将其支付的代币一方放入池子,以换回标的代币,其兑换价格是由池子里两个币种的数量和交易用户置入(或置出)代币的数量有关,不同的DEX(去中心化)有不同的恒定算法(常见的包括恒定乘积,恒定和,恒定平均值)。

这样当一笔交易完成时,池子中的两个代币对的数量会发生变化,导致代币对的名义汇率发生变化(置入代币价格下降,置出代币价格上升),即滑点。

Uniswap的v1和v2都是基于AMM体系搭建的DEX,不同的是V2使用路由模式,即uniswap会自动帮用户选择两个token之间的交易路径。他带来的一个问题是无常损失(IL),当然这个与我们今天的话题无关。

以上是uniswap等AMM模式DEX的基本原理。

那么我们考虑这样一种情况,当有一个正常的交易用户,在uni上进行一笔数额较大的交易(我们给个代号叫交易A),导致交易对的价格产生了比较大的变化时,比如说:

交易对uni-usdt,当前价格是1uni:30usdt,他的一笔大型买入uni导致价格变成了1uni:31usdt,即uni涨价了。

我们怎么利用这一点?现在,放飞想象力,先无视掉物理法则。

如果。。。如果我在这笔大型交易值钱,先买(代号交易B1)一点uni,等他交易完之后,再卖出(代号交易B2)刚才买的uni,低买高卖不是就挣钱了吗?

你可能会想,你是不是傻的,交易A不是已经完成了吗,你怎么回到过去,回到它之前执行交易B1?

告诉你,区块链的世界不那么完美,这些不完美,导致我们可以做到这一点,具体的,一会说。

正是因为交易B1和交易B2像三明治的两片面包一样,把正常的交易A夹住了,所以我们才把这种攻击行为称为:三明治交易。

现在我们知道,只要我能按照正确顺序实现B1-A-B2,由于A导致的价格滑点,我赚钱是必然的(只要算计好利润能够cover掉我两次交易的gas fee和千分之三的uniswap手续费)。

回过头来说怎么正确的摆出B1-A-B2顺序的交易姿势:

方法有2:

第一种:以太坊是基于POW的区块链打包方式,矿工(或者说各大矿池)基本上通行的准则都是贪婪挖矿,即优先打包高手续费(gas fee)的交易。

因此在交易A被打包之前(存在于eth链的mempool中),只要我的交易B1比A的gas fee给的高,就可能被矿工优先打包到区块里,这样我就可以实现“回到过去”(流程是:扫描mempool发现符合我条件且尚未被打包的大型交易A,提高gas发出我构造的交易B1,并以略低于A的gas提交卖出交易B2)。

但是这里有个问题,就是这三个交易中间可能会被插入其他交易,导致最终A或者B2没有被打包或价格不符合我心意,导致亏损。

于是有方法二:我们知道部分矿池会提供MEV(矿工可提取价值)服务,即通过线下撮合的方式,付费要求矿池对特定交易(的tx号)进行打包。

进一步,现在部分供应商可以提供组合tx打包的交易,即完全无视gas的情况下,让矿池打包B1-A-B2这个交易组合。

那么只要把B1和B2的gas设置的非常低。然后提交给MEV服务上进行打包,就可以确保实现我需要的交易和交易顺序,从而稳定盈利。。。。

以上就是三明治的基本原理和实现。

烦躁了啊,我自己都觉得写的不好。坚持一下,再讲讲沙门氏菌攻击

针对最近兴起的三明治交易(我们说了这个行为最起码是不道德的,因为它利用了大户的正常交易,并且篡改了交易顺序)。有另外一位科学家大佬CodeForcer精心构建了一种它称为沙门氏菌的攻击方法,成功围剿了三明治交易者,并赚了他们140个ETH(这可是不小的一笔钱)。

让我们回顾三明治攻击,牢记B1-A-B2这个交易顺序,即它想获利,必须先买入代币。

CodeForcer正是利用了这一点,自己创建了一个包含陷阱的ERC20代币(即这个salmonella token),这个代币比正常的ERC20多了一个特点,即除了onwer自己以外,其他人转账只能转出10%。

至此,核心的攻击模式已经完备。

然后是具体操作:

1. 在uniswap上创建一个saolmonella-eth的流动性池;

2. 按照事先扫描的三明治攻击者行为,他开始自己在这个池子里进行交易,目的是为了告诉三明治机器人:“我是一个看起来有点受欢迎的代币,欢迎你来监控我的大额交易A”

3. 在合适的时机,他放出了自己的交易A,但是他构造的这个A,其gas比即时的gas水平略低,以避免立刻被不明真相的矿工打包

4. 然后就没有然后了,攻击至此结束

我们来看一下:当三明治机器人检测到交易A的时候,它开始采取行动,布置了B1和B2两个套利交易,但是事实上,由于代币salmonella本身有陷阱,任何其他人(包括uni的Router合约),在Transfer这个代币的时候,只能让接收方收到10%的代币。

这就相当于,三明治机器人花了10个ETH,结果只买到了1个ETH的sal代币,它怎么卖都亏死,至少9个eth被留在了CodeForcer创建的流动性池里。这部分ETH就是这位大佬的利润了。。。

大致的介绍就是这样了,我好久不正经写东西了,很丑,希望该讲的内容是讲清楚了。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注