見出し画像

Solana Botter 昔話 〜Atomic症候群〜

本稿は「仮想通貨botter Advent Calendar 2023」22日目の記事です。

こんにちは、magito(@regolith1223)と申します。

とうとう長い冬が明けたようで、クリプト界隈に再び活気が戻ってきていますね。

最近では特にSolanaの復活劇が印象的で、SOL上げ、犬、エアドロなどなど連日なにかしらの話題で盛り上がっているのを目にします。

ちょうど良い機会なので、前回の2021年クリプトバブルを振り返り、筆者がSolanaでDeFi/DEX botterとして奔走した日々の思い出を書き綴ってみたいと思います。

老害botterが繰り出す「昔はよかったシリーズ」の一編だと思って話半分で聞いてもらえれば良きかなと思います。



DeFiとの出会い


DeFiに初めて触れたのは、クリプトバブル真っ只中の2021年4月、Solana Raydium(AcceleRaytor)にて行われたMEDIAトークンのIDOでした。

当時の筆者はそれまでアルトコイントレードやbotによる裁定取引でそれなりに利益を上げることはできていたのですが、せっかくのバブルなので知らない分野にも手を出して稼ぎ口を増やそうと思い立ち、タイムラインで目についたお祭りイベントに参加してみることにしました。

トークンセール参加条件の下限である20RAYをステークして割り当てられたトークンを上場時に即売り!という素人丸出しムーブをかましました。利益は数百ドル程度と(当時のバブルの感覚で言うと)微々たるものではありましたが、DeFiという新しい仕組みの上で利益を上げることができたことにえも言われぬ感動を覚えました。

そして、興奮冷めやらぬうちに紫藤かもめさん(@shidokamo)が興味深い記事を公開されます。

どうやらDeFi/DEXにもシステムトレード(botトレード)という概念が存在し、そのリージョンフォームは、より難易度が高く、より技術力がものを言うらしい。

まだ自分の知らない、深淵で広大な世界の存在に気付かされた瞬間です。

自分の中で何かのスイッチが入る音がしました。

DeFiについて学ぶ


筆者は性格柄、何か新しいことに取り掛かるときには、その対象を入念に調べたり、観察したりすることから始めます。

対象を深く学んで理解しなければ、それにまつわる良いアイデアは生まれないという考えが根底にあるからだと思います。

今回もこのアプローチを採りました。

「まずはDeFiの老舗であるEthereum上で動くプログラムを書けるようになろう」を短期目標として、大まかには以下のようなロードマップで着手しました。

  • プログラミング言語の習得(JavaScript/Solidity)

    • プログラミング学習サイトでの演習(JavaScript)

    • CryptoZombies(Solidity)

  • ブロックチェーンやスマートコントラクトに関する基礎知識

    • Mastering Ethereumを通読する

    • Ethereumフルノードを立ててみる

    • UniswapV2/V3のドキュメントを読む

  • DeFi/DEX上でのbot開発に関する実践

    • Web3.js等の基本ライブラリのドキュメントを読んで使ってみる

    • 簡単なスワップトランザクションをbotを使って発行してみる

    • Uniswap/SushiSwapでの裁定機会を検知するbotを書いてみる

詳しくは本稿では割愛しますが、先述した記事の紫藤かもめさんが私の学習プロセスの一部を紹介して下さっているので、興味のある方はそちらもぜひ読んでみてください。


執行戦略のコア: Atomicity


ブロックチェーンやスマートコントラクトの仕組みについて詳しく学んでいく中で、とある概念がDeFi上のbot取引において非常に有用であることに気づきました。

それが、データベーストランザクションの「Atomicity(原子性)」と呼ばれる性質です。

“Atomicity”(原子性/不可分性)とは、トランザクションに含まれる個々の手順が「すべて実行される」か「一つも実行されない」のどちらかの状態になるという性質である。送金処理における出金と入金を一体的に扱うことなどが該当する。

https://e-words.jp/w/ACID%E7%89%B9%E6%80%A7.html

ブロックチェーンは(分散)データベースの一種であり、スマートコントラクトを介して行われる取引は、トランザクションを実行の最小単位としています。

