BTC
ETH
HTX
SOL
BNB
查看行情
简中
繁中
English
日本語
한국어
ภาษาไทย
Tiếng Việt

鲜为人知的财富密码:抢跑机器人有多厉害?|烤仔星选

讲道李
特邀专栏作者
本文约5261字,阅读全文需要约8分钟
区块链是科学家的提款机,这话不是吹的。
AI总结
展开
区块链是科学家的提款机,这话不是吹的。

以太坊黑暗森林可谓是野兽横行,这绝对不是骇人听闻。这些抢跑机器人可以靠分析合约的调用,从而发现潜在的赚钱机会。

大部分人对于抢跑机器,可能还闻所未闻,所以我们先来简单介绍下概念、分析行为,并且我们还研究了它们的效率、成功抢跑交易的概率,还用了很多方式来尝试抵御它们。

什么是抢跑交易?

首先介绍下概念,通常抢跑交易指的是,在一个已知的未来交易发生前,将另一个交易插入执行队列的第一位。

举个例子🌰,交易所的交易过程。比方说有人准备在 Uniswap 上购买大量 ETH(足够拉盘的那种),一种获利的方法就是趁价格还没涨赶紧买,等到拉盘以后再卖。

抢跑也不仅限于上面提到的这个方式,还有其它很多,比如清算、购买稀有的NFT,或者是制造一些用户错误。这里要给大家引入一个概念:MEV,矿工可抽取价值——一个交易或一组交易的可抽取价值。

在ETH链上要抢跑交易,可以通过提供调高转账手续费,比目标交易略高一点,激励矿工在打包时把自己的交易排在前面。因为 gas 价格高的交易会优先执行,所以,如果有两笔交易都想从同一个合约调用中获利,这两笔交易被打包到同一个区块了,那肯定是看谁的 gas 费给的越高,谁能排在前面,才能成功抢先套利。

所以话说回来,抢跑交易某种程度上也算是套利。

动物行为学

在 Dan Robinson 和 Georgios Konstantopoulos 共同编写的文章《以太坊是黑暗森林》中,提到了一个概念:价值抽取。故事讲述了一次拯救价值 12,000 美金 token 的过程中,被套利机器人(“捕食者”)截胡的经历。这些套利机器人非常先进,非常强大,它们能够追踪以太坊交易池里的套利交易,通过抢跑,就是上文我们提到的,来获取利益。

黑暗森林这篇文章挺有意思的,建议大家有空可以读一读。如果看过的读者可能会觉得文章讲的太匪夷所思了,不敢相信:像 Uniswap 这种被大量机器人监控的平台,竟然还能有“超级捕食者机器人”能虎口夺食,从众多套利者手中抢钱?这些所谓的机器人是不是也是一群普通的套利者?

不过,你不知道不代表没有。它们不是普通的机器人,它们可以调用之前从未被调用过的智能合约函数来抢钱,而且还是在原始交易被代理智能合约混淆的情况下。

能做到这个份上,至少应该引起大家的警觉了。因为能够监视交易池中交易,就相当于拥有了一个大武器。但是比较让人担心的是,现在已经有一些服务商开始公开提供 “暗池” 交易层了。

所谓的“暗池”交易层,不需要使用 Infura 之类的服务,甚至都不需要搭建私有节点,它会直接发送交易给矿工,承诺不会将交易广播给网络中的其它节点,这样,交易就不会套利机器人发现,可以保护交易躲过“捕食者”。

有一个很出名的白帽子叫 samczun,他和自己的很多小伙伴也采用了同样的方法,成功从一个出现漏洞的合约中拯救了 960 万美元。所以不难想象,矿工也会开始运行抢跑交易机器人,同时只为支付额外费用的 trader 提供安全通道。

这些机器人只在以太坊主网上运行,和以太坊的其它部分不同,比如说有的智能合约可以在开发环境或测试网中测试。除了一些初步实验之外,让抢跑机器人去抢跑测试网交易没什么必要,赚不了钱。此外,它们不需要跟其他人一样遵守规则,因为它们的逻辑是隐藏的。

我们还不清楚抢跑机器人在什么样的情况下会出手,什么情况下罢手。所以,现在去追踪这些机器人有点像在寻找珍惜野生动物,很难,也很有挑战性。而且我们也无法找到所有类型的机器人,这里只针对特定的、广义的机器人。

为了实现上面提到的 “找到特定的、广义的机器人” 的目标,我们需要去设一个特殊的陷阱——一个新的智能合约,由一个秘密字符串的 SHA256 哈希值创建,并且在合约中放一些资金,只有提供秘密字符串的人才能取出合约里的资金,然后一旦有人发送取款交易,资金会直接发给交易的发送方。

设置这个陷阱最初的设想是,发起一笔提供正确秘密字符串的 “诱饵” 交易,看看有没有会去复制这个字符串,并且自己发送一笔提供含有这个字符串的交易取走资金。如果有人能在 “诱饵”交易之前取走,那说明有人能分析交易、复制相关内容,并且自己给出秘密合约里的内容。

