编者注:本文简述了一个非常有趣的故事,一个专门去套利的机器人,被人”套利“了,非常奇妙。

嗨,机器人 ! 把你的钱都给我 ...

不看版:曾经在 Uniswap[1] 上交易过的机器人,可以申领到 400UNI。但他们需要小心!如果机器人没有得到适当的保护,就会遭到抢劫。这是一个讲述被黑客利用故事,对黑客来说,这只是利用 $EMN 之前的热身,也是对粗心大意的机器人操作者一个警示。

@FrankResearcher[2] 最近的推特中描述的案例,给了我们启发。

嗨,机器人 ! 把你的钱都给我 ...

真的可以从 Uniswap 上交易过的合约上申领 UNI,并从中窃取代币吗?

在与_@bkiepuszewski_[3] 进行了一些数据整理后,我们意识到,在很多情况下,这是可能的,这个漏洞可以很容易地用来窃取机器人托管的任何代币。

所以,趁早检查你的机器人吧!

通用套利模式

当同一资产在两个交易所的价格不同时,就会产生在一个地方瞬间买入,在另一个地方瞬间卖出的机会。

例如,如果在交易所 1 上 1 UNI=0.01219 ETH ,而在 Exchange2 上 1 UNI=0.01321ETH ,而你恰好有 10 个 ETH,你可以:

  1. 在交易所 1 上以用 10 ETH 购买 820.3445 UNI。

  2. 立即在交易所 2 上用 820.3445 UNI 兑换 10.8367 ETH。

  3. 享受你的利润,即 0.8357 ETH 减去 gas。

每个市场上都有成百上千的机器人在寻找这样的机会,这通常是一个双赢的局面。机器人为其操作者创造了利润,但同时也使市场保持了平衡(每一个交易所的资产价格在时间上趋于平稳)。

简单套利机器人架构

套利的关键在于时机。套利交易者必须在别人发现机会之前,迅速采取行动,因为他们的成功取决于两个独立的交易。对他们来说,最好的解决方案通常是创建一个套利机器人。

可能的架构有很多,我不多说技术细节,但通常会包括:

  1. 链外逻辑 --实时跟踪市场价格和 gas 成本,寻找套利机会,评估风险和同时权衡风险 / 回报。

  2. 操作者 --用于触发机器人行动的以太坊地址。

  3. 机器人本身 --一个智能合约,具有 存款 (它需要资金来启动套利), 功能函数 (去唤醒起来接收执行指令), 参数化 (告诉机器人该怎么做)。

套利例子

我们来看看这个机器人 [4] 被”利用“之前的历史。

例如在本次交易 [5] 中,它在 WETH/MCX 市场上 Balancer 和 Uniswap 之间的套利赚取了 0.0197ETH ,花费了 0.0067ETH 的油费。

可以想象一下机器人和它的操作者之间的对话:

操作者发现在 Balancer 上的 MCX 价格比 Uniswap 的价格低一些。

操作者 - " 嘿,机器人,醒醒吧。这是 0.65ETH。去 Balancer 上买一些 MCX,然后马上在 Uniswap 上卖掉。"

机器人 --" 是的,是的,是的 ! 让我们赚取利润!"

机器人在 Balancer 上交易 0.65ETH,得到 9955.29 MCX

机器人 --" 万岁,交易成功。让我检查一下我的口袋。哇,我有 9955.29MCX,我们赚一笔吧!"

机器人在 Uniswap 上交易 9955.29 MCX,获得 0.6696 ETH.

机器人 --" 万岁,交易也成功了。我有 0.6696ETH,是由最初的 0.65ETH ”生“出来的。利润不错哦!我就是这样一个伟大的机器人。请抱抱我 ......"

潜在的攻击

要实现这一切,至少有两个命令需要机器人理解。

  • 某种 " do_arbitrage " 指令,在该指令中,操作者说在什么地方、什么东西和如何交易资产;以及

  • 某种 " give_me_your_money " 的指令,操作员从机器人的口袋里提取赚取的利润。

很明显,第二个指令必须尽可能的保护起来,因为操作者绝对不希望别人偷走它的珍贵 Tokens。

但第一个命令似乎很安全。如果机器人足够聪明,可以检查套利是否成功,是否获利,那么操作者为什么要保护这个?甚至鼓励大家调用机器人,为我们赚钱,也许是好事呢?这其实是第一个潜在的攻击点。

这可能是操作者在被利用的机器人中留下 "do_arbitrage " 函数不加保护的一个原因。

第二个潜在的攻击点是在参数化调用给了太多的自由。其实这个机器人假定至少要与 UniswapRouter 的 swapExactTokensForTokens 函数进行一次交易,但这对于一个聪明的”利用者“来说并不是什么大问题。

为合约申领 UNI

现在简单说一下关于申领 UNI 代币的问题。

正如 Uniswap 公告 (链接 [6]) 的那样,在 Uniswap2 上交易的每个地址都有资格申请到 400 UNI。这也意味着,曾经在 Uniswap2 上交易过的合约(尤其是机器人)也可以领取 UNI。

但这样一个已经部署好的机器人,很可能没有实现 " 申领 " 功能,所以你可能会觉得无能为力。

但 Uniswap 提供了另一种方法--你可以代另一个地址申领 UNI。

这是一个使用 EthTx.info[7] 的这种交易 [8] 的例子。

嗨,机器人 ! 把你的钱都给我 ...

所以合约 [9] 得到了不错的新 UNI 代币奖励,但真正的问题是如何从机器人的口袋里提取代币?如果它是你的合约(并且你被授权调用它的功能),它可能很简单。但是,如果因为某些原因无法这样做呢?

或者说,如果不是你的机器人呢?

这就是这个故事变得有趣的地方

这一切是如何发生的