DeFi 的世界里,不是只有”抢跑“才能获利
作者:律动研究院
原标题:《黑暗森林中,不是只有”抢跑“才能获利》
了解以太坊黑暗森林的朋友一定对抢跑 (Front running) 套利机器人印象深刻。这些机器人程序会时刻监测交易池中待确认交易,当发现存在套利空间的交易时,他们会发起一笔 gas price 更高的转账,确保能够在可套利交易前抢先入块。
举一个最简单的抢跑例子,此时 1 枚 UNI 可兑换 2 枚 USDC,通过监测我发现交易池中有一笔通过 Uniswap 以 USDC 大量兑换 UNI(可引起滑点)的待确认交易,我会发起一笔比此待确认交易 gas price 更高的 USDC 兑换 UNI 的交易,确保我的交易能够排在此交易之前被确认。由于大多数以太坊矿工挑选交易的默认标准为 gas price 的高低,为了自身收益最大化矿工会选择 gas price 高的交易优先入块。因此我们就以 2USDC/UNI 的汇率兑换到了相应的 UNI。当那笔大额兑换 UNI 的交易上链后,假设由于滑点引发的价格变化将 USDC-UNI 的汇率拉升至了 3USDC/UNI,此时若我将之前换得的 UNI 兑换回 USDC 就可实现 50% 的盈利。
然而在神奇的 DeFi 世界中,不是只有抢先别人一步才能获得套利机会,还有一种套利机制叫做「尾追」(Back Running)。
bZx「尾追」事件
2020 年 7 月 13 日,保证金交易借贷协议 bZx 通过 Uniswap 进行了其治理代币 BZRX 的 IDO(Initial DEX Offering)。此次拍卖在以太坊第 10451767 区块时开始,bZx 总共提供了 500 万枚 BZRX 代币。
活动刚一开始,某用户就「尾追」其后成为了本次 IDO 的第一位参与者,并以比发行价略高一点(由于联合曲线的滑点)的价格兑换了 IDO 总量几乎一半的 BZRX 代币。随着参与者的增多,BZRX 币价一路攀升,几分钟后,该用户以发行价 10 倍的价格将最初兑换的所有 BZRX 卖出,并成功将近 55 万刀的盈利收入囊肿。
听起来这一切好像都很简单,但其实为了完成这次「尾追」操作,该用户准备了 700 多个以太坊账户,并对交易池进行了严密的监控。
为了让大家更容易理解什么是「尾追」,我们举一个更加通俗易懂的例子。假设某平台宣布将在双十一当天零点举行 1 枚 ETH 换购 100 枚 BTC 的活动,本活动为无许可活动,所有用户可以进行参与。平台将在零点时使用官方地址在链上发起一笔交易宣布活动开始,第一个给官方地址转账 1ETH 的用户成功获得换购机会,并宣告本次活动结束。所有在平台方宣布活动开始前及活动结束后进行转账则被记为无效。
用户们不知道平台方发起的这笔转账会被收入到哪一区块中,用户更无法判断这笔交易将会是这一块中的第几个交易。那么想在活动开始后第一个给平台转账获得这次换购机会就只能单纯靠运气了吗?
不同的获胜对策
要解决这个问题,我们需要复习一下区块中转账排序的机制。首先,矿工会从交易池中挑选出待确认的交易并将其放入自己所搭建的区块内,而大多数情况下,如上文所说,矿工们默认的挑选标准是 Gas Price,也就是说,Gas Price 最高的转账将会成为该区块中的第一笔转账。当然,矿工也不一定非要按这种标准挑选转账,例如想要作恶的矿工可以将区块填满对自己有利的转账。
明确这一点后我们可以采取的策略就是平台方官方地址进行监测,并在发现平台方发起转账并上链后迅速向平台方地址发起一笔 gas price 极高的 1ETH 转账,确保我们的转账成为下一块的第一笔转账。
然而,除非平台方的转账是上一区块中最后一笔转账才能确保我们有 100% 的胜算,但这种情况发生的概率是极低的,所以我们需要想出另一种对策。
如果我们同时发起多笔交易,那这样我们的胜算不就大大提高了吗?假设即使所有被记做无效的转账在活动后平台方都将原封退还,但这个策略还存在着一些问题。首先,以太坊账户受到转账序号 nonce 的限制,每次只能发起一笔转账,上一笔转账未出现结果前是无法进行下一笔转账的。其次,若用户使用 100 个账号同时发起转账,那么用户需要预先准备 100 枚 ETH,这个成本是很高的。
这时候智能合约就派上用途了,智能合约不存在 nonce 限制。若我们部署的智能合约赢得活动,那奖品还是属于我们的。此时我们需要做的就是往我们的智能合约中打入 1ETH,然后准备好 100 个有足够支付 Gas Fee 的账户。在拍卖开始的时候,100 个账户同时调用这个智能合约,智能合约将向平台方发起转账。
但如果平台方没有按时开始拍卖呢?或者网络出现了延时呢?更好的方法是好好利用起交易池中所提供的信息,因为交易池能告诉你这条链上未来将发生的一切。那么我们需要做的就是盯紧交易池中的每笔交易,试着找出项目方地址所发起的交易,并查明此交易的 Gas Price,然后通过智能合约发起 100 笔与该交易 Gas Price 相同的转账。
为什么要发起与目标交易 Gas Price 相同的转账呢?还是根据矿工挑选交易入块的逻辑,由于我们发起的交易与平台方发起的交易 Gas Price 相同,所以我们发起的交易将有极大概率与平台方发起的交易出现在同一区块中,且很可能会将目标交易「包围」。若我们发起的 100 笔交易中刚好有一笔交易成为了目标交易后的第二笔交易,我们就成功地成为了本次活动的天选之子,以 1 枚 ETH 成功换得了 100 枚 BTC。
「天选之子」的操作
让我们再回到 bZx 事件,看看那个用户是怎么在短短几分钟内撸到了 55 万刀的。
若想登录 Uniswap 创建一个币种的交易对,你需要成为流动性提供者,向 Uniswap 提供该币和 ETH 各 50% 的流动性,这也将决定该币的初始价格,也就是 IDO 发行价。在 7 月 13 日世界协调时间 02:28:24,以太坊第 10451767 块,bZx 向 Uniswap 提供了 1000 枚 ETH 和 500 万枚 BZRX 代币,以 0.0002 ETH/BZRX 的发行价开始了 IDO。
该用户的策略是在 IDO 开始的第一时间以最低汇率用 ETH 兑换尽可能多的 BZRX(剩余一部分让其他用户能够持续兑换),坐等其他用户持续推高汇率,在汇率到达高点时将 BZRX 兑换回 ETH 盈利离场。由于 Uniswap 是唯一的兑换通道,且只有 ETH-BZRX 交易对,在保证能够以最低汇率兑换 BZRX 的情况下,之后所有买盘都将推高汇率并变成该用户的获利。
首先,该用户准备了 732 个以太坊地址并预存好 Gas Fee。随后该用户在 IDO 开始前不到一个小时的时候部署好了智能合约,并在智能合约中准备了 650 枚 ETH 用作兑换 BZRX。在 IDO 开始时刻 732 个以太坊地址同时广播交易。
最终他成功了,该用户发起的 732 笔交易中刚好有一笔正好排在了 bZx 注入流动性的交易(启动 IDO 的交易)之后。这笔成功交易之外的所有交易都失败了。
图片来源:<The fastest draw on the Blockchain: Ethereum Backrunning>
除了该获胜用户外,还有别的用户也尝试使用此策略。在第 10451767 区块中,一共有 266 笔交易,其中 141 笔来自于获胜用户,还有另外两个尝试使用此策略的用户分别发出了 59 笔和 23 笔交易,这些用户发起的交易与启动 IDO 的交易 Gas Price 一模一样都是 60GWei。最终获胜用户靠努力和付出得到了上天的眷顾。
成功以最低汇率兑得大量 BZRX 只能算完成了任务的一半,「天选之子」需要将这些 BZRX 在高点全部出货才算是大功告成。
由于 Uniswap 使用联合曲线计算交易对汇率,当 BZRX 储备量越来越少时,价格上升斜率将增加。
在 IDO 开启之后的第 14 区块时,他开始出货了!
图片来源:<The fastest draw on the Blockchain: Ethereum Backrunning>
他将最初以 650 枚 ETH 兑换的 1966111 枚 BZRX(最初发行价为 0.0002ETH/BZRX,但滑点导致最终成交汇率为 0.00033ETH/BZRX)分批在 190 个区块时间、大约 50 分钟(以 15 秒每区块来计算)的时间内完成出货,共获利约 55 万刀,总共消耗 Gas 为 1.47 个 ETH。
想成为「天选之子」其实很难
虽然乍一看用 1.47 个 ETH 撸到了 55 万刀的收益十分诱人,但其实这并没有想象中的那么容易。首先,这一切都是建立在你懂代码、会写智能合约的基础上,并且必须确保智能合约不存在问题,否则智能合约中的资产是十分危险的。其次,就算写好了合约,还有其他会写合约的用户与你竞争这个套利机会,你并不一定能够成为那个天选之子。再者,就算你是第一个冲进去的,而且用最低的汇率冲到了很多代币,如果后面没人接盘,那这些代币同样会砸在手里。最后,最关键的是你得先有 650 个 ETH!
参考阅读:
启动 IDO 的交易
获胜用户智能合约地址
<Ethereum is a Dark Forest>
<The fastest draw on the Blockchain: Ethereum Backrunning>