検索で見つかりたくない。。。。
1.ペア収集
プロトタイプを作るにしてもとりあえずペア数が必要なので通貨ペアの収集をしました。5000ペアぐらい
2.パス探索
シンプルにA-B-C-Aのようなパスすべてを特定することにしました。トライアングルアービトラージです。
この辺は自分の理解ですが、Aを固定としたときに2通貨の場合だと触れるペアがAをペアに持つやつだけになるのでだめで、逆に4通貨にしたからと言って、3通貨のときより触れる通貨ペアの幅はそんなに広がらないはずなのであまり意味がない。という解釈をしてました(Aがどれぐらいメジャーな通貨であるか次第ではあるけど)
トライアングルアービトラージという名前もあるぐらいだし、とりあえずA-B-C-Aの深さでのみ探索しました。
深さ2: Aをペアに持つ通貨ペアのみ取引可能
深さ3:通貨ペアA-Bと通貨ペアA-Cが存在するB-Cペア触れる
深さ4: 通貨ペアA-Bと通貨ペアA-Dが存在するB-C-Dの2ペア触れる
なので深さ4あまり意味ない気がする。深さ5になるとA-B-C-D-E-Aで、C-DペアはAのペアの影響を受けなくなるのでなんか意味あるかも?実際に検証したほうが早そうではある=>例えば全探索したときに発生する一意な通貨ペアの数を比較する
※パス探索をグラフアルゴリズムによる最適パス探索ではなく、単純な全探索にした理由は後述
3.ammのためのamount処理
通貨ペアそれぞれのamountがわかると、レートを計算できるようになります(CPMM: Constant Product Market Maker)
とりあえずREST APIでamountを取得しますが、それだけだとポーリングで対応することになり、検知速度がクソ雑魚です。なので通貨ペアそれぞれのamountを管理するアドレスをsubscribeします。
pathにかかわる一意の通貨ペアの配列を作成し、さらに通貨ペアの配列から一意のアドレスの配列を作成します。
あと、まだやってないですがそれにプラスしてREST APIから定期的に取得して同期するやつもやる予定です。
4.購読制限
とあるRPCノードプロパイダーを利用してましたが、無料プランだと1000が最大の同時接続数でした。これ、ドキュメントに記載ないので罠でした。
無料プランの場合なので有料プランにすれば話変わるかも。変わらないなら解決策は3つ
1. 他RPCノードプロパイダーを混ぜて、limitを実質的に増やす
2. 通貨ペアの流動性でフィルタかけて候補減らす
3. RPCノード立てる
5.RPCノードを立てる
理論値出すならこれ一択なんですが、コストが結構エグいです。だいたい2000ドル/月は覚悟な印象。ベアメタルサーバー推奨という話なので、管理も難易度が高そうな予感
GitHub - rpcpool/ansible-rpc-sample-playbook: Sample Ansible RPC playbook
↑これとこれのリンク先精読するとよかった
最終的にはこれに手を出したいわけですが、経費ペイできるかの問題もあるし、そもそもプロトタイプすらできてない状態で払うコストじゃないので最終的に却下としました
※購読制限については一旦2で対応中、有料プランは試してみようかなぐらい
6.並列で色々処理
AMMでのパス探索の難しいところは、入力量と最適パスの探索が密接であるとこ。入力料を固定しないと最適パスの探索はできないし、パスを決めないと最適入力量の探索ができない。
「じゃあ全部のパスを並列で処理すればよくね?」という思想で対応した。パスを全探索した理由もこれ
言うのは簡単だけど、実装はなかなかに高度でした。chatgptありがとう。。(クソコードを何度も投げてくるのでキレたりもした)
---
とりあえず今のところここまで。
あとはスマートコントラクトを書く必要があるし、そこにどういった形でtx送るか問題もある感じ。一度やってはいるのでなんとかなるだろうの精神
とりあえずオフチェーンでやりたいロジックは軒並みできてきたのでよかった。ここからのほうが大変なような気もしなくもないです。