实验结果很有意思,机器人能向一个之前从没见过的合约提供之前从没见过的秘密字符串,然后资金就被撬走了,这就是真正的广义的特定的抢跑机器人呀!

抢跑机器人是怎么工作的?

下面我们来了解下抢跑机器人的工作机制。但是我们只能通过它们的行为来逆向推导,因为大家想想,如果是你,制造了一台赚钱机器,你可能会把它分享到 Github 上吗?Of course not!

首先需要两个组件:

1. 以太坊账户,带不带有智能钱包代理都行

2. “后端”,也就是整个操作的大脑,通常发生在链下

机器的运营者可以通过某种技术来检查交易池子里的每笔交易,并且解析、替换参数(比如替换交易调用方)、得出结论(这笔交易是否有利可图,这一单值不值得做)。

上图为抢跑交易机器人的工作流程

一个理性的机器人模式不会去抢跑一笔交易费超过潜在收益的交易,而且交易手续费可能会很高,尤其是在 gas fee 很高的情况下。所以要想引机器人上钩,我们至少需要设定一定的利润。

此外,交易池中有很多笔交易,机器人要对每笔都做个分析,时间紧迫。一个以太坊区块平均大概 12 秒产出,那么如果交易手续费足够高,抢跑机器人必须赶在下一个区块挖出前迅速分析,然后赶紧替换掉原交易。

这个过程也有一定的概率。比方说,一笔交易被广播后,区块立即就被挖出了,机器人根本没有时间去分析,就没有机会了。

考虑到上面的这些因素呢,我们做了下面这套吸引抢跑机器人上钩的方法。重点来了!👇

设下陷阱

我们在合约中设置的初始 balance 是 0.035 ETH,按当时的价格算,总价值约 20 美元。任何人,只要能提供合约中存储的哈希值的正确原像,也可以说是秘密合约,就能拿走这笔钱。然后呢,拿走这笔资金的交易会触发抢跑机器人行动,另一个账户 taker 会试图通过提供正确的秘密合约来提走这笔钱。

第一回合失败:直接调用合约

为了确保我们设下的陷阱能正常工作,我们首先使用 taker 账户来调用智能合约。当时 gas fee 比较高,我们成功取回了合约中的资金,没有吸引到抢跑机器人。

反思下原因,可能是因为利润太低了,对于抢跑机器人来说没有任何吸引力;也可能是因为包含交易的这个区块很快就被挖出,抢跑机器人还来不及反应。

我们调整了一下,准备开始下一回合。

第二回合成功:给抢跑机器人多余留一些时间

这一次,我们把潜在利益提高了,合约中的资金增加到了 0.04 ETH;并且降低了交易手续费,所以包含交易的区块没有很快被挖出,给机器人多一些时间去捕捉。

这次,我们成功了!

等了大概三分钟,这笔交易还没被挖出,没能拿到合约中的资金。然后我们把合约中的所有内部交易认真地看了一遍,发现资金已经被其他人给取走了。

我们的 taker 账户发起的交易用了 25 Gwei,抢跑机器人用了 25.000001111 Gwei,就只比我们多了 0.000001111 Gwei,而且,两笔交易还被打包进同一个区块了。

复盘第二回合:寻找机器人的线索

好了,既然我们花了 0.04 ETH和一些手续费已经抓到它了,这下我们可以好好分析下了。

首先,抢跑机器人没有直接调用合约。它没有复制 taker 的交易并通过自己的账户发送交易,而是将交易发送给代理智能合约,由代理智能合约充当智能钱包来执行交易。

接下来,我们就可以去追踪这个机器人的地址了,看下它到底成功抢跑了多少笔交易,研究一下它的运作原理。

上图为抢跑机器人自己的代理合约,我们对这个代理合约进行反编译,发现主要有两个函数:

Withdraw:将合约中的所有资金发送给该运营者。另一个函数负责接收参数:需调用的合约、参数清单、传递值参数。

有了取款函数,代理合约就可以成为运营者的智能钱包。除了能够执行调用外部函数的作用之外,还可以确保交易开始时的余额不低于结束时,否则交易是可以还原的,从而避免了因调用未知合约造成潜在的损失,当然这里的损失是不包括 gas fee 的。

我们还监控了这个机器人自 2018 年 5 月开始运行以来的战绩。

假设它始终用同一个代理合约和地址来抢跑,可以算出它到目前为止总共赚了 17 ETH 左右。

上图为我们监控到的机器人的收益,单位是 ETH

第三回合探索:抢跑交易机器人有多厉害?

既然我们已经找到机器人了,向大家证明了之前的假设是成立的,那我们来测试下,能不能用第二个合约混淆调用,取回诱饵合约里的资金。

第二个合约是一个代理合约,会通过调用函数取走诱饵合约里存放的资金。另外,第二个合约还有 “取回” 函数,可以让我们取回资金。

