新着:HeliusがLight Protocolを買収
getTransactionsForAddress の tokenAccount フィルターのご紹介
ブログ/更新情報

gTFA のトークンアカウントフィルターのご紹介

共同創業者XのNick PennieLinkedInのNick Pennie
読了時間:3分

昨年10月、履歴データを照会するための新しい Solana RPC コールである getTransactionsForAddress をリリースしました。これは getSignaturesForAddress と getTransaction を1つのメソッドに統合したものです。

本日、getTransactionsForAddress(gTFA)が、1回の RPC コールでウォレットのトークン転送履歴を照会できるようになったことをお知らせします。 

新しい tokenAccounts 機能により、ウォレットに関連付けられたトークンアカウントのトランザクションを含めることができます。これらはこれまで、gTFA とその前身である getSignaturesForAddress では取得できませんでした。

これまでは、開発者が getTokenAccountsByOwner を照会した後、各トークンアカウントに対して getSignaturesForAddress を照会する必要がありました。 

この方法は遅く、コストも高く、数百回もの追加 RPC コールが必要になることも珍しくありませんでした。

今では、tokenAccounts を指定して getTransactionsForAddress を1回呼び出すだけです。

問題

Solana では、ウォレットがトークンを直接保持しているわけではありません。

代わりに、ウォレットが Associated Token Account(ATA)を所有し、それらのトークンアカウントがトークンを保持します。 

たとえば、誰かが USDC を送信すると、メインのウォレットアドレスではなく、USDC トークンアカウントに送られます。

そのため、ウォレットのトランザクション履歴を照会する際に大きな問題が生じます。

ウォレットに対して getSignaturesForAddress を呼び出しても、そのウォレットアドレスを直接参照するトランザクションしか取得できません。

トークンアカウントとやり取りしていても、ウォレット自体を参照していないトークン転送は表示されません。

従来の回避策

これまでは、開発者が次のような煩雑な回避策を実装する必要がありました。

  1. getTokenAccountsByOwner を呼び出して、ウォレットのトークンアカウントを取得する
  2. ウォレット自体に対して getSignaturesForAddress を呼び出す
  3. すべてのトークンアカウントに対して getSignaturesForAddress を呼び出す
  4. すべての結果を統合する
  5. 重複を排除する(多くのトランザクションが複数のアカウントに関係するため)
  6. 時系列順に並べ替える

この方法には、いくつかの問題があります。

1. パフォーマンスが低い

50個のトークンアカウントを持つウォレットで完全な履歴を構築するには、51回以上の RPC コールが必要です。プロのトレーダー、DeFi のヘビーユーザー、趣味でミームコインを取引するユーザーは、数百個のトークンアカウントを持つ場合があります。

2. ページネーションが非効率

直近20件のトランザクションを取得したい場合でも、各ソースから20件ずつ取得して統合するだけでは不十分です。すべてを取得し、重複を排除して並べ替えた後で、ようやく最初の20件を選択できます。 

過剰に取得せずに効率よくページネーションする方法はありません。

3. RPC コストが膨らむ

各 RPC コールにはオーバーヘッドがあります。ユーザーリクエストごとに100回以上のコールが発生すると、そのオーバーヘッドが積み重なり、特に大規模環境ではコストが急増します。

解決策

新しい tokenAccounts フィルターを使用すると、1回の RPC リクエストでウォレットの完全な履歴を取得できます。

コード
{
    "jsonrpc": "2.0",
    "id": "helius-example",
    "method": "getTransactionsForAddress",
    "params": [
        "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
        {
            "filters": {
                "tokenAccounts": "all"
            },
            "sortOrder": "asc",
            "limit": 100
        }
    ]
}

これだけです。1回のコールで、完全な履歴を取得できます。

フィルターオプション

tokenAccounts フィルターには、none、balanceChanged、all の3つのオプションがあります。

none(デフォルト)

tokenAccounts フィルターを none に設定すると、トランザクションがウォレットアドレスを参照している必要があります。

balanceChanged(推奨)

balanceChanged を適用すると、ウォレットアドレスを参照するトランザクション、またはウォレットが所有するトークンアカウントの残高を変更するトランザクションが対象になります。

all

tokenAccounts を all に設定すると、トランザクションがウォレットまたはウォレットが所有するトークンアカウントのアドレスを参照している必要があります。

ユースケース

この新機能は、次の用途に不可欠です。

  • 完全なトランザクション履歴を表示するウォレット
  • すべてのトークン移動を把握する必要があるポートフォリオトラッカー
  • すべてのトークンの損益を計算する税務ソフトウェア
  • ユーザーアクティビティを表示する分析ダッシュボード

はじめる

tokenAccounts 機能は、現在ご利用いただけます。

フィルターオブジェクトに tokenAccounts: balanceChanged(または all)を追加するだけで準備完了です。

まだ getTransactionsForAddress を使用していませんか?

詳しい情報と利用開始方法については、ドキュメントと SDK をご覧ください。

Heliusを購読

Solana開発の最新情報や新しい記事の公開通知を受け取れます