こんにちは。暗号通貨バブルで消耗してますか?紫藤かもめ @shidokamo です。 MEV関連で逮捕者が出たというニュースで界隈が動揺しています。
Brothers arrested after DOJ says they stole $25 million in crypto in 12 seconds in Ethereum blockchain attack https://t.co/4OhK2TZpEm
— The Block (@TheBlock__) May 15, 2024
このニュースかなり誤解されてて、アビトラが犯罪になるの?!みたいなことを言ってる人がいるので解説します。
みかんニキのようなガチ勢は流石にわかってらっしゃいますね。フォローしましょう。
これ話題になってるけど、FlastBotsの悪用でMEVリサーチャーからお金を奪ったやつだと思う
— ねこ🍊🍳 (@0xwagmican) May 15, 2024
サンドイッチ攻撃のバンドルをアンバンドルして、片側だけ成立させてお金を吸い取る手法
なのでアビトラは犯罪にならないという認識 https://t.co/Axh9x63OWx
発生した攻撃の概要
まずは論より証拠、問題の攻撃について詳しくみてみましょう。
イーサリアムの ブロック16964664番 を見れば何が起こったのかの手がかりを掴むことが出来ます。 このブロックは、「紫藤かもめが選ぶこのブロックがすごい第一位」に輝く伝説のブロックです。
https://etherscan.io/block/16964664
まず一見しておかしいのは、ブロック内のトランザクションの数が少なすぎることです。 普通100以上のトランザクションが含まれているはずなのに、なぜか24個のトランザクションしかありません。 後述しますが、24が3の倍数だという点には意味があります。
さて、実際にトランザクション (tx) を見てみます。
これを見ると、以下のようになぜか規則正しく、3つづつtxが並んでいることがわかります。 3つ目にくるtxは全て失敗しています。
このピンクで囲った一番下の3つまとまりをさらに詳しくみてます。
TX: 0xd2ed…
ブロックの中で一番最初に実行された tx です。
https://etherscan.io/tx/0xd2edf726fd3a7f179c1a93343e5c0c6ed13417837deb6fc61601d1ce9380e8dc
2454ETH を 4.5STG というトークンにUniswap V2で交換しているだけですね!
2454ETHというと、当時の時価では400万ドル以上です。 何かおかしいですね…?一枚100万ドルもするトークンがあったでしょうか? 結論からいうとこれが被害者のtxとなります。
TX: 0x4b2a… トランザクション
次に実行されたtxです。
https://etherscan.io/tx/0x4b2a2d03b3dc136ef94ebe2f3bc36231b104172bcb598104730898f7d81a55db
誰かが先ほどの交換に使われたプールで、 158 STG を 2454 ETHに交換しました。これが攻撃者の tx です。
TX: 0xa8ed…
ブロックの中の3番目のtxです。被害者のtxです。
https://etherscan.io/tx/0xa8edb2e2c7e89f15e8e78881cc55e03a6fa57c3783288d3a4c334c37e5f3b573
コントラクトの呼び出しが失敗しただけですね。これも被害者のtxです。 (おそらくこのtxは攻撃に不要なのでなぜ使われたのかは個人的には不明)
ここまでのまとめ
以上を見るとわかるように、 最初のtxで被害者が巨額の金を、微量のトークン(価値がほぼゼロ)を買い、 二番目のtxで、攻撃者がレートがおかしくなったプールから金を取り上げ、三番目のtxは失敗する。 これが8回繰り返されています。
本来のtxの姿(攻撃がなかった場合)
最初に被害者が巨額の金で価値がほぼゼロの微量のトークンを買っていますが、これはもちろん乗っ取りではありません。 被害者自身が自分の秘密鍵でそういう命令にサインしているわけです。 秘密鍵で署名されたものなので、この内容を改竄するのは不可能です。 フィッシングなどで無理やり署名された訳ではありません。
ではどういうことになるでしょうか?
この被害者はいわゆるサンドイッチと呼ばれる手法で鞘を取っているMEVリサーチャー(MEV bot)でした。 本来やりたかったことを紹介しましょう。探したところ、被害の300ブロックほど前にちょうど良い例がありました。
https://etherscan.io/txs?block=16964385&p=3
さてこのtxも詳しく中身をみていきます。
TX: 0xfb6a…
一番最初に実行されたtxです。
https://etherscan.io/tx/0xfb6a8000684ba1066bfac9d37bcd0dec3710b8899a246c94fbbbf7129e98148f
MEVサーチャーが、53.282 ETH を約 47 PAXG に交換しました。 これは実際は、次に来るtxの先回り、つまりフロントランニングです。
TX: 0x8a38…
2番目のtxです。
https://etherscan.io/tx/0x8a3806f837ef12455bd450bfed7f78ddb06f6aa54dad15fd43c8f1fecc3137ed
誰かが、9 ETH を 7.688 PAXG に交換しました。 先ほど1番目に発行された tx は、MEV リサーチャーがこのトランザクションを事前にmempoolから検知して出したものでした。 この二番目のtxを発行した人は、フロントランニングされたことにより割高な値段でトークンを買うことになりました。 ただし、皆さんもご存知の通り、slippageの許容量が設定されているのでそれを上回ることはありません。 この二番目のtxを発行した人は、slippage限界の量で買うことになるように、1番目のtxは調整されています。
TX: 0x31ac…
3番目のtxです。
https://etherscan.io/tx/0x31aceccde0d8c14540d6f09348943e07d9789f945031b22867d9595583d10a20
MEVサーチャーが、1番目のtxで買った 47 PAXG を 53.375 ETH に交換しました。 MEVサーチャーは、「53.375 ETH - 53.282 ETH - gas fee - gas fee」の儲けとなりました。
ガス代を引けば微々たる利益ですが、MEVサーチャーはこのようなtxを大量に発行することにより大きな利益を上げています。 みんなに恨まれる所以ですね。 トランザクション2つを挟むように実行しているために、サンドイッチと呼ばれます。
Atomic arb との違い
サンドイッチはAtomicではありません。Atomic Arbは、1つのtxの中で全てが完結します。なので、攻撃に対して極めて安全です。 トランザクションが通ればそれはすでに確定した利益になっています。
しかし、いわゆるサンドイッチは、ここで見たように、フロントランニングをする必要上、どうしても複数のtxを発行する必要があります。 ではなぜこのように都合よくtxを並べることができるのでしょうか? どちらかが実行されて、どちらかが失敗することはないのでしょうか?
Flashbots bundle
詳しくは省きますが、Flashbotsが提供するAPIを利用すると、複数のtxをセットで実行してくれるように マイナーもしくはValidatorに頼むことが出来ます。これを bundle と言います。
Flashbotsは、テストネットにもエンドポイントがあるので、是非やってみてください。
大昔に自分が試したコードだと例えばこんな感じです。(3年くらい前なので、仕様が少し変わっているかもしれません) この場合、二つのtxをセットで実行してもらうために、それぞれのtxに署名して、 それをbundleとしてAPIに渡しているようん感じです。
この時ミソになるのは、Bundleのセットの中で失敗しても良いtxを指定することができることです。 通常は、すべてのtxが失敗してはいけないと指定します。当然ですね。 これにより、もし思い通りのtxが発行できて利益が出るなら、ブロックにバンドルのtxが全て含まれる、思い通りのtxが実行できないなら何も含まれない という非常に有利な状況をMEVサーチャーは作っています。 ぶっちゃけ、Bundleを送るだけならお金も何もかからず、txが失敗することもないのでガス代がかかることもないということになります。 (実際はサーチャーは収益機会を見つけるために、インフラに多額の金を注ぎ込んでいるのでランニングコストがかかっています。)
まあそういう状況に あぐらをかいていて 安心してサーチャー活動に打ち込んでいたMEV botたちが
この攻撃で狙われることになりました。
攻撃者の考え方
MEV bot は盲目的に鞘を取りにきます。ごく小さい鞘でもです。
そこで、たとえば餌となるサンドイッチされる tx の Slippage を外して、 どんなレートでもトークンを買うよという tx を mempool に流せば、 そこを狙って、例えば 4億 でトークンを買って、4億1万円で売るみたいなサンドイッチも MEV bot はしてくるだろうと攻撃者は考えました。 (まあ実際そういうことをちょくちょくやっていたのかもしれません)
このサンドイッチは買いと売りのtxがセットでバンドルとして発行され、どちらかが失敗したらダメと MEV bot は flashbots に伝えているわけですが、 買いの tx 、売りの tx どちらも事前に署名はされている わけです。 では、一番最初の買いのトランザクションだけをなんとかして盗むことができれば、、、?と今回逮捕された攻撃者は考えました。 そんなことが本当に出来るのでしょうか?もしそれが出来るとすれば、Bundleという仕組みはそもそも崩壊してしまいますが、、、
ってことで次回に続きます。