8月の損益とGeth改造関連/マージ戦/上場戦/最適Swap量について

8月は仮想通貨+281万円、株+33万円でした。

 今月はGeth改造関連を主に行い、マージ戦、DogeChain上場戦などにも参加しました。
 本業も子育ても非常に忙しいですが、養命酒や薬膳を活用しつつ、体力と気力にブーストをかけながらBOT開発に勤しみました。
 (養命酒製造の黒養鍋に牛肉を入れると死ぬほど美味しいです。あとベーコンもすごい。)
 欲しくなってしまって養命酒製造の株も買いました。来年からは優待が来るはずです。
 

Geth改造関連

 Atomic arbでなんとか勝ちたいなーと思い、共同研究者の方とGethを改造し、誰よりも速くアビトラTXをマイナーに承認されるように開発を進めています。(私はほぼコントラクト作成担当)

 何故Geth改造とか苦行みたいなことをやっているかと言うと、普通のRPCに接続してSwapする程度では速度負けするためです。

 これまでAtomic arbを色々検討してきた結果、以下のように試行錯誤しました。
 まだまだ研究途上なので、トップ層には全く手が届いていませんし、トップとの差がどのくらいあるかわかりません。トップが強すぎます。
 色々書きますが参考程度でお願いします。
*Atomic arb:DEX内でBTC-USDT-USDC-BTCみたいなルートでアビトラをすること。
*Geth: GO Ethereum の略 ノード

i)web3.pyなどを使用してRouterを監視する。
(公式RPCに接続して、1USDC=1.01USDCになったらSwap)

これで勝てるチェーンはほぼない。

ii)Uniswap RouterなどのPendingを公式RPC経由で監視して、養分TXを見つけたら反対方向にSwapする。
a)養分が10000USDTをWBTCにSwapするTXを送る。
b)公式RPCのPendingに養分TXが表示される
c)アビトラTXをUSDC-BTC-USDT-USDCなどとして送る。

これで勝てるチェーンはほぼない。

iii)Rustなどの言語でi),ii)を行う。

それだけで勝てるなら苦労しない。

iv)Rustなどを使用して適切なトークンのSwap量を概算したり、適切なスワップルートを見出すのは時間がかかるので、SolidityでContractを作り、オンチェーン裁定する。

検知速度の問題があって勝てない。

v)養分TX検知速度が遅い/TXをバリデーターまで送る速度が遅いことが原因で負けるので、ノードを建てる。

もちろんその程度では勝てない。

vi)デフォルトのノードだと、Peerとの通信ラグとかがあることに気が付く。ラグをなくして養分TXを取得できるように改造してもらう。

TOP層は当たり前のようにやっており、これだけでは勝てない。

vii)TX情報の伝播ロジックを改造してもらう。

養分TXより先に自分のTXが届くようになるが、TXが先に来てるのでAtomic arbはできない。

 という感じで、まだ勝てていないです。
 本当に色々やっているのですが、トップ層は変態的に強く、おこぼれを貰うことはあっても、100USDなどの利益を得ることはできていません。
(Rosさん、SazanさんMagitoさんなどがDEXBOT界隈では有名ですが、彼らは本当に化物です。人間辞めてる)

 ここまでクラウド代やガス代でいくら払ったのかよくわかりませんが、少なくとも100万円以上はかかっています。
  
 時間は無限に溶け、ストレスは溜まるにも関わらず、トップとの距離はわからない(Positionで+1でもSwap速度差が何ミリ秒かわからない)ので苦行もいいところです。
 私はまだまだ粘るつもりですが、他人にはAtomic arbはおすすめできないです。おとなしくDEX-CEXやイベント戦に参加するほうがいいと思います。
 TOPは日給100万円以上を普通に稼ぐ世界ですが、それだけの技術力が求められているので、人間辞めていないと勝てる気がしないですし、その前にメンタル病むと思います。


化石となったETH、届く

 1年以上前にX-hiveというDEXからETHを引き出しました。
 アホなのか、2Gweiで送金されてしまい、8/21までETHチェーン上を滞留していました。なんでX-hiveを使っていたかと言うと、2020年の価格でETHを安く購入(=アビトラ可)できたからです。

 魔界に行くときは気をつけましょう。大金ではなかったから良かったものの、勘弁してほしいって感じです。むしろよくマイニングされたな・・・。
 現在X-hiveはサイトすらなく、運営も飛んでしまっているので使えないです。普通にクリプト触っていたらまず行き着くことはないでしょう。
 アビトラできる鞘を求めすぎると、ひどい目に会うことがあるんだな、と思いました。