そして、ブロックチェーンにおいては、ユーザがスマートコントラクトやトランザクションを適切にデザインすることにより、Atomicityにおける「すべて実行される or 一つも実行されない」の条件分岐をある程度コントロールすることができます。

これをトレードの文脈で応用すると、例えば、オーダー内容を記述したトランザクションを送信し、「そのオーダーによるトレードで望ましい結果が得られる(利益が出る)場合にはオーダーを実現させ、そうでない場合は、オーダーを取り消す」という制御をオンチェーンで行う、のような使い方ができます。(ご存知の通り、通常の中央集権取引所(CEX)では、自分が一度実行したオーダーは基本的に取り消すことができません。)

このような技法は特に目新しいものでも珍しいものでもなく、実際のDeFiプロダクトにおいても「フラッシュローン」や「スワップ結果が設定されたminAmountOutを下回る場合にスワップを中止する処理」等に利用されています(筆者はこれらの実装を読んだのがきっかけでこの技法を知りました)。

上記はDeFiプロダクト側での利用例ですが、DeFiユーザ(botter)側でも積極的に利用することにより、他のユーザに対して何らかの大きなアドバンテージが得られるのではないかと考えました。

まだこの時点では具体的なアイデアはありませんでしたが、この技法をbotの執行戦略のコアに据えることを前提として、(その前提から逆算的に)相応しい全体戦略を構成していくというアプローチへと舵を切りました。

そして、この当初の目論見通り、筆者のbot戦略において後に重要な役割を果たすことになります。

舞台はSolanaへ


イーサリアム高校で一通りの基礎を学び終えた後、筆者の関心は再びSolanaに向かいます。

主戦場としてSolanaを選んだ理由は大きく以下の2つです。

1. ガスコストの低さ

bot運用そのものやAtomic執行戦略と相性が良いので、これが決め手の一つとなりました。

2. プラットフォームとしての人気の高さと参入障壁

一般的に、金融ドメインにおいては、(1)入っているお金が多いほど、(2)ライバルが少ないほど、勝者一人あたりの利益の取り分が大きくなるという構造があると思います。

当時のSolanaは、(1)人気やTVLの伸びに対して、(2)競合となるbotterが増えづらい(技術的難易度や学習リソースの少なさから参入障壁が高い)ような状況だったので、(少なくとも短中期的に攻略するチェーンとしては)最も費用対効果が高いと考えました。

当然、(2)は自分自身にも作用するのですが、自分の強み(技術大好き+新しいことの学習を楽しめる)を活かせば十分に対処できると考え、参入を決めます。


Bot#1 Mango Liquidator


清算?

DeFiに入門して3ヶ月ほど経過したある日、SolanaのMango Markets(以下Mango)というDEXのドキュメントの中に興味深い記述を見つけました。

その記述は、Mango DEX上での「清算」の仕組みに関するものでした。

大雑把にいうと、Mango DEXでは、清算人アカウントは負債を抱えた被清算アカウントのポジション解消処理を引き受けることで、その報酬として、被清算アカウントからポジション価値の5%を上乗せで受け取ることができる、というものです。

重要なのは、これを取引所側(いわゆる胴元のような存在)ではなく、一般のユーザが清算人となって自由に行うことができるという点でした。

そこはかとなくOKANE NO NIWOIがします。

さらに詳しく調べたところ、清算人側の主なリスクは、「引き受けたポジション解消という責務を損失を出さずに執行できるかどうか」という点だけであることが分かりました。

あれ?

「ポジション引き取り」と「ポジション解消」を同一トランザクション内でまとめて実行して、損失を出さずにポジション解消が執行できた場合のみトランザクションを通すようにすれば、成功した場合の清算報酬である+5%を実質的にノーリスクで得ることができるのでは????

「ポジション引き取り」と「ポジション解消」を同一トランザクション内でまとめて実行して、損失を出さずにポジション解消が執行できた場合のみトランザクションを通すようにすれば、成功した場合の清算報酬である+5%を実質的にノーリスクで得ることができるのでは????

つまり、本来は清算人が負うはずのリスクを、伝家の宝刀Atomicityによって打ち消すことができるということです。

遂にチャンスが巡ってきました。

