DEXの損益計算を試行錯誤してあきらめました
こんにちは、バジル(@kkngo_crypto)です。
今年はクリプトの収益が5,000ドルくらいにはなりそうなので、確定申告のことを本格的に考え始めています。
CEXの損益については、もしかしたら記事にするかもしれませんが、特に難しいことはありません。
問題はDEXです。
手動操作のみ場合、DEXの操作をするたびにエクセルなどに記録しておく
botの場合、bot側で送信したトランザクションの内容を記録しておく
年末に全部円転する
といったものが正攻法にはなるかと思います。
個人的な状況としては、DEX botは作っておらず、現状で年間3,000トランザクションくらいです。最近はDEXを触らない日もあるのですが、年始頃に手当たり次第に目についたPJを触っていた時期があり、DEX botterじゃないにしては結構数が多いのではないでしょうか。
一応、4月頃からはDEXの操作をすべて記録してはいるのですが、3月頃までは漏れているものもあるため、その分だけでもなんとか計算したく、いろいろ調べたり頑張ってみた内容を紹介したいと思います。
誰かの参考になれば嬉しいですが、あまり詳しくないため、スキルのある方に方にツッコミをいただけたり、記事を書いてもらえるととても嬉しいです。
既存のサービスを利用する
は試しました。
クリプタクト
一部のチェーンしか対応していないですし、対応しているチェーンでも私の場合は半分程度のトランザクションしか解析されませんでした。
CEX分の解析は優秀なサービスなので、DEX分を自分で解析してカスタムCSVとして取り込むという使い方なら使っても良さそうです。CEX分と合わせて一元化して損益を確認できるので便利だと思います。
CryptoVision
かなりのチェーンに対応しており、解析可能なトランザクションも非常に多かったです。
ただ、フロントエンドの動きが一部不安定で解析内容の手修正がうまくできなかったのと、残念ながら2022/12現在は開発も止まっているようです。
CryptoVision開発者のmoscatさんのツイートを読むと、この手のツール開発はよほどうまくやらないと労働集約的で超大変ということがうかがえます。
CryptoVisionはほぼ個人運営(一応チームっぽい)のサービスで、特に収益化していないようにも見えたので、思い切ってオープンソースにしてGitHubにでもあげてくれたら、自分の触ったDEX分くらいはプルリクするのにな~と思います。
ほかにもいくつか軽く触ってみたものもあるのですが、既存のサービスで100%解析するというのは難しいなという結論になりました。
自分で頑張る(目視で確認する)
既存のサービスで難しければ自分で頑張るしかありません。
まずは、Etherscanなどのブロックチェーンエクスプローラを開いて、ひとつひとつトランザクションを確認するという方法です。
各トランザクションの詳細ページに送受信したトークンの量、実行したコントラクトのメソッド名が表示されるので、そのときどんな操作をしたかの記憶とも突き合わせて内容を判断していきます。
トランザクション数が少なければ頑張る気にもなるのかもしれませんが、私は心が折れました。
魔界PJを触ったトランザクションはエクスプローラを見るだけでパッと内容がわからないこともあり、1トランザクションにかなり時間が取られることもあります。
また、ブロックチェーンエクスプローラからはCSVでトランザクション一覧をダウンロードすることもできますが、CSVで確認できるのはせいぜい
ネイティブトークンのTransfer量(イーサリアムの場合はETH)
どのコントラクトのどのメソッドを実行したか
ガス代
程度なので、ほとんどのトランザクションでは詳細ページを確認する必要があります。
とても辛いです。
自分で頑張る(ツールを作る)
目視で確認していくのが辛ければ、ツールを作るしかありません。
数百数千のトランザクションを目視確認するよりはさすがにかマシな気がします。
既存サービスの項目で紹介したmoscatさんのツイートからもわかる通り、ツール作成するのも相当大変かとは思いますが、自分専用のツールとなると、自分の触ったDEX分さえ解析できれば良いので、実装量もそこまでは多くないのではないかと少しは希望も見えます。
そこでまず私は事前準備として各チェーンのブロックチェーンエクスプローラから自分のウォレットのトランザクション一覧CSVを取得し、下記のような解析ツールを作成しました。
CSVの件数分ループ
CSVのtxhashをもとにトランザクションとブロックの情報を取得
web3.eth.getTransactionを実行
web3.eth.getTransactionReceiptを実行
web3.eth.getBlockを実行
ガス代を計算(gasUsed*gasPrice)
ブロックのtimestampを取得
トランザクションのvalueがゼロでない場合
ネイティブトークンの移動なので、その旨を記録
トランザクションのfromやtoから対象のコントラクトを特定
トランザクションのinputを解析し、対象のメソッド名を特定
トランザクションのlogsの件数分ループ
topicを解析し、各イベントログの処理内容(メソッド名)を特定
topicを解析し、各イベントログの送受信アドレスを特定
addressから各イベントログで送受信されたトークンを特定
dataから各イベントログで送受信されたトークンの量を特定
5~7で解析できないデータを検出したらエラー終了
※該当データの解析処理を実装する
5~7の情報を用いて、「どのコントラクトのどの処理を実行した結果、どのトークンがどの程度移動したか」を確定する
ブロックの日時時点での対象トークンの価格をもとに円換算での損益を記録する
大まかなツールの処理はすぐに完成したのですが、No.5~7の解析処理というのが、トランザクションに含まれるこの項目の値がこれだったらこういう処理をするという条件分岐をひたすら実装していく作業で、想像以上に大変でいつまでも作り終わりませんでした。
どういう処理にすべきかについて、ひとつひとつブロックチェーンエクスプローラを見たりコントラクトの内容を確認したりしながら判断していく必要がありますし、実装内容も同じような実装を繰り返すだけでなんの面白みもないものです。なかなか不具合なく実装できるものでもないため、そのうち計算が合わないトークンもでてきたりしてどんどんドツボにハマっていきます。
途中で心が折れてきました。
ツール作成もめちゃくちゃ大変でした。
スキルのある方は効率的に解析処理を実装できるのかもしれませんが、コントラクトの作りに依存するため、汎用的に作りきるのは難しく、労働集約的な作業にならざるを得ないと思います。
まとめ
といったわけで、どうやってもうまくいかないので、円転するのが一番楽だなと思いました。
しかしながら、こうして損益計算を頑張ってみようとしたことで、トランザクションの内容を読む機会にはなったので、非常に良い勉強にはなったと前向きにとらえています。今後も腐ることのない経験です。
また、本記事の内容について、あまり体系的にブロックチェーンについて学んだことのないまま試行錯誤した内容を記載していますので、間違いや遠回りなところがあるかもしれません。指摘やアドバイスも大歓迎です。