dexamine:Uniswapの取引と流動性変化をEthereumログから取り出すPythonツール
この論文は、Ethereum上の分散型取引所Uniswapで起きた取引や流動性の変更を、研究で使える形に変換するPythonパッケージ「dexamine」を紹介します。ブロックチェーンにはすべての実行ログが公開されていますが、そのままでは経済的な観察値になりません。dexamineはトランザクションのレシートログを読み、トークン量やプール状態、トランザクション内の順序、手数料情報などを対応付けた観察行に変換します。パッケージはリポジトリとオフラインで再現できる例も提供しています。バージョン1は価格発見に関する実証研究で既に利用されています。GitHub: https://github.com/HanssonMagnus/dexamine。
開発者はUniswap v2とv3のスワップ(取引)、ミント(流動性の追加)、バーン(流動性の削除)をサポートしました。ソフトはデータ取得、コントラクトのメタデータ解決、プロトコル固有の解釈、出力構築という四つの役割を分けています。実際の実行記録はEthereumのJSON‑RPC(ノードへのHTTP問い合わせ)から得て、web3.pyとRequestsという既存ライブラリを使ってコントラクト呼び出しやログ取得を行います。出力は一つのイベントごとに平坦な行にすることも、元のノード応答をそのまま保持することもできます。
仕組みの要点はプロトコル差の扱いです。Uniswap v2では同期イベント(Sync)でリザーブ更新が報告されるため、dexamineは直前のログが同じプールのSyncであることを確認します。v3ではスワップログに価格やティック、アクティブ流動性が直接含まれます。これらの値から「仮想リザーブ」を計算し、局所的な取引曲線を表現します。ただしアクティブ流動性がゼロのときは仮想リザーブは欠損として報告されます。出力にはreceipt_log_index(レシート内のゼロ始まりのログ位置)や正負の符号規約(流動性追加を正、削除を負)など、再利用しやすい設計が含まれます。
このツールが重要なのは、同じ処理を何度も個別に書かずに済み、トークン単位の正規化やイベント順序の保存などを統一して行える点です。論文中の例では、2021年6月3日のブロック12561528に含まれるトランザクション31を解析し、1件のトランザクション内で3つのプールにまたがる4件のUniswap v3スワップを順序通りに復元しています。パッケージはPython 3.10以上、web3.py 6.15.0以上、Requests 2.31.0以上を要し、ソースからpipでインストールできます(例: python -m pip install git+https://github.com/HanssonMagnus/dexamine.git@v1.1.0)。
重要な制約と注意点も明示されています。歴史的なブロックとレシートにアクセスできるJSON‑RPCエンドポイントが必要です。トークンやプールのメタデータは最新ブロックで取得してキャッシュするため、同じ過去ログでもメタデータの変化が再現性に影響する可能性があります。正規化されたトークン量は浮動小数点で表されるため丸め誤差が生じ得ますが、元の整数量は元ログを保持すれば復元可能です。ガス消費や手数料はトランザクション全体の値であり、個々の取引に分配はしません。また、内部呼び出し経路の復元やトレーダーの同定、最大抽出可能価値(MEV)の検出などは行いません。処理速度やスループットは使うエンドポイントの性能に依存します。