最前線の取引ボット: イーサリアムの暗い森のモンスター
編集者注: この記事は以下から引用しましたバビット情報(ID:bitcoin8btc)編集者注: この記事は以下から引用しました
、Dan Robinson と Georgios Konstantopoulos 著、Free and Easy によって翻訳され、許可を得て出版されています。
チャレンジ
これは恐ろしい実話です。
副題
チャレンジ
一般の人と同じように、私は Uniswap Discord サポート チャネルに潜んで多くの時間を費やしています (開示: Uniswap は Paradigm のポートフォリオ会社です)。水曜日の午後、誰かが、ペアリングコントラクトに誤って送信されたUniswap流動性トークンを回収することが可能かどうか尋ねました。私の当初の考えは、トークンは永久にロックされるだろうと思っていましたが、その夜遅くに、トークンがまだそこにあれば誰でも取りに行けるのではないかと思いつきました。
誰かが Uniswap コア コントラクトの書き込み関数を呼び出すと、コントラクトは独自の流動性トークンの残高を測定して書き込み、呼び出し元が指定したアドレスに引き出したトークンを提供します。これは Uniswap v2 の意図された動作の中核部分です (基本的な仕組みは次のとおりです)。
Uniswap v2 ホワイトペーパー
のセクション 3.2 で説明されています。
契約書を見つけました。流動性トークンはまだ残っており、約 12,000 ドルの価値があります。
時を刻む時計があり、誰でもいつでも自分の流動性を引き出し、たとえ他の人が無料資金に気づかなかったとしても、契約からこれらのトークンを誤って取得することができます。
私は白い帽子をかぶって、所有者がトークンを取り戻すのを手伝うことができます。それは非常に簡単です。プールの書き込み関数を呼び出して、それに自分のアドレスを渡すだけです。
ただ…それが簡単ではないことはわかっています。
副題Dark Forest暗い森
イーサリアム ブロックチェーンが非常に敵対的な環境であることは周知の事実です。スマートコントラクトを利益のために悪用できる場合、最終的には悪用されることになります。ハッキングの頻繁な発生は、一部の非常に賢い人々が契約の抜け穴をチェックするのに多くの時間を費やしていることを示しています。しかし、この容赦のない環境は、保留中の未確認のトランザクションの集合体である Mempool に比べれば見劣りします。ブロックチェーン自体が戦場だとすれば、メンプールはさらにひどい、暗い森です。Flash Boys 2.0私のお気に入りの SF 小説『The Dark Forest』では、特定の高度な捕食者の死を意味する環境、つまり「暗い森」の概念が導入されています。この環境では、誰かの位置を公に特定することは、その人を完全に破壊するのと同じことです。 (この概念はイーサリアムのテストネットにもあります)
ゲームのインスピレーションの源。 )
イーサリアム メンプールでは、これらのトップ捕食者は「アービトラージ ボット」の形をとります。裁定取引ボットは保留中の取引を監視し、それを利用して収益性の高い機会を創出しようとします。同僚と共著した Phil Daian ほど、これらのボットについて詳しいホワイト ハットはいません。」
フィルはかつて私に、彼が「一般化されたスナップランナー」と呼んだ宇宙の恐怖について話してくれました。アービトラージ ボットは通常、Mempool 内の特定の種類の取引 (DEX 取引やオラクル アップデートなど) を探し、所定のアルゴリズムに従ってフロントラン取引を試みます。一般的なフロントランナーは、アドレスをコピーして自分のものに置き換えることで、フロントランナーに利益をもたらすトランザクションを探します。
だからこそ、この救出活動は容易ではない。誰でも Burn 関数を呼び出すことができ、Burn 関数を呼び出すトランザクションを送信すると、この有益な機会を直接示す「無料マネー」サインが点滅するようなものです。これらのモンスターが実際にメモリプール内に存在する場合、彼らは私のトランザクションを見て、コピーしてから変更し、それが受け入れられる前に横取りするでしょう。
この環境はイーサリアム ブロックチェーン自体の状態よりも残酷であることに注意してください。これらの無料資金は、発見されることなく約 8 時間ブロックチェーン上に留まり、書き込み機能を呼び出す誰かによってプールから引き出されるのを待っています。しかし、それを拾おうとする試みは飛行中に即座に阻止されました。
副題
救出作戦
ボットに通知せずに資金を引き出すには、ボットが Uniswap ペアへの呼び出しを検出できないようにトランザクションを難読化する必要がありました。これには、カスタム コントラクトの作成とデプロイが必要になります。私はプロの DeFi 思想的リーダーですが、これまでイーサリアムにコントラクトを展開したことはありません。
助けが必要だったのですが、もう真夜中を過ぎていました。幸いなことに、私が知っている優秀なスマート コントラクト エンジニアの何人かはヨーロッパのタイムゾーンに住んでいます。 Paradigm の私の同僚、Georgios Konstantopoulos は、契約の展開とトランザクションの提出を支援することに同意しました。当社のポートフォリオ企業のもう一つである Yield の主任エンジニアである Alberto Cuesta Cañada が自発的に契約を締結しました。
Getter コントラクトをデプロイします。このコントラクトは、所有者によって呼び出されたときに、アクティブ化された場合にのみ書き込み呼び出しを発行し、それ以外の場合は再開します。
所有者によって呼び出されたときに Getter コントラクトをアクティブ化する Setter コントラクトをデプロイします。
画像の説明
図: カスタム スマート コントラクトのコード
攻撃者が get トランザクションのみを実行しようとした場合、set トランザクションを呼び出すことなく回復されます。攻撃者が 2 つのトランザクションを順番に実行する前に、トランザクションをブロックに含めたいと考えています。
画像の説明
図: レスキュー スクリプト
そしてこれが致命的なミスとなったのです!
get トランザクションは確かに含まれていますが、UniswapV2: INSUFFICIENT_LIQUIDITY_BURNED エラーが発生します。これは、流動性トークンがなくなったことを意味します。その結果、get トランザクションがメモリプールに入ってから数秒以内に、誰かが呼び出しを実行して資金を一掃します。
怪物が私たちを食い荒らします。
副題
レッスン
レッスン 1: モンスターは実在する!これらの最先端のボットが蔓延していることは頭ではわかっていますが、実際に動作しているのを見るまでは過小評価している可能性が高くなります。
私たちはチャンスを掴んで、認可契約を通じて社内に救援電話をかけました。これで私たちは守られると思いましたが、そうではありませんでした。
このような状況に陥った場合は、このテーマに取り組んでいるセキュリティ研究者である Scott Bigelow に連絡することをお勧めします。彼は難読化のより優れたプロトタイプ実装を持っています。
教訓 2: 急いではいけない 時間が限られている場合でも、当初の計画を堅持する必要があります。スクリプトにより多くの時間を費やし、コントラクトを調整したり (アクティベーション前に呼び出しを再開する代わりに、何もしないように Getter コントラクトを変更したり)、あるいは Infura の使用を避けるために独自のノードを同期したりすれば、2 つのトランザクションを変換できる可能性があります。同じブロックに入れます。教訓 3: 汎用インフラストラクチャに依存しない 奇妙なものを作れば作るほど、Infura のような既存のインフラストラクチャを乗り越えるのが難しくなります。私たちのケースでは、ブロックチェーンの現在の状態に基づいて失敗するように見えるトランザクションを送信しようとしていましたが、Infura にはこれに対して適切な保護手段が用意されていました。独自のノードを使用すると、この問題を回避できます。
または、大手マイナーをたまたま知っている場合 (私たちは知りません)、メモリプールとモンスターを完全にスキップして、コミットしたいトランザクションをブロックに直接含めてもらうことができます。
教訓 4: 未来はますます怖くなる
これは私たちの身に起こった最前線の出来事の一例にすぎず、同様のことが一日に何度も起こります。現在、第一線で活躍するトレーダーは単なるボットですが、明日にはマイナーになるかもしれません。
現在、マイナーはこうした機会を利用せず、お金をそのまま放置していますが、将来的に自分の利益のために自分のトランザクションを再注文して送信するという保証はありません。さらに悪いことに、彼らは、自分たちが主張していない MEV を盗もうとするために、他のマイナーがマイニングしたブロックを再構築し、ブロックチェーンの不安定性を引き起こす可能性があります。


