传声筒 | 黑暗森林生存法则 --- 以太坊
2023-09-16 13:58
Z2H_Labs
2023-09-16 13:58
订阅此专栏
收藏此文章



点击蓝字 关注我们



作者:Dan Robinson, Georgios Konstantopoulos

编译:H+H@InfoFlow

排版:ZaynR@Infoflow


注:这是发表于 2020 年 8 月 28 日的一篇文章,但在今天看来,仍然有很强的参考意义


这是一个恐怖故事。


和许多人一样,我大部分时间都在 Uniswap Discord 的#support 频道中潜水。

 

周三下午,有人询问是否有可能收回意外发送到配对合约中的 Uniswap 流动性代币(注:Uniswap v2 有三个核心合约包括工厂合约、配对合约、路由合约)。

 

我最初的想法是代币将永远被锁定。但那天深夜,我突然意识到,如果代币还在那里,任何人都可以找回它们。

 

当调用 Uniswap 核心合约上的 burn 函数时,合约会计算自己的流动性代币余额并销毁它,将提取的代币发送到调用者指定的地址。这是 Uniswap v2 预期行为的核心部分(基本机制在 Uniswap v2 白皮书的 3.2 节中描述)。

 

我找到了合约地址。流动性代币仍然存在,价值约为 12,000 美元。

 

这意味着三件事:

 

- 时间紧迫。即使没有其他人注意到这些免费资金,任何人都可以随时提取自己的流动性,意外地从合约中收到代币。

- 我可以做白帽黑客,尝试为不小心发送流动性代币的人挽回资金。这就像调用池子的 burn 函数一样简单,我只需要把自己的地址传递给函数。

- 当然……我知道这不会简单。





黑暗森林




众所周知,以太坊区块链是一个高度对抗性的环境。如果智能合约可以被利用来获利,那么它很快会被人利用。黑客攻击的频率表明,一些非常聪明的人花费了大量时间来检查合约是否存在漏洞。

 

但与 mempool(一组待处理的、未经确认的交易)相比,这种无情的环境让人感到苍白无力了。如果链本身是一个战场,那么 mempool 则更糟糕:一片黑暗的森林。



《黑暗森林》是我最喜欢的科幻小说。它引入了“黑暗森林”的概念——被发现就意味着肯定会死于高级捕食者手中。在这种环境下,公开识别别人的位置就等于直接摧毁他们。(这个概念也是以太坊测试网上的 Dark Forest 游戏的灵感来源。注:Dark Forest 是当前全链游戏的领头羊)

 

在以太坊 mempool 中,这些顶级掠夺者以“套利机器人”的形式出现。套利机器人监控待处理的交易并尝试利用它们创造盈利机会。没有白帽黑客比智能合约研究员 Phil Daian 更了解这些机器人,他与同事一起撰写了 Flash Boys 2.0 论文,并创造了“矿工可提取价值”(MEV)一词。

 

Phil 曾经向我提过一种宇宙级恐怖,他称之为“全面领跑者”(generalized frontrunner)。套利机器人通常会在 mempool 中寻找特定类型的交易(例如 DEX 交易或预言机更新),并尝试根据预定的算法抢先交易。抢跑者寻找任何可以通过抢跑获利的机会——通过复制交易并用自己的地址替换原交易中的地址。他们甚至可以通过执行交易,然后复制有利可图的内部交易。

 

这就是为什么这次救援不会那么简单。任何人都可以调用 burn 函数。如果我提交了一个交易调用了 burn 函数,它就像一个闪烁的“免费资金”标志,直接指向这个有利可图的机会。如果这些怪物真的在 mempool 中,他们就会看到、复制、变异并抢占我的交易,在我的交易被包含之前拿走钱。

 

请注意,mempool 的环境甚至比以太坊区块链状态本身还要残酷得多。这笔免费资金已经在链上存放了大约八个小时,未被发现,等待任何调用 burn 函数的人将其带走。但任何试图拿走它的行为都会在飞行中立即遭到狙击。





救援措施




为了尝试在不惊扰机器人的情况下提取资金,我需要混淆交易,使得它们无法检测 Uniswap 货币对的调用。这将涉及编写和部署自定义合约。虽然我是一名专业的 DeFi 思想领袖,但我之前从未在以太坊上实际部署过合约。

 

