以太是一片黑暗的森林:一个恐怖故事

2020-08-29 04:49:59

像任何正常人一样,我花了很多时间潜伏在Uniswap不和谐的#支持频道上。(披露:Uniswap是Paradigm的投资组合公司。)。

周三下午,有人问是否有可能收回意外发送到该对合约本身的Uniswap流动资金令牌。

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

当任何人调用Uniswap核心合约上的Burn函数时,合约会测量其自身的流动资金令牌余额并烧毁它,将提取的令牌提供给调用者指定的地址。这是Uniswapv2预期行为的核心部分(基本机制在Uniswapv2白皮书的第3.2节中描述)。

我找到了那份合同。流动资金代币仍然在那里-价值约12000美元。

有一个滴答滴答的钟。即使没有其他人注意到这笔免费资金,任何人都可以随时提取自己的流动性,意外地从合同中收到代币。

我可以戴上我的白色帽子,试着为不小心送进来的人找回代币。只需调用池上的Burn函数,并将我自己的地址传递给它就可以了。

以太区块链是一个高度对抗性的环境,这已经不是什么秘密了。如果一份聪明的合同能够被利用来获利,那么它最终会是这样的。新黑客攻击的频率表明,一些非常聪明的人花费了大量时间检查合同是否存在漏洞。

但是,与内存池(一组未决的、未确认的事务)相比,这种不可饶恕的环境就相形见绌了。如果说链条本身就是一个战场,那么记忆池就更糟糕了:一片黑暗的森林。

“黑暗森林”是我最喜欢的科幻小说。它引入了“黑暗森林”的概念-在这种环境中,发现意味着一定会死于高级捕食者之手。在这种环境下,公开识别别人的位置等同于直接摧毁他们。(这个概念也是以太测试网上“黑暗森林”游戏的灵感来源。)。

在以太记忆池中,这些顶级捕食者以“套利机器人”的形式出现。套利机器人监控悬而未决的交易,并试图利用它们创造的有利可图的机会。没有人比菲尔·戴安(Phil Daian)更了解这些机器人了,他是一位聪明的合同研究员,与同事们一起撰写了“闪光男孩2.0”(Flash Boys 2.0)一书,并创造了“矿工可提取价值”(Miner Extract Value,MEV)一词。

菲尔曾经给我讲过一种宇宙恐怖,他称之为“广义领跑者”。套利机器人通常会在内存池中寻找特定类型的交易(如DEX交易或Oracle更新),并尝试根据预定的算法抢占先机。通俗的领跑者寻找任何他们可以通过复制并用自己的地址替换地址来获利的交易。他们甚至可以执行交易并复制由其执行跟踪生成的有利可图的内部交易。

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

请注意,这个环境甚至比以太区块链状态本身还要残酷得多。这些免费的钱已经在链条上放了大约八个小时,没有被发现,等待着被任何叫烧掉的人扫荡。但任何试图捡起它的行为都会在飞行中立即遭到狙击。

要试图在不警告机器人的情况下提取资金,我需要混淆事务,以便无法检测到对Uniswap对的调用。这将涉及编写和部署自定义合同。因为我是一名专业的Defi思想领袖,我以前从来没有实际部署过以太合同。

我需要帮助,而且已经过了午夜了。幸运的是,我认识的一些最聪明的合同工程师住在欧洲时区。我的Paradigm同事Georgios Konstantopoulos同意帮助部署合同并提交交易。阿尔贝托·奎斯塔·卡尼亚达(Alberto Cuesta Cañada)是我们另一家投资组合公司Year的首席工程师,他自愿执行合同。

一些优秀的以太安全工程师帮助我们提出了一个混淆方案。除了将呼叫作为内部事务隐藏之外,我们还会将事务一分为二:激活合同的SET事务和激活合同时拯救资金的GET事务。这将按以下方式实施:

部署一个getter协定,当它的所有者调用该协定时,它将仅在激活时进行Burn调用,否则将恢复。

部署Setter协定,当其所有者调用该协定时,它将激活getter协定。

如果攻击者仅尝试执行GET事务,则它将在不调用SET事务的情况下恢复。我们希望在攻击者按顺序执行SET和GET事务以发现对pool.burn的内部调用并抢先运行我们时,我们的事务已经包括在内。

令我们惊讶的是,即使我们手动覆盖气体估计器,Infura也会拒绝GET事务。在几次失败的尝试和重置之后,时间压力压到了我们身上,我们变得马虎了。我们让第二个事务进入后面的块。

我们的GET事务确实包含在内-但出现了UniswapV2:INFUNITED_LINFORITY_BURED错误,这意味着流动性用完了。结果是,在我们的GET事务进入Mempool后的几秒钟内,有人执行了呼叫并清空了资金。

我们在智力上知道这些广义的领跑机器人是存在的。但是,在你真正看到他们的行动之前,你很可能低估了他们。

我们抱有一些希望,希望通过授权的合同作为内部调用进行救援,从存储中传递一个变量作为收件人地址,可能会保护我们。但事实并非如此。

如果您发现自己遇到了这样的情况,我们建议您联系Scott Bigelow,他是一名安全研究员,一直在研究这个主题,并且有一个更好的迷惑器的原型实现。

即使在时间紧迫的情况下,我们也应该坚持执行计划。如果我们在脚本上花费更多时间,调整契约(也许将getter契约更改为不做任何事情,而不是在激活之前调用时恢复),或者甚至同步我们自己的节点以避免使用Infura,我们可能已经能够将事务放到同一个块中。

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

更好的是,如果您碰巧认识一个矿工(我们不认识),您可以让他们直接将事务包含在一个块中,完全跳过内存池和怪物。

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

今天,矿工们没有抓住这些机会,把钱留在了桌面上。未来,他们将重新排序并提交他们记忆池中的交易,以使他们受益。更糟糕的是,他们可能会重组其他矿工开采的区块,试图窃取他们没有声称拥有主权的MEV,导致链条不稳定。

我们认为这种未来是可以避免的。乐观主义(另一家Paradigm投资组合公司)有一个雄心勃勃的愿景,即如何将MEV重新定向,以造福于生态系统,作为其第二层扩展解决方案乐观汇总的一部分。

如果您正在考虑MEV,或者在这个地区建造一些东西,请联系我们!

感谢Alberto Cuesta Cañada、Scott Bigelow、Phil Daian、Charlie Noyes和Sam Sun的讨论,为本文提供了信息。

本帖子仅供一般参考之用。它不构成购买或出售任何投资的投资建议或推荐或招揽,也不应用于评估作出任何投资决定的优点。不应依赖它来提供会计、法律或税务建议或投资建议。本帖子反映了作者当前的观点,并不代表Paradigm或其附属公司,也不一定反映Paradigm、其附属公司或与Paradigm相关的个人的观点。此处反映的意见可能会在不更新的情况下发生更改。