メンプール。デジタルな戦場だ。トランザクションが消えゆく場所、あるいはもっと悪いことに、他人のランチ代を稼ぐための餌食になる場所。そして君の仮想通貨ボットは、その純粋で無邪気な心で、しばしばメインディッシュになるのだ。
サンドイッチ攻撃。それは残酷でありながら、巧妙な窃盗の手法だ。最大抽出可能価値(MEV)ボットが、君の保留中の取引を見つける。そして君の取引の直前に購入するトランザクション、君の取引の直後に売却するトランザクションを滑り込ませ、その差額を懐に入れる。君はパンで、彼らは具材だ。
攻撃者のスクリプトはこうだ、と言えよう。
function executeSandwich(
address tokenIn,
address tokenOut,
uint amountIn,
uint minAmountOut,
address victim
) external payable {
// 1. フロントラン:被害者の前に購入
swap(tokenIn, tokenOut, amountIn, minAmountOut);
// 2. 被害者のトランザクション実行を許可
(bool success,) = victim.call{value: 0}("");
require(success, "Victim tx failed");
// 3. バックラン:被害者の後に売却
swap(tokenOut, tokenIn, IERC20(tokenOut).balanceOf(address(this)), 0);
}
これは単なる理論ではない。イーサリアムでは、Flashbotsの研究によると、MEV利益の80%以上がまさにこれらの攻撃から生まれている。Uniswapトレーダーから平均して1日あたり1,200ドルが搾取されているのだ。君のボットも、おそらく貢献している。かなりの額だろう。
なぜ多くのボットが容易に餌食になるのか?主な理由は3つある。第一に、公開メンプールへのブロードキャスト。これは屋根の上から計画を叫ぶようなものだ。第二に、予測可能なガス料金。サンドイッチ攻撃者にとって、歓迎マットを敷いているようなものだ。第三に、プライバシーの欠如。攻撃者は君が何を、いつやっているかを正確に見ることができる。
典型的な、運命づけられたボットはこうなる。
def make_trade(token_in, token_out, amount):
tx = {
'to': UNISWAP_ROUTER,
'data': encode_swap(token_in, token_out, amount),
'gasPrice': w3.eth.gas_price + 10, # 予測可能な値上げ
'nonce': w3.eth.get_transaction_count(wallet.address)
}
signed = wallet.sign_transaction(tx)
tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction) # 公開メンプール
return tx_hash
このコードは、フロントランされることを practically begs している。脆弱性の傑作だ。
哀れで苦境にあるボットに希望はあるか?
ある。しかし、それは公開メンプールの暗黒時代から抜け出すことを要求する。イーサリアムでは、Flashbotsはマイナーにトランザクションをプライベートに送信する方法を提供する。可視性が低く、サンドイッチ攻撃も少ない。しかし、これはイーサリアム限定であり、万能ではない。
from flashbots import flashbot
# Flashbotsを初期化
flashbot(w3, signature_account)
# バンドルを構築
signed_tx = wallet.sign_transaction(tx)
bundle = [
{"signed_transaction": signed_tx.rawTransaction}
]
# プライベートバンドルを送信
block = w3.eth.block_number
flashbots.send_bundle(bundle, target_block_number=block + 1)
それでも、これは始まりだ。より堅牢な解決策、特にSolanaで試しているなら、JitoのMEVインフラストラクチャをチェックするといい。「バンドル」はトランザクションをアトミックな単位にグループ化する。すべてが成功するか、すべてが失敗するかのどちらかだ。これにより、フロントランは practically 不可能になる。はるかに洗練されたアプローチだ。
import { Connection, Keypair } from '@solana/web3.js';
import { JitoBundle } from '@jito-labs/core';
const jitoEndpoint = 'https://jito-mainnet.rpcpool.com';
const connection = new Connection(jitoEndpoint);
async function sendProtectedSwap(swapIx) {
const blockhash = await connection.getLatestBlockhash();
const bundle = new JitoBundle([
{ instruction: swapIx, signers: [keypair] }
], {
blockhash,
lastValidBlockHeight: blockhash.lastValidBlockHeight
});
const bundleId = await connection.sendBundle(bundle);
return bundleId;
}
Jitoバンドルはアトミックな実行を提供し、フロントランを効果的に排除し、さらに優先手数料を可能にしてより迅速な含めることを保証する。テストによると、公開送信と比較してサンドイッチ攻撃を驚異的な97%削減するという。これは改善ではない。革命だ。
オブファスケーション:目立たないための芸術
しかし、プライベートバンドルを使っても、真に疑い深い者——そして率直に言って、真に成功する者——はそこでは止まらない。彼らは予測不可能性のレイヤーを追加する。カモフラージュだと考えてほしい。取引をより小さなチャンクに分割する。それらの間の遅延を変化させる。取引がたどるルートをランダム化する。そして、分散化されたあらゆるもののために、ガス価格設定をランダム化することだ。それは君のボットを幻影にするようなものだ。
def stealth_swap(token_in, token_out, amount):
# 複数の小さなスワップに分割
chunks = split_amount(amount, random_int(3,7))
# スワップ間の遅延を変化
for chunk in chunks:
wait(random.uniform(0.5, 3.5))
# 直接スワップとWETH経由のルートを交互に使用
if random.random() > 0.7:
route = [token_in, WETH, token_out]
else:
route = [token_in, token_out]
# ガス価格設定をランダム化
gas_strategy = random.choice([
fixed_gas_with_tip(15),
eip1559_dynamic_fee(),
gas_auction_strategy()
])
execute_swap(route, chunk, gas_strategy)
これは単一の攻撃ベクトルを回避するだけでなく、MEV抽出者エコシステム全体から君のボットを不可視にするためのものだ。結果は?正しく実装された場合、我々のボットではサンドイッチ攻撃の割合が取引の42%からわずか3%に減少した。スリッページは1.8%から0.4%に縮小した。収益性は?ROI+12%から+37%に急騰した。数字は嘘をつかない。MEV保護を無視することは、テーブルにお金を残していることだ。かなりの額だ。
ボット防御における人間の要素
ここで最も示唆に富むのは、技術的な解決策だけでなく、その根本的な原則だ。元の記事は、コード例に埋もれているが、より深い真実をほのめかしている。最も脆弱なボットは最も単純なものだ。それらは、分散型金融の熾烈な性質を理解せずに構築された、ナイーブなものだ。これは新しい問題ではない、念のため言っておく。初期の株式トレーダーも、初期のインサイダー取引や市場操作の形態と似たような問題に直面していた。ツールは変わるが、価値を抽出しようとする人間(または、この場合はアルゴリズム)のドライブは、しばしば不当に、不変だ。違いは、DeFiでは、メンプールの透明性——あるいはその欠如——が、これらの洗練された攻撃のための遊び場を生み出していることだ。FlashbotsやJitoのような企業は、本質的に、伝統的な金融で数十年にわたって進化してきたプライベート・トレーディング・ルームのデジタル同等物を構築している。それは保護と捕食のレースであり、現時点では、開発者がまだチェッカーをしているようにボットを構築しているため、捕食者がリードしている。チェスではなく。あるいは、より正確には、ハンガーゲームをしているようにだ。
🧬 関連インサイト
- もっと読む: OpenClawのマルチエージェント修正:シングルエージェントのハルシネーショントラップからの脱出
- もっと読む: Tabularis、データベースクライアント内にSQLノートブックを導入—コピー&ペースト地獄に終止符
よくある質問
仮想通貨におけるサンドイッチ攻撃とは? A sandwich attack is when a malicious bot executes two transactions around yours in the mempool – one to buy an asset before your trade and another to sell it after, profiting from the price changes caused by your transaction.
Jitoバンドルはどのようにサンドイッチ攻撃を防ぐのか? Jito bundles group multiple transactions to be executed atomically. This means all transactions in the bundle succeed or fail together, preventing MEV bots from inserting their own transactions in between and thus stopping front-running.
私の取引ボットはMEVのリスクにさらされているか? If your bot broadcasts transactions to public mempools with predictable gas prices and no privacy measures, it is highly susceptible to MEV attacks like sandwiching.