我需要帮助,而时间已经过了午夜。幸运的是,我认识到一些优秀的智能合约工程师住在欧洲时区。我的 Paradigm 同事 Georgios Konstantopoulos 同意帮助合约部署和提交交易。我们另一家投资组合公司 Yield 的首席工程师 Alberto Cuesta Cañada 自愿执行这些合约。



一些优秀的以太坊安全工程师帮助我们制定了混淆计划。除了将调用隐藏为内部交易之外,我们还将交易分为两部分:set 交易激活合约,get 交易在合约激活时救援资金。这将按如下方式实施:

 

- 部署一个 Getter 合约,当其所有者调用时, burn 函数仅在激活时才会被调用,否则将 revert。

- 部署一个 Setter 合约,当其所有者调用该合约时,该合约将激活 Getter 合约。

- 提交 set 交易和 get 交易使它们被同一个区块打包。



如果攻击者仅尝试执行 get 交易,它将在不调用 burn 函数的情况下 revert。我们希望,当攻击者按顺序执行 set 和 get 交易以发现内部调用 pool.burn 并抢先我们的交易时,我们的交易已经被包含在区块内了。

 

令我们惊讶的是,get 交易即使在我们手动提高 Gas 后,交易也会被 Infura 拒绝。经过几次失败的尝试和重置后,时间压力降临到我们身上,我们草率了。我们让第二笔交易(注:get 交易)滑入之后的区块中了。

 

这是一个致命的错误。

 

我们的 get 交易确实被包含了,但出现了 UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED 错误,这意味着流动性已经被提取了。事实证明,在我们的 get 交易进入 mempool 后的几秒钟内,有人执行了调用并偷走了资金。

 

怪物已经吞噬了我们。


他们是真实存在的!


我们从理智上知道这些抢跑机器人的存在。但在你真正看到它们的实际效果之前,你可能会低估它们。

 

我们抱有一些希望,通过授权合约将救援作为内部调用,将存储中的变量作为目标地址传递,这可能会成功,但事实并非如此。

 

如果你发现自己处于这种情况,我们建议你联系安全研究 Scott Bigelow,他一直在研究这个主题,并有更好的混淆器原型实现。

 

不要马虎

即使在时间压力下,我们也应该坚持计划。如果我们能在脚本上花费更多时间,比如调整合约(也许将 Getter 合约更改为不执行任何操作,而不是在激活之前调用函数时 revert),或者同步我们自己的节点,避免使用 Infura,我们就可能将交易打包进同一个区块。

 

不依赖常规基础设施

你所做的事情越奇怪,就越难通过 Infura 等现有基础设施提交交易。在我们的例子中,我们试图提交一笔交易,根据当前的区块链状态,该交易看起来会失败,而 Infura 对此有合理的保护理由。而使用我们自己的节点可以避免这个问题。

 

如果你碰巧认识一个矿工(我们不认识)会更好,你可以让他们将交易直接包含在一个区块中,完全跳过 mempool 和怪物。


未来只会变得更加可怕

这只是抢跑交易事件的一个例子。类似的事情每天都会发生无数次。如今,领跑只是机器人。明天,将是矿工。

 

当前,矿工们如果不抓住这些机会,就会白白浪费金钱。未来,他们将为了自己的利益重新排序并提交 mempool 中的交易。更糟糕的是,他们可以重组其他矿工开采的区块,试图窃取他们未认领的 MEV,从而导致链不稳定。

 

我们认为这种未来是可以预防的,并且对一些雄心勃勃的尝试感到兴奋。作为 layer 2 扩展解决方案 Optimistic Rollup 的一部分,Optimism 的愿景是如何重新定向 MEV 以造福生态系统。而 StarkWare 除了是 layer 2 扩展系统之外,还构建了名为 VeeDo 的“可验证延迟功能”服务,可以使以太坊应用程序免受这种抢跑交易攻击。



原文链接:https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest


·END·

关于讯流 InfoFlow:

讯流科技立足于华人初创项目,提供 Web3.0 与区块链项目方从 0 到 1、成体系、差异化、阶段化的内容叙事服务,并帮助项目方链接跟踪深度关注用户。


相关链接:

Twitter: @InfoFlow_CH

即刻: https://okjk.co/P08u7i

Nextme: https://nextme.one/InfoFlow

小宇宙:讯流会客厅


声明:请读者遵守所在地法律法规,本文不代表任何投资建议。



【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

Z2H_Labs
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开