マージ戦

 ETHW(ETH笑)ができるらしい、という話を聞いて、1231ショート現物ロングポジションを最初は取り、テストネットマージの成功を見てから1231を0930に乗り換えました。
 現状では利益がでていますが、予想以上にPOWトークンがゴミなので、適当なところで切り上げて利確する予定です。
 Twitterでも呟いたとおり、マージ戦は以下のような戦略が考えられます。

これに加え、Rosさんが言っていた0930ショート1230ロングは面白いポジションだと思いました。

(普通のETHはコンタンゴになり、1230期日付先物価格>0930期日付先物価格となる。マージの影響で、ETHがバックワーデーション->マージ後にコンタンゴに戻るのにBETする戦略)

 これ以外にも色々な戦略があると思うのですが、現先の乖離を取るのが安全だなあ、とは思います。ETHを金利払ってまで借りてどうこうするほどの魅力を感じていません。
 OMG戦と違って全現金を突っ張るほどの魅力を感じるものではないので、適度なところで切り上げるのが大事だと思いました。

ちなみに、私のツイート群は(勝手に)インスタデビューしていたらしいです。

 オープンで話していることなので(有料とか転売しているようでなければ)文句のつけようはないのですが、面白いのでインスタアカを作って凸してみました。返信待ってます。


DogeChain上場戦

 みんな大好き犬っころのEVMチェーンができていたので入りました。
 何故入ったかと言うと、犬が好きな人は養分が多いからです。
 入った当初はステーブルコインすらなく、DOGE建てでDOGEっぽいトークンを取引できる状況でしたので、10USD分のDOGEを持って上場戦に入りました。

i)上場戦とは?

 DEXにおける上場戦とは、トークンが流動性供給されて取引できるようになる瞬間にトークンを購入し、数分後などに他のBOT/養分に売りつけることを言います。

ii)上場戦戦略

 Swapすべきトークンを選定するために、イベント監視をしました。
 イベント監視とは、Uniswap系のRouter(DEXでトークンをSwapする時に接続するアドレス)で、新規トークンのPairが発行されるとチェーン上にログが残るので、そのログを取得することを言います。
 簡単なコードは以下です。

from web3 import Web3
from hexbytes import HexBytes
from eth_abi import decode_abi
from web3 import Web3,HTTPProvider,WebsocketProvider
main_net = 'https://rpc04-sg.dogechain.dog'
web3 = Web3(Web3.HTTPProvider(main_net))
factory="0xD27D9d61590874Bf9ee2a19b27E265399929C9C3"
Factory= Web3.toChecksumAddress(factory)        
TOPIC = HexBytes(Web3.sha3(text="PairCreated(address,address,address,uint256)")).hex()
_logs = web3.eth.get_logs({
                    "fromBlock": web3.eth.block_number-3000,
                    "address": Factory,
                    "toBlock": web3.eth.block_number,
                    "topics": [[TOPIC]]
                })
initial_pair_address= Web3.toChecksumAddress('0x'+(_logs[-1]['data'][26:66]))
print(initial_pair_address)

iii)ハニーポットトークン回避

 上場戦にあるあるなハニーポットトークンを回避するために、SolidityでContractを作り、ハニーポットの場合はSwapしないようにしました。
 ハニーポットトークンとは、売れないように設定されたり、移動できないように設定されたトークンのことを言います。

 具体的には、以下の流れでハニーポット判定をしました。
 a)自製ContractにSwapしたいアドレスをInputとして送る。
(Contractを使うのは、setApprovalForAllを強いるハニーポットによって資産を全部抜かれることを防ぐため。Contractには基本的にお金を置かない)
 b)一定額でトークンを購入し、購入できた額の1%を売却する。
  0)売れないトークンでないか確認
  1)アンチボットがいないか確認
  2)過大なFeeが設定されていないか確認
c)1%分買い戻す。
d)トークンを金庫用アドレスに移送する。
(移動できないトークンか確認する)
 e)適当なタイミングで利確する。

iv)結果

 結果的に、100Doge->250Dogeになりました。しょぼい。
 流動性が引き抜かれ、Swapできないパターンが多すぎて上場戦は諦めました。
 普通のトークン(ラグらないトークン)は公式サイトやTwitterなどで告知があり、ある程度人がワイワイいる状態で安くトークンを仕入れ、高値で売りつけるのが儲けに繋がります。
 一方、DogeChainのハニーポットの場合、以下のような挙動を示していたので対処が難しかったです。 

 i')新規アドレスに20万Dogeなどが送金される。
