cryptofoundry

cryptofoundry へのお問い合わせ

構築または自動化したい内容をお聞かせください。

記事

ETH Transactions Storage 2.5.0:自前で運用するアドレス履歴

massivedev0 (Theo Bitner)鋳造所から ↗
ETH Transactions Storage 2.5.0:自前で運用するアドレス履歴

Ethereum実行クライアントはチェーンの先端やブロック、レシート、ログについては回答できますが、ウォレット画面を開くたびにユーザーが確認する「このアドレスに関連する取引は何か(最新順)」という問いには答えられません。公開インデクサーであれば回答可能ですが、ユーザーが検索するすべてのアドレスを把握されてしまうほか、トラフィックが増加すればレート制限を受け、価格変更やサービス終了のリスクも伴います。取引履歴が製品の一部である場合、その依存関係はクリティカルパスとなります。

ETH Transactions Storageは、Ethereumノードからブロックを読み取り、ネイティブETH転送およびERC-20転送コールをPostgreSQLデータベースに書き込み、アドレス履歴を読み取り専用のREST APIで提供するセルフホスト型インデクサーです。テレメトリや第三者のアカウントは一切不要で、外部への接続は設定したノードとデータベースへの2つのみです。アーキテクチャはシンプルで、Ethereumノード → ethsync.py → PostgreSQL → PostgREST → アプリケーションという構成です。Geth、Nethermind、Besu、ErigonとHTTP、WebSocket、またはIPC経由で連携でき、同じJSON-RPCインターフェースを公開するEVM互換ネットワークでも動作します。

バージョン2.5.0では、このコンセプトを配布、運用、文書化が可能なものへと昇華させました。本番環境で使用するAPIコントラクトはそのままに、周辺ソフトウェアを一新しました。今回のリリースでは、信頼性の高い同期、推奨インデックスセットの縮小、オプションのアドレスフィルタリング、文書化されたセキュリティモデル、公開コンテナ、およびドキュメントサイトが導入されています。

信頼性の高い同期とアドレスフィルタリング

各ブロックは、チェックポイントとともに単一のデータベーストランザクションで書き込まれます。再起動時は停止した地点から正確に再開されます。起動時、インデクサーは最新のブロックを削除して1ステップ巻き戻すことで、不完全な書き込みによるクラッシュを防ぎます。空のブロックやフィルタリングされたブロックがカーソルを誤認させることはなく、専用の sync_state 行が、行が保存されなかった場合でも最後に処理された高さを記録します。データベースエラーが発生した場合はロールバックして再試行されるため、チェックポイントがデータより先行することはありません。

フルチェーン履歴は公開ウォレットAPIには適したデフォルト設定ですが、あらかじめアドレスセットが判明している財務監視ツールやサポートツールには不向きです。バージョン2.5.0では、オプションのアドレスフィルターが追加されました。これを読み込むと、インデクサーは送信者、ネイティブ受信者、またはトークン受信者が一致する場合のみ転送を保存します。リストはプロセス実行中に再読み込み可能です。バリデーションは厳格かつフェイルクローズ方式であり、リストが読み込めない場合、空のフィルターでインデックス作成を続行することはありません。フィルターの有効化やアドレス追加を行っても過去のブロックはバックフィルされないため、開始前に必要な履歴を計画してください。

最適化されたインデックス作成とセキュリティ

推奨されるデータベースセットは、すべての潜在的な列をインデックス化するのではなく、実際のプロダクションクエリトラフィックから導き出された5つのB-treeインデックスになりました。約4億9000万行のデータセットにおいて、この縮小されたセットにより推定90〜110GBの容量を節約できます。アドレスフィールドに citext を使用することで、すべてのクエリを LOWER() で囲むことなく、大文字小文字を区別しないマッチングを維持しています。

インデクサーユーザーは書き込みを行いますが、公開APIにはその権限を与えてはなりません。本リリースでは、ethtxs、aval、max_block に対してSELECTのみを許可する web_anon ロールを文書化し提供しています。PostgRESTはレスポンスごとに10,000行の上限が設定されています。セキュリティガイドでは、公開デプロイメント向けのリバースプロキシ設定(メソッドの許可リスト、/ethtxs での必須アドレスフィルター、高負荷なカウント集計や無制限のオフセットに対するガードなど)を網羅しています。認証情報は .env から読み込まれ、PostgreSQL接続URIがサポートされており、診断情報からはパスワードが除外されます。

コンテナとAPIコントラクト

公開されているイメージは ghcr.io/adamant-im/eth-transactions-storage:2.5.0 で、linux/amd64およびlinux/arm64向けにビルドされています。バージョンタグは不変であるため、本番環境では2.5.0をピン留めしてください。Docker Composeは、デフォルトでPostgreSQL、PostgREST、オプションのローカルGeth、およびインデクサーとともにこのイメージを実行します。eth-indexer.docs.adamant.im のドキュメントサイトでは、アーキテクチャ、クイックスタート、設定、セキュリティの詳細を提供しています。

これほど大規模なリリースであっても、既存のクライアントがそのまま動作しなければ意味がありません。今回のリリースでも互換性は維持されています。/ethtxs、/max_block、/aval エンドポイントに変更はありません。

ネイティブETH転送の1リクエスト例:

GET /ethtxs?and=(contract_to.eq.,or(txfrom.eq.{address},txto.eq.{address}))&order=time.desc&limit=25

トークンコントラクトのERC-20転送例:

GET /ethtxs?and=(txto.eq.{contract_address},or(txfrom.eq.{address},contract_to.eq.000000000000000000000000{address_without_0x}))&order=time.desc&limit=25

ヘルスチェック:

GET /max_block
GET /aval

列名、エンコーディング、大文字小文字を区別しないアドレス指定は以前のままです。contract_to の先頭にある24個のゼロはABIパディングであり、後で修正すべき不具合ではありません。

スコープと制限事項

このインデクサーは、ゼロ以外の値を持つネイティブETH転送と、直接のトップレベル transfer(address,uint256) コールとして送信されたERC-20転送を保存します。内部ETH転送、transferFrom、マルチシグやルーターのフロー、その他のトークン規格、イベントログは保存されません。また、インデクサーは発生後の深いチェーン再編成を自動的に修復しません。CONFIRMATIONS_BLOCK によってチェーンの先端より遅延させているため、深い再編成が発生した場合は影響範囲の再インデックス作成を計画する必要があります。アプリケーションがすべてのトークンの動きを反映する必要がある場合は、ログベースのインデクサーが必要です。しかし、ユーザーが開始した転送(ウォレットが実際に表示する履歴)が必要な場合、本ツールはその目的に最適化されており、低コストで運用可能です。

既存の運用者は、デプロイ前にアップグレードガイドをお読みください。まず追加のスキーマを適用し、本番環境の値を保持してください。Composeのイメージタグの更新をPostgreSQLのアップグレードと混同しないように注意してください。ETH Transactions Storageは、ADAMANT開発者コミュニティおよびcryptofoundryによって保守されているオープンソースのインフラストラクチャです。