早速、記念すべきSolana Bot初号機、「Mango Liquidator Bot」の開発に取り掛かりました。

泥臭い開発期間

このbotの開発はかなり難航しました。

例えば、

  • 所望の取引をAtomic実行するには専用コントラクトを用意する必要がある。
    → Solanaのスマコン記述言語であるRustを習得し、コントラクトを自作した。

  • 清算機会は価格急変時などに同時多発的に発生することが想定されるため、それらを迅速にさばくためには短時間に大量のトランザクションを発行する必要がある。
    → APIリクエスト制限を回避するために、自前のSolanaフルノード(バリデータ)を立てた。

  • 清算処理を正確に実行するbotロジックを書くためには、その舞台であるDEX本体の仕様を厳密に把握しておく必要がある。
    → DEXのソースコードを一行一行じっくり読み込んで理解した。

初めてのことや難しいことが多すぎて本当に骨が折れましたが、ポジティブな捉え方をすると、Solana Botterとして必要な知識技術やスキルのベースを身につけることができた成長期といえるかもしれません。

起動!

そして苦節2ヶ月、10月に入ってようやく本番稼働の日を迎えることができました。

コントラクトをメインネットにデプロイ、お試し資金として1000 USDCをアカウントにdeposit、botの実行ボタンを押下。そして次の瞬間10000 USDCになりました。

なんかゼロ一個多くない!!!!?!???!?????!????

最初は見間違えかと思い何度も確認しましたが、ちゃんと残高の桁が増えています。どういうことや。

この事象については結局ちゃんと調べてないので原因不明なのですが、おそらく他の清算人たちが見逃していた(一つ一つは些細だが、塵も積もれば、な)清算機会を検知して一掃したからではないかと思います。

大半の清算人は、Mango公式が提供していた(non-atomicな)liquidator botを使用していたと思われるので、自前実装のエッジが光る瞬間でした。

それからはクリプト全体の暴落が起こるたびに大量の清算機会をせっせと処理していくことで、当月はこのbot単騎でS級(月次+1000万~)を達成することができました。


Bot#2 Solend Liquidator


以前に成功した戦略の水平展開を考え始めるのは自然な流れだったように思います。

他のDeFiプロトコルにも同様の清算の仕組みが存在するようだったので、前回の戦略を「Atomic Liquidation (清算処理の不可分実行)」くらいの粒度で抽象化し、その適用先を探すことにしました。

次のターゲットは、当時のSolanaの覇権レンディングプロトコル「Solend」です。

慣れてきた開発

Solendにおいても、「レンディングプロトコル本体の理解」「コントラクト実装」「クライアントbot実装」というような開発工程が必要になりましたが、Mangoで得たノウハウを流用することで今回から比較的サクサクと作業が進むようになります。

ただ、公式が提供しているSDKがやや貧弱気味だったので、SDK側のコードも一部自作しなければならなかったのが少し大変でした。

新しい仲間

このbotは着手開始から2週間程度で完成しました。

このツイートポストの調子から察せられる通り、この頃は開発が楽しくて仕方がありませんでした。

そして無事、今回のbotも狙い通り機能し、シンプルに戦力が2倍になりました。

さらなる展開と挫折

余談になりますが、Solendだけでなく、Solanaの他のレンディングプロトコルでも同様のbotを試しました。例えば、「Apricot」や「Larix」などです(今もあるのかな?なさそうw)。

しかし、一部のコントラクトはソースコードが公開されていませんでした。

そこで、オンチェーンからバイナリファイルを落としてきて、その中に文字列として残っているメソッド名やエラー名などの僅かな手がかりからコントラクトの仕様を推測し、その推測した仕様に基づいてbotを作るとかいう黒魔術を覚えます。闇鍋です。

かなり無理矢理ですが、これで一応、なんとなくお金を拾ってくるところまではこぎつけ、トータルで数十SOL 程度の利益が出たのですが、コントラクト側のアプデが走るたびに毎回黒魔術をやり直す羽目になったのでメンテが面倒すぎて途中で投げました。

Bot#3 Atomic Arb


なぜ今なのか

参入初期の頃から候補には入っていたのですが、よりニッチなliqから攻めた方が期待値高そうと考えていたので(戦略的に)ずっと先送りにしていました。

