cryptofoundry

cryptofoundry へのお問い合わせ

構築または自動化したい内容をお聞かせください。

記事

Sniper Bot Watcher:フロントランニング攻撃からマーケットメイキング資金を守る

Sniper Bot Watcher:フロントランニング攻撃からマーケットメイキング資金を守る

マーケットメイキングには流動性の提供と資本保護の両立が不可欠です。ADAMANT mmボットは、トークン発行者や取引所が制御された、自動化された方法で動的な流動性と取引高を創出することを可能にします。しかし、市場が進化するにつれて、悪意ある攻撃者も進化しています。

Issue #93 では、重要な防御機能のアップグレードである「Sniper Bot Watcher(スナイパーボットウォッチャー)」が導入されました。これは、ほぼすべての自動マーケットメイキング戦略に影響を与える構造的な脆弱性——超高速の外部ボットによる悪用——に対処するものです。

自動マーケットメイキングの弱点

マーケットメイキングボットは、多くの場合、板の両サイドに注文を出して取引高を生成し、スプレッドを維持します。よく使われる仕組みの一つに、内部マッチングがあります。ボットがスプレッド内にマーケットメイク注文を出し、その後すぐにそれを約定させるテイカー注文を出すことで、在庫バランスを保ちつつ正当な取引活動を生み出します。

問題は、この2つのステップ間に避けられない遅延が存在することです。たとえ極めて短くても、その差は存在します。現代の電子市場では、ミリ秒単位の差が決定的です。外部の高速ボットはリアルタイムで注文板を監視しており、新たな流動性が現れると即座に反応します。マーケットメイキングボットがマーケットメイク注文を出した瞬間、内部のマッチング注文が到達する前に、外部のボットがそれを先取りして約定してしまうのです。

この攻撃には主に2つのパターンがあります。1つ目は、第三者が直ちにBuy注文を約定させ、その後のSell注文が約定されない、または部分的にしか約定されず、ボットがUSDTを損失するケースです。2つ目は、第三者がボットの注文よりわずかに高い価格でBuy注文を出し、ボットのSell注文がその第三者と約定してしまうことで、ボットがTOKENを損失するケースです。結果として、偶発的な損失ではなく、構造的な悪用が生じることになります。

従来の防御策が不十分な理由

遅延を完全に排除したり、実行タイミングを調整したりすれば問題が解決するように思えるかもしれません。しかし実際には不可能です。取引所のAPIにはレイテンシがあり、ネットワーク通信にも時間がかかり、たとえ最も高速なインフラを用いても、外部システム間で注文の発注と約定をアトミックに保証することはできません。遅延を長くすれば攻撃が容易になり、短くすれば多少は改善しても、完全にギャップをなくすことはできません。実行タイミングをランダム化すれば予測不能性は生まれますが、スナイパーボットは適応的であり、時間とともにパターンを分析して対応してきます。

必要なのはより高速な実行ではなく、知的な検出と対応です。

Sniper Bot Watcherの導入

Sniper Bot Watcherは、ADAMANT mmボットに統合された検出・緩和レイヤーです。その目的は取引を阻止するのではなく、行動パターンを監視し、外部のボットがシステムを悪用しているかどうかを特定することにあります。不審な活動が検出された場合、ボットは実行動作の調整、取引戦略の一時停止、注文ロジックの変更、または露出を抑えるために設計された防御モードの起動など、防御的な反応を取ることができます。

以下のコードは、スナイパーボットの活動を検出する例です:

} else if (order1Status === 'filled' && order2Status === 'filled') {
  log.info('Trader: Both maker and taker executeInSpread t-orders are self-filled.');

  order.update({
    coin1AmountFilled: coin1Amount,
    coin2AmountFilled: coin2Amount,
    isExecuted: true,
  });
} else if (order1Status === 'filled' && ['new', 'part_filled'].includes(order2Status)) {
  // Scenario1: After maker order is placed in spread, a third party bot quickly takes it, and the taker order remains unfilled or partially filled
  sniperBotActivity(1, order2Details, coin1Amount);

  await addFillsDbRecord(order2Details, order, false); // Maker order is partially or fully filled by a sniper bot

  order.update({
    coin1AmountFilled: order2Details.amountExecuted, // Self-filled amount, excluding sniper bot fills
    coin2AmountFilled: order2Details.volumeExecuted,
    isExecuted: false, // Not fully executed
  });
}

介入回数がしきい値を超えると、ボットはセーフモードに移行します:

/**
 * Records a sniper-bot intervention for a given scenario.
 * Triggers safe mode when the total interventions reach the threshold.
 * @param {number} scenario Scenario index: 1 or 2
 * @param {OrderInfoResult} orderDetails Exchange order details (e.g., order2Details), for logging only
 * @param {number} coin1Amount Order amount in base coin, for logging only
 * @returns {void}
 */
function sniperBotActivity(scenario, orderDetails, coin1Amount) {
  sbwActivityCounters[scenario]++;

  const fillPercent = (orderDetails.amountExecuted / coin1Amount * 100).toFixed(2);
  log.warn(`Trader: While the maker t-order is filled, the taker is ${orderDetails.status} (${fillPercent}% self-filled). This may be Scenario ${scenario} of third-party bot intervention; incrementing the counters to ${sbwActivityTotalString()} (Safe mode threshold: ${sbwEnabled ? safeModeThreshold : 'Disabled'}).`);

  if (sbwEnabled && sbwActivityTotal() >= safeModeThreshold) {
    sniperBotSafeMode();
    resetSniperBotCounters();
  }
}

トークンプロジェクトにとっての重要性

マーケットメイキングはトークンエコシステムにとって不可欠ですが、資金がスナイパーボットによって体系的に流出する場合、プロジェクトは見えないコストを負うことになります。流動性のコストが上昇し、予算が急速に枯渇し、マーケットメイキングの効果が低下します。Sniper Bot Watcherを導入することで、ADAMANT mmボットは、マーケットメイキングのリソースが本来の目的——市場の構築——に使われることを支援し、悪用者の利益とならないようにします。