ii')ハニーポットトークンがmintされる。この時、トークン作成者が流動性の100%を持っており、ロックなどもされていない。
iii')流動性供給がされる。
iv')90秒程度で流動性を引っこ抜き、上場戦に入った人のDOGEをほぼ全てかっぱらう。
v')新規アドレスにDogeを送金し、i)から繰り返し。

 適当なイベント監視でも1番目にSwapできるので、優位な価格で購入自体はできます。なので、120秒経ったら他の上場戦参加者に売りをぶつけるロジックで運用してみましたが、90秒でラグられて萎えました。

 上場戦はある程度根拠がないと多額を入れられない(入れた瞬間にラグられる)です。これはリスキーな戦略ですし、安定的にうまくいきませんでした。

 こう書きつつ、狙っていたのはハニーポットトークンのコントラクトに脆弱性がないか調査し、可能なら無限Mintしてハニポ作成者のDogeを奪い取ろうと思っていました。ただ、脆弱性なかったので残念ながらうまくいきませんでした。

 ちなみに今は、サンドイッチ攻撃が流行っているようです。地獄かな?


最適Swap量について

 上記Noteを初期に発見し、中身を読んでいた所自分がでてきてびっくりしました。
 Rosさんも言及されていますが、私の考えも書いていきたいと思います。

i)理論最適値を算出するパターン

 Noteに書かれている通り、token_0,token_1のプールアドレスにおける流動性を監視し、最適なSwap量を算出する。
 これは、記事に記載の通りDEX-DEXでtoken_0->token_1->token_0と裁定する場合、理論最適値を出すことができます。一方、token_0,token_1の流動性を知る必要があり、2つのDEXを使うため、2回のRPCとの通信が必要となり、速度的には遅いです。また、マルチホップ(token_0->token_1->token_2->token_0)のSwapを行う場合、監視数が多くなるので速度はより遅くなります。

ii)定額パターン

 最適化をする時間が無駄なので、10USDなど一定額でSwapするTXを送信する。資金効率が悪くなるのであまり良くないです。

iii)コントラクト使用パターン

 コントラクトを用いてSwap量を決定する場合、オフチェーンでの計算時間は0となるので優位です。一方、ガス消費をしてしまうので、ガス代は高くなります。コントラクトを用いる場合、例えば、以下のような最適化方法が考えられます。

 a)オンチェーンで理論最適値を算出

 token_0->token_1->token_2->token_0のパスにおいてそれぞれの流動性を確認し、理論値をだす。
->実際にSolidityでコントラクトを書くと、流動性(18桁以上)の6~9乗を計算する必要があり、オーバーフローしてうまくいかなかったです。やりようはあると思うのですが、深追いしませんでした。

 b)複数回のgetAmountsOutを使用し、最適点の近似値を得る

 getAmountsOutなどを使用して、1,5,25…とSwap量を増やしていき、最も利益が出る所を特定し、Swapする。
->自分が使っているのはこれ。割と簡単に書けて、精度も悪くない。
 FlashSwapを使用する場合は、オンチェーン上で全パスについて最大利益を算出し、最も利益が出るパスだけを実行しています。

 c)定額で複数回Swapする

 1000USDなどでgetAmountsOutを呼び出し、利益が出る時だけSwapを行う。一方、リエントラント性の問題があるのでFlashswapなどは使用できないし、ガス消費も大きい。

 他にもなんかあると思うのですが、実戦的なのはiii-b)かな、と思います。(ガスが高いチェーンでは無理)
 一方、ペア数が多いBSCなどでは、コントラクトだけで全てを完結させることは難しく、ある程度オフチェーンで最適化することは必要なのかなーと思います。
 私の場合、そもそもペア数が多いメジャーチェーンで勝てる気がしないので、ペア数の少ない魔界チェーンでコントラクトを作り、ガス代とのバランスを見ながら最適化をかけています。
 この辺の話は本当に人によって異なり、DEXBotterとしての腕の見せ所というのは間違いないと思います。ただ、一番大事なのは養分TXの検知とアビトラTXをマイナーにいち早く(かつ養分TXの後ろに)承認させることなので、そちらに注力するほうがいいような気がします。
 まあ、それができる人はそもそもSwap量の最適化で悩むことなんてないと思いますけどね。

iv)Advanced

 i~iiiなんて知っとるがな、という人向けです。上記は、裁定パスが1個しかない単純なパターンでした。
 実際にDEXを触っている人はよくわかると思いますが、一つのトークンに対してBTCペアやETHペアなど複数のペアが存在し、それぞれ価格が異なります。このような場合の最適化についてどうするかを述べてみます。

まず、最適化をする問題についてを以下のように仮定します。