そして激動の2021年も終わり、ようやく時間的にも技術的にも余裕が出てきたところで、満を持してarbの検討に取り掛かりました。

みんな大好き「Atomic Arb」です。
(ちなみにAtomic Arbという呼称はちょうどこの時期に知りました。だれが言い出したんですかね?)

オンチェーン裁定取引では、大量のトークンとプールの中から最適なスワップ経路を効率よく見つけ出す必要があるので、まずは経路計算アルゴリズムの選定から始めました。

経路計算は、数学的には「グラフ理論」や「組み合わせ論」などの領分です。
筆者はこれらの分野に(というかそもそも数学自体にも)あまり馴染みがありませんでしたが、とりあえず教科書を読んで最低限の基礎をおさえた後、使えそうなアルゴリズムを手当たり次第に吟味して回りました。

脳細胞が焼き切れるような苦悩の日々を経て、なんとか納得のいくものを見出しました。

Ore Ore Aggregator

土台ができ上がったので、あとはいつもと同様、動くものを淡々と組み立てていくだけでした。

スワップ量の計算(経路探索などに使う)も高速化したかったので、当時のほぼ全てのメジャーDEXのRust SDK(スワップまわりだけ)を作りました。

コントラクトについては、当時すでに存在していたJupiter Aggregatorを利用するという手も検討しましたが、追加でオンチェーンに載せたいロジックが少なからずあったので、今後の拡張性なども考慮して自作の道を選びました。
(ひょっとしてJUPのエアドロ全然貰えなさそうなのはこれのせいなのでは?記事を書く手が震えてきました)

全体として、前回までのliqに比べるとarbのロジック自体は比較的シンプルなのですが、ただひたすら書くコードが多かったのが苦労ポイントでした。

事件発生: CASH

その日は突然やってきました。

このときは、最初の1トランザクションで+10万ドル、その後の細かいお掃除と合わせてトータル+18万ドルくらいだったと思います。

正直、経路計算にこだわった割には競合と比べてもそんな速くなかったです(ある程度までいくとネットワークなどの他の要素が支配的になる)。
エッジとしては、裁定経路を幅広くカバーできていた(≒マイナーなDEXやプールを考慮できていた)ことが大きかったんだろうなと推察します。

いまだにこの日なにが起こったのかよく分かっていません、、

ちなみにですが、本件にて弊botが派手に繰り出したトランザクションの一部始終を某J○toの中の人に晒され紹介されてしまったのも今となっては良い思い出です。(晒された人枠でJTOのアロケーションってないんですか)


その後


筆者のDeFi botterとしての活動はこの後も(細々と)続いていくのですが、今回は「2021バブル編」という区切りでここまでにしておきましょう。

例えば「Mangoハック編」「新チェーン開拓編」「リバースエンジニアリング編」とかがあります。

また懐かしくなってきたら同じような調子で書いてみようかなと思います。


まとめ


時の流れは残酷なもので、この昔話の中で主役を演じたAtomic執行戦略も今となっては一般攻撃魔法です。

もちろん現環境においても使い所はありますし便利で強力な武器であることには変わりありませんが、それ自体が決定的なエッジになるという時代はおそらく終わっているでしょう。

ですが、その一方で、環境が変わることで人知れず価値が生まれるものもあります。

そういう原石をいちはやく見つけだしてトキントキンに磨き上げて思いっきり環境にブッ刺す!みたいなムーブがbotであれトレードであれ変化の激しい競争的状況下で大きく勝つための立ち回りとして大切なのではないかなと感じました。

ぜひ、ご自身にとっての金を増やす技法ゾルトラークを見つけてみてください。


参考


現在の筆者は握りしめた現物SOLを眺めながらニヨニヨしてるだけの隠居老人ですので、お恥ずかしながら最近のSolanaの技術トレンドは全く追えていません。

Solana DeFiの最前線で戦っている日本語圏の現役botter(強い)を2名、僭越ながらここでご紹介させていただきます。

・picoさん(@pico__sol)

・さるおさん(@saruo_hunbook)

Solana Botについて分からないことは彼らに聞いてください!