我们部署了一个 ProxyTaker 合约,然后调用函数,尝试把我们的资金取回来。由于使用代理合约取走资金的成本相对来说比较高,所以我们又将 “诱饵” 合约中的资金增加到 0.055 ETH。果然,这笔交易马上又被另一个机器人给抢跑了。

这个机器人有点牛,它不仅可以检测到我们的取款交易,居然!还能识别出,这个交易来自另一个完全不同的合约的内部调用!而且,它还能在极短的时间完成这一套流程,真的是匪夷所思。因为我们的交易仅仅在几秒内就被成功挖出了,这个机器人的也是如此,太让人震惊了。

而且这个机器人的身份也很有意思,它的合约是由一个名为 arden43y 的账户控制的,这个账户在以太坊浏览器 Etherscan 上写了一条评论,使我们不禁联想到之前有白帽子尝试从有漏洞的 Bancor 智能合约中提走用户资金的行为。

上图为机器人运营者账户在以太坊浏览器留下的评论:如果你觉得我偷了你的钱,并且能证明这是个错误,我就把钱还给你。

第二个机器人的行为和第一个特别一样,都是通过调用账户的代理合约,然后把资金发给另一个账户,所以我们怀疑这个机器人在白帽子的拯救活动中,对白帽子反手就是一个抢跑。

但是第二个机器人比第一个要复杂得多,第一个只聚焦在以太坊链上,第二个还对很多其它的套利交易也在执行。

而且第二个机器人账户余额有大概 300 ETH,它赚的更多。并且,通过所有流入和流出代理合约地址的资金,可以估算到第二个机器人总计大约 900 ETH。

最终回合:这一次,成功抵御了机器人

这一次,我们用了一个新的代理合约 OwnedTaker,这个代理合约只有我们能用,混淆调用。我们又往 “诱饵” 合约中放了 0.05 ETH。这笔资金同样会通过交易返回给我们,而不是留在合约中。

在第一次尝试中,发送到 OwnedTaker 合约的交易在大概 1 分钟后才被挖出,我们成功取回了 “诱饵” 合约中的资金。

这次实验又重复了一次。这一次,我们往 “诱饵” 合约中重新存入 0.06 ETH,这是到目前为止我们放的最大的 “诱饵” 了,所以可以排除抢跑机器人不上钩的可能。

另外,我们还特意将交易费设成一个比较低的值,交易等了大约 7 分钟,但还是成功取回了资金。

所以结论是:使用只能由所有者用来转发交易的 Owned 代理合约,可以有效防止了机器人解析数据并抢跑交易。

上图为成功取回资金的过程

或许因为只有合约所有者能执行调用,或资金被发送至与调用合约不同的地址,使得我们成功躲避了抢跑交易机器人。

这些机器人很可能被设置成了以自我保护为首位。毕竟,当它们调用未知合约时,该合约有可能执行任意代码。因此,我们可以合理地假设,在不能保证利润的情况下,它们会选择避免不必要的风险或交易费损失。

我们真的成功抵御住抢跑机器人了吗?

我们真的赢了吗?这就取决于你怎么看了。我们使用了一个新的合约,而且只有我们自己知道秘密字符串。显然,我们捕获的两个抢跑机器人会检测交易池中的所有交易。从它们所获得的利润来看,这确实是它们的强项。

我们为什么能在最后一次实验中成功抵御了抢跑机器人的攻击?

这很难说。可能是因为机器人不愿意冒险与带有身份认证的合约通信,或是因为它们没有料到资金会被转移到另一个地址。这并不能保证这个方法可以抵御所有抢跑机器人。更有可能是,因为交易池中潜伏着更高级的机器人,它们根本不愿意冒险获得如此微薄的利润。

结论

通过这次小实验,我们证明了抢跑机器人不仅存在,而且还很智能。

当然,我们知道这个实验并不完整,没法得出权威的结论。还有很多其它类型的机器人,它们的触发机制和运行方式各有不同,诸如潜在利润、通信模式和最小复杂度,比如 gas fee 上限等因素也会影响到其运行方式。

但是我们相信,我们的实验提供了概念证明,并且进一步揭示了这些抢跑机器人的作案手法。

令人震惊的是,如果有人调用一个能够产生收益且任何人都能调用的合约,即使它非常晦涩难懂,也很有可能会被抢跑机器人抢先一步。

因此,了解这些机器人及其运行方式至关重要,这样我们才能构建更安全的系统。诸如 Flashbots 之类的项目试图通过使 MEV 提取民主化并使其成为公共资源来做到这一点(MEV 就是矿工可抽取收益)。我们希望这项研究有助于实现这一目标。

本文参考:

原文链接:https://zengo.com/ethology-a-safari-tour-in-ethereums-dark-forest/

原文作者:Alex Manuskin

ETH
烤仔星选计划
欢迎加入Odaily官方社群