仮定1)PancakeswapでCAKE>ETHを養分がSwapする。
仮定2)CAKE/BUSD、CAKE/USDT、CAKE/DAI、CAKE/BTCなどのプールがあり、それぞれ流動性が異なる。

 このような場合、基軸通貨に何を選択するか、どのパスでアビトラTXを送れば最大利益を取れるか、という基軸通貨選定問題とパス最適化問題の2つが生じます。これらについての解法例を紹介します。
(あくまでも例です。ステーブルコインしか持たない教徒なのでBTC起点は採用していません。)

上記の例では、以下のような裁定パスが考えられます。
(Pancakeswap内だけのInternalなパターンを考えています。2個のDEXを使用する場合、それぞれのSwapについてどのRouterを使用するかの判定が必要なので、8倍の計算量が必要です。)

①DAI->ETH->CAKE->DAI
②DAI->BTC->ETH->CAKE->DAI
③DAI->CAKE->ETH->DAI
④DAI->CAKE->BTC->ETH->DAI
⑤BUSD->ETH->CAKE->BUSD
⑥BUSD->BTC->ETH->CAKE->BUSD
⑦BUSD->CAKE->ETH->BUSD
⑧BUSD->CAKE->BTC->ETH->BUSD
⑨USDT->ETH->CAKE->USDT
⑩USDT->BTC->ETH->CAKE->USDT
⑪USDT->CAKE->ETH->USDT
⑫USDT->CAKE->BTC->ETH->USDT

解法1

■①~⑫それぞれのパスについてgetAmountsOutを10USDなどの定額Inputで計算し、一番利益がでるパスのみをi)~iii)で述べた解法でInput量を計算する。(パス最適化->入力最適化)

・メリット:最適解に近いものは得られる。
(*全パスについてInputを最適化し、絶対利益額で比較することで最適解を算出できるが、10USDなどの定額で行っているため)
・デメリット:パス全部についてgetAmountsOutを行うので遅い。

解法2

■そもそも基軸通貨選定をしない。USDCパス以外とらないなど決める。
 DEXによってはそもそも基軸通貨をUSDCのみにせざるを得ない(USDTペアなどが少ない)パターンもよくある。

・メリット:楽。
・デメリット:利益最大化はできない。

解法3

■iii)-cで述べた、定額複数回Swapを全パスについて行う。
例えば、オンチェーンでgetAmountsOutを定額Inputで計算し、利益が出る場合はSwap、そうでない場合はパスする。

・メリット:全ペアについて利益が取れる。
・デメリット:Flashswapなどリエントラント性が問題になるものでは使用できない。ガス代もかなり高い。

ちなみに私はパス選定をした上でこの解法を使う時もあります。

解法4

■凸最適化を行う。

あまり詳しくないが、解法1の発展版?なんか評判がいいですねこいつ。

解法5

■全パス流動性を監視、データベースとして持っておき、養分Swapが来た時の感度解析を事前に行っておく。
 養分Swap量ごとにどのパス、Inputが最適か把握し、養分Swapが来たら即座にTXを送る。
(事前シミュレーションに近い)

・メリット:感度解析できるなら最適値をすぐに出せる。
・デメリット:そもそも作るのがメチャクチャ大変。

結論

 Swap量の最適化を頑張っても利益が1.5倍とかになるくらいです。利益0のBOTしかない場合、Swap量の最適化を頑張ってもどうしようもないので、検知やTX送信の方を頑張るべきでしょう。
 DEX BOTの世界は0->1がまず死ぬほど難しく、1->1.5はまだマシな難易度です。
 簡単に浮かんだのは以上です。他にもなんかあるよ!って方はコメントでもください。
 アセンブラでコントラクトを作ったりする変態つよつよBotterは上記の内容だと満足しないでしょうし、是非Noteでも書いてください笑。

雑記

 娘がいきなり支えなしで立ち上がり、当たり前だろ?みたいな顔をしていたので非常にビビりました。お盆が終わる2時間前で、明日から仕事かーとか思っていましたが、この瞬間100点満点のお盆になりました。
 来月はまだ週2程度の早番・夜勤ですが、10月から土日関係なく夜勤なので辛いです。保育園も落ちたり色々と修羅場なのですが、なんとか時間を捻出しつつBOT開発をしていこうと思います。

 いつもどおり寄付型で養命酒の値段分の価格設定をしています。コメントなどある方はツイッターにでも投げておいてください。

謝辞

校正に協力してくれた人。感謝です。
KNさん
ごーるでんでんでん V2さん
xNFT なぞこいさん

養命酒

この記事が気に入ったらサポートをしてみませんか?