科学者の行動:イーサリアムのダークフォレストでの先行者ロボットの捕獲
この記事は2020年12月29日に暗号通貨ウォレットZengoのブログに掲載され、著者はAlex Manuskinであり、 ChainNewsによって翻訳されました。
ダークフォレストの中のモンスターは、茶飲み話のジョークではありません。これらのフロントランニングボットは、スマートコントラクトの指示と、それ以前にスマートコントラクトで使用されたことのない関数を分析し、潜在的な利益を引き出すことができます。
これらのボットをよりよく理解するために、この記事ではイーサリアムのダークフォレストを探求する旅を提供します。ダークフォレストの奥深くに進み、それらがどれほど横行しているかを見てみましょう。
私たちは「罠を利用して」、一般的なフロントランニングボットのいくつかを捕まえ、その行動を分析しました。
この旅では、これらのフロントランニングボットの効率を研究し、さまざまな取引がそれらに狙われる可能性を探ります。もちろん、私たちは彼らを回避するためのさまざまな方法もテストしました。
以下、楽しんでください。
フロントランニングとは?
一般的に、フロントランニングとは、既知の未来の取引が行われる前に、実行キュー内で割り込んで取引を実行する行為を指します。
フロントランニングの簡単な例は、取引所の入札です。誰かがUniswapで大量のETHを購入しようとしていると仮定します。これによりETHの価格が上昇します。この状況から利益を得る方法の一つは、その大量のETHを購入する直前にETHを先に購入することです。この時、価格はまだ低いです。そして、ETHの価格が急騰した後、すぐに売却して利益を確保します。
このようなアービトラージ取引の例に加えて、フロントランニングを利用して価値を獲得する方法は多く存在します。これには、清算、希少なNFTの購入、または単にユーザーエラーを引き起こすことが含まれます。(取引や成立順序から抽出可能な価値は「マイナー抽出可能価値(MEV)」と呼ばれます)
イーサリアムでのフロントランニングは、通常の水準よりも高いガス価格を支払うことで実現できます。この方法により、マイナーはブロックを構築する際にその取引を優先的に配置するよう促されます。取引に支払われる手数料が高いほど、実行順序が前に来ます。したがって、同じブロック内の同じ呼び出しスマートコントラクトの指示から利益を得る2つの取引がある場合、最初に成立した取引だけが最終的に利益を得ることになります。
動物行動学
Dan RobinsonとGeorgios Konstantopoulosが共同執筆した「イーサリアムはダークフォレストである」というブログ記事では、イーサリアムのあるスマートコントラクトから12,000ドルのトークンを救おうとした際に、アービトラージボットに横取りされた経験が描かれています。これらのスーパー捕食者ボットは非常に高度で、イーサリアムの取引プール内の価値のある取引を追跡し、フロントランニングの手段で横取りします。
ダークフォレストの物語は「ぞっとする」ものであり、記事を読んだときには信じられないほどでした。実際、こうしたスーパー捕食者ボットの存在を疑う理由は確かにあります。なぜ誰かがUniswapプロトコルから資金を持ち去ることができるのでしょうか?このプラットフォームは無数のボットに監視されているのに?これらのボットはただの「アービトラージャー」なのでしょうか?
今年の初め、私たちはそれらが普通の「アービトラージボット」ではないことを確認する分析記事を発表しました。私たちの知る限り、彼らは以前に呼び出されたことのないスマートコントラクト関数を呼び出すことができるのです。たとえ代理スマートコントラクトを通じて取引が曖昧に処理されても、これらのボットはそのような操作を通じて資金を持ち去ることができます。
少なくとも、これは衝撃的です。取引プール内の任意の取引を監視する能力は、非常に強力な武器です。不安なのは、一部のサービスプロバイダーが「ダークプール」取引レイヤーを公然と提供し始めていることです。
「ダークプール」取引レイヤーは、Infuraのようなサービスを使用せず、プライベートノードを使用せずに、直接取引をマイナーに送信します。マイナーはその取引をネットワーク内の他のノードにブロードキャストしないことを約束し、取引が捕食者のレーダーを逃れることを保証します。
著名なホワイトハットsamczunは、複数のパートナーと共に、脆弱性のあるスマートコントラクトから960万ドルを救うために同様の方法を採用しました。マイナーがフロントランニングボットを操作し、追加料金を支払う取引者に安全な通路を提供し始めることは容易に想像できます。
これらのボットは、イーサリアムの他の要素とは異なり、イーサリアムメインネットでのみ活発です。スマートコントラクトは開発環境やテストネットでテストできます。初期の実験を行う以外に、これらのボットがテストネットの取引でフロントランニングを試みることは財務的に意味がありません。さらに、ロジックが隠されているため、これらのボットの動作ルールは異なる場合があります。
これらのフロントランニング捕食者が攻撃を開始する条件は不明です。したがって、ある意味で、これらの捕食者を追跡することは、希少な動物を追いかけることに似ています。
私たちはすべてのフロントランニングボットを対象にしているわけではなく、特定の、すなわち広義のタイプのボットに焦点を当てています。
私たちは捕まえたフロントランニングボットが「本物の」広義のフロントランナーであることを確認するために、独自の「罠」が必要です。罠は新しく作成されたスマートコントラクトで、SHA256ハッシュ値の秘密の文字列で開始され、いくつかの資金が付随します。誰でも秘密のコントラクトを提供することでロックされた資金を引き出すことができます。資金は引き出し取引の送信者に直接送信されます。
この罠の構想は、正しい秘密のコントラクトを提供する方法で「餌」取引を送信し、誰かがそれをコピーして自分で秘密のコントラクトを提供し、資金を横取りしようとするかどうかを確認することです。誰かが餌取引の前に資金を横取りした場合、それは誰かが取引プール内で取引を分析し、その関連内容をコピーして自分で秘密のコントラクトを提供できることを意味します。
興味深いことに、ボットは以前に知らなかった秘密のコントラクトを新しいスマートコントラクト内で提供して資金を横取りすることができるのです------彼らは確かに本物の広義のフロントランニングボットです。
広義フロントランニングボットの動作メカニズム
この実験の不可欠な部分は、広義フロントランニングボットの動作メカニズムを理解することです。しかし、誰かが利益を上げるマシンを作った場合、彼らはそれをGithubで共有することはありません。したがって、私たちは捕食ボットの行動を観察し、逆工学を行うことしかできません。
広義フロントランニングボットを構築するには、通常2つのコンポーネントが必要です:
- 最初のコンポーネントはイーサリアムアカウントで、スマートウォレット代理があるかどうかにかかわらず、彼らが改ざんした取引はこのウォレットに送信されます。
- 2つ目は「バックエンド」、すなわち操作の脳で、通常はオフチェーンで発生します。
これらのボットの操作者は、何らかの技術を使用して取引プール内の各取引をスキャンし、それを解析し、パラメータ(たとえば、取引呼び出し元)を置き換え、横取りすることで利益が得られるかどうかを判断します。
フロントランニングボットのワークフロー
合理的なボットは、取引手数料が可能な利益を上回る取引に対しては横取り攻撃を行いません。取引手数料は高くなる可能性があり、特にガス価格が高騰している場合には、フロントランニングボットが私たちの餌取引を攻撃するには一定の最低利益が必要です。
さらに、ボットは取引プール内の各取引(多くの取引が存在します)を分析する必要があるため、時間も重要です。イーサリアムは平均して12秒で1つのブロックを生成します。取引のガス価格が十分に高い場合、次のブロックが生成される前にそれを分析し、元の取引を十分に早く置き換える必要があります。
これは一定の確率を伴うプロセスであり、取引がブロードキャストされた後にすぐにブロックが掘られる可能性があり、ボットがその取引を成功裏に分析し、フロントランニング取引をブロードキャストする時間がないことがあります。
これらの要因といくつかの考えを考慮し、私たちはフロントランニングボットが餌を横取りする条件をテストしました。
罠を仕掛ける
私たちのスマートコントラクト(支払い側Giver)の初期残高は0.035 ETHで、その時の価値は約20ドルでした。誰でも契約に保存されたハッシュに正しい秘密のコントラクトを提供すれば、これらの資金を持ち去ることができます。資金を持ち去る取引は捕食者のフロントランニングアクションを引き起こし、別のアカウント(受取人taker)が資金を引き出すために適切な秘密のコントラクトを提供しようとします。
第一ラウンド:直接コントラクトを呼び出す
基準となる罠が正常に機能することを確認するために、まず受取人アカウントを使用してコントラクトを呼び出しました。最初の試みでは、ガス価格が比較的高く(イーサフレームワークによって決定され)、私たちは資金を無事に回収することができました。
成功した理由は、横取りされた取引の利益が非常に低く、捕食者を引き付けるには不十分だったか、取引がすぐにブロックに書き込まれ、ボットが行動を起こす時間がなかったからです。明らかに、これは私たちが期待していた結果ではなく、私たちの目標は捕食者を罠に引き込むことです。
第二ラウンド:捕食者に考える時間を与える
このラウンドでは、以前の問題を解決しました。私たちは潜在的な利益を増やし、ガス価格を下げたため、取引がすぐにブロックに書き込まれず、ボットがそれを見つける時間ができました。このコントラクトの残高は0.04 ETHに増加しました(残高は以前より0.005 ETH増加しました)。
今回は攻撃を受けました。この取引はブロックに書き込まれる前に約3分間滞留し、最終的に罠スマートコントラクトから価値を引き出すことができませんでした。私たちはコントラクトの内部取引を調査し、資金が他の誰かに横取りされたことを発見しました。
このフロントランニング取引は25.000001111 Gwei(私たちが使用したGweiよりも0.000001111 Gwei高い)を費やし、私たちの取引が同じブロックに書き込まれたことが明らかに横取り行為です。
トラッカーを埋め込む
私たちの罠が成功裏にボットを捕獲したので(私たちも一定の代償を払いました)、いくつかの興味深い洞察を引き出すことができます。
まず、取引はスマートコントラクトへの直接呼び出しを実行していないことが示されています。このボットは取引をコピーして自分のアカウントから盲目的に送信したのではなく、代理スマートコントラクトを通じてその取引を伝達し、その代理スマートコントラクトがこれらの取引を実行するスマートウォレットとして機能しました。
私たちは今、以前と今後の取引を追跡し、このボットがどれほどの能力を持っているか、そしてどのように機能しているかを詳しく見ていきます。
このボットは自分の代理コントラクトを使用しています
このコントラクトを逆コンパイルすると、2つの主要な関数が表示されます:
「Withdraw」は、コントラクト内のすべての資金をボットのオペレーターに送信することを主な目的としています。もう一つの関数は、呼び出すコントラクト、パラメータリスト、および価値パラメータを受け取ります。
この関数を使用することで、この代理コントラクトはボットオペレーターのスマートウォレットとして機能します。外部関数を呼び出す機能を実行できるだけでなく、取引開始時の残高が終了時の残高以上であることを保証し、そうでない場合は取引を元に戻すことができ、未知のコントラクトを呼び出す際に発生する可能性のある資金損失を回避します(もちろんガスは除外されます)。
Dune Analyticsツールを利用して、このボットが2018年5月から運用を開始して以来、かなりの利益を上げていることがわかります。
このボットがフロントランニング取引を開始するために同じスマート代理と受取アドレスを使用していると仮定すると、彼らは合計で約17 ETHを稼いでいると推定できます。
このボットが異なる期間に稼いだ資金(ETH単位)
第三ラウンド:これらのボットはどれほど賢いのか?
私たちがこのボットプログラムが私たちに対して攻撃を仕掛けていることを確信したので、私たちは第二のコントラクト(代理コントラクト)を使用して、コントラクトの呼び出しを混乱させ、コントラクトから餌資金を成功裏に引き出すことができるかどうかをテストしたいと思いました。この代理は、餌コントラクト(giver)から餌資金を引き出すために関数を呼び出します。(このコントラクトには、資金を私たちに返す「受取」関数もあります)。
私たちはProxyTakerコントラクトをデプロイし、適切な関数を呼び出して資金を引き出そうとしました。代理を通じたアクションのコストが以前よりわずかに高くなったため、giverコントラクトの残高は0.055 ETHに引き上げられました。結果として、私たちの取引はすぐに別のボットにフロントランニングされました。
今回はボットの手法がさらに驚くべきものでした。このボットは私たちの引き出し取引を検出するだけでなく、全く異なるスマートコントラクトの内部呼び出しからその取引を識別することができました!しかも、すべてが記録的な短時間で完了し、私たちの引き出し取引は数秒後に新しいブロックに書き込まれ、捕食者のフロントランニングも同様でした。
このボットの正体も興味深いです。このボットのスマートコントラクトは、主にこのアカウントによって運営されています。このアカウントは、Etherescanでコメントを投稿しており、その時の主なスレッドは、脆弱性のあるBancorスマートコントラクトから資金を救うことに関するホワイトハットの議論でした。
オペレーターアカウントの情報(出典:etherscan)
このボットの同様の行動特性(アカウントAを使用して代理を呼び出し、資金をアカウントBに移動する)と、上記の取引の近接特性を考慮すると、このボットが上記のイベントでもホワイトハットの資金救出アクションに広義フロントランニングを行った可能性があると疑う理由があります。
このボットは、私たちが以前に遭遇したものよりもはるかに賢いです。彼らはETH取引を狙うだけでなく、さまざまなアービトラージ取引も行っています。
そのアカウント残高から判断すると、彼らの収益もはるかに高いです。現在、このアカウントの残高は約300 ETH(時価18万ドル)です。私たちはまた、コントラクトアドレスからすべての流入および流出資金を計算し、彼らの収益を推定することができます。その総額は約900 ETHです。
これは粗い推定に過ぎません。なぜなら、このアカウントはフロントランニング活動とは無関係な取引を行っている可能性があるからです。こちらは、このボットのすべての利益を上げた取引のリストです。
挑戦をさらに刺激的にするために、私たちはより曖昧な試みを行いました。今回は、私たちだけが使用できる代理コントラクトOwnedTakerを使用しました。
この罠は第三ラウンドと非常に似ています。Giverコントラクトの残高は0.05 ETHです。同じ取引には、資金を私たちに返す取引も含まれており、コントラクトに留まるのではありません。
最初の試みでは、OwnedTakerコントラクトに資金が支払われるこの取引は、約1分でブロックに書き込まれ、私たちは最終的に資金を回収しました。
その後、この実験を繰り返しました。今回はgiverコントラクトの残高が0.06 ETHに引き上げられ、これまで使用した中で最高の残高で、フロントランニングボットが出手するには価値が低すぎないことを確認しました。
ガスの価値も意図的に低い値に設定されました。この取引は約7分間滞留しましたが、私たちは依然として資金を成功裏に引き出しました。
契約の所有者のみが取引を転送できるOwned代理コントラクトを追加することで、上記の2つの既知のフロントランニングボットがデータを成功裏に解析し、横取りすることを防ぎました。
成功した引き出し
契約の所有者のみが呼び出しを実行できるという要件、または資金が呼び出しコントラクトとは異なるターゲットアドレスに送信されるという事実が、ボットのフロントランニング試行を回避するのに役立った可能性があります。
ボットはおそらく自己保護を最優先に考えるように調教されている可能性があります。結局のところ、彼らは未知のコントラクトを呼び出しており、そのコントラクトは任意のコードを実行する可能性があります。利益が保証されない場合、彼らは不必要なリスクや取引手数料の損失を避けるでしょう。
あなたがそれをどのように見るかによります。私たちは新しいコントラクトを使用しましたが、この秘密のコントラクトを知っているのは私たちだけです。明らかに、私たちが発見した2つのフロントランニングボットは、取引プール内で行われるすべての取引を行っており、彼らの利益を見る限り、彼らは非常にうまくやっています。
私たちはなぜ最後の試みでフロントランニングの厄災を避けることができたのでしょうか?
具体的な理由を判断するのは難しいです。おそらく、ボットは認証されたコントラクトとの通信のリスクを冒すことを望まず、資金が別のアドレスに移動するという事実が予想外だったのかもしれません。
これは、フロントランニングを回避するための完全に実行可能な方法であることを意味するものではありません。最も可能性が高いのは、イーサリアムの取引プールに潜むより複雑なボットが存在し、彼らは単にこれほど小さな利益を得るためにリスクを冒すことを望まないということです。
この短い実験を通じて、私たちは広義フロントランニングボットの存在とその知能の高さを示すことができました。
もちろん、私たちはこの実験が完全でも確実でもないことを理解しています。他にも多くのボットが存在し、それらのトリガーメカニズムや運用方法はまったく異なります。潜在的な利益、通信特性、最低限の複雑さ(たとえば、gasLimitを通じて)などの要因が、彼らの運用方法に影響を与える可能性があります。
しかし、私たちは自分たちの作業が、広義フロントランニングボットの手法をさらに明らかにするための概念実証を提供することを確信しています。
現在の衝撃的な現実は、誰でもスマートコントラクトを呼び出して利益を得る取引が存在する場合、たとえそれが非常に難解であっても、実際にはどこかのフロントランニングボットによって資金が横取りされる可能性が非常に高いということです。
したがって、これらのボットとその動作方法を理解することは非常に重要です。そうすることで、現在と将来にわたってより安全なシステムを構築できるようになります。Flashbotsのようなプロジェクトは、MEVの抽出を民主化し、それを公共の資源にすることでこれを実現しようとしています。私たちは、この研究がその目標の達成に役立つことを願っています。