新着:HeliusがLight Protocolを買収
Solanaの履歴データを照会できるHelius限定の新しいgetTransactionsForAddress RPCメソッドをご紹介します
ブログ/更新情報

getTransactionsForAddressと最大10倍高速になったアーカイブデータ

Growth LeadXのBrady WerkheiserLinkedInのBrady Werkheiser
読了時間:5分
目次

    getTransactionsForAddress(gTFA)は、getSignaturesForAddressとgetTransactionを1回の呼び出しに統合した、履歴データ照会用の新しいSolana RPCメソッドです。逆方向検索、時間、ステータス、スロットに基づくフィルタリング、ページネーションなどの強力な新機能を備えています。

    これまでSolanaの履歴データをバックフィルして照会するには、getBlockのような低速で高コストなメソッドを使用するか、getSignaturesForAddressとgetTransactionを使って署名のバッチをループ処理する必要がありました。

    今では、強力なフィルタリングと並べ替えのオプションを備えた1回の呼び出しで、トランザクションの全詳細を含む最大100件のレコード、または署名のみの最大1,000件のレコードを照会できます。

    Solanaの履歴データ照会における課題

    Solanaの台帳には、これまでオンチェーンで送信されたすべてのトランザクションが保持されています。この履歴データには、ジェネシス以降に行われたすべてのミント、転送、スワップ、プログラム操作が含まれます。

    現在までにSolanaは3億7,500万以上のブロックを生成しており、ジェネシスブロックから現在までのプルーニングされていない完全なトランザクション履歴は、数百TBに達します。 

    このデータへ高速かつ確実にアクセスできることは、現在Solana上で開発するほぼすべてのチームにとって不可欠です。Solanaのアーカイブメソッドは、お気に入りのウォレットのトランザクション履歴タブから、エクスプローラーやポートフォリオダッシュボードまで、あらゆる機能を支えています。 

    これまで、開発者がアーカイブデータを照会する方法は2つしかなく、どちらも扱いにくいものでした。 

    1. getBlock
    2. getSignaturesForAddressとgetTransactionの併用

    getBlockは遅すぎます

    まず、開発者はデータをバックフィルするためにgetBlockの照会を試すかもしれません。実行は可能ですが、この方法は不必要に時間とコストがかかり、多くのリソースを消費します。

    1. getBlocksを呼び出し、対象のスロット範囲で確定済みのブロックを探します
    2. 各ブロックでgetBlockを呼び出し、トランザクションの全詳細、署名、またはアカウントを取得します
    3. ブロックから関連データをすべて解析し、データベースに保存します
    4. すべてのブロックが完了するまで繰り返します

    getBlockメソッドは、活発に利用されているプログラム(USDCのような人気トークンやPump.funのようなSolanaプログラムのインデックス作成など)には適していますが、小規模で特定用途のデータセットに使用するのは現実的ではありません。

    getSignaturesForAddressとgetTransactionのループ処理

    getSignaturesForAddress(gSFA)とgetTransactionを併用する方法も、データをバックフィルする一般的な手段です。

    この「N+1ループ」方式では、通常1回に1,000件ずつトランザクション署名を繰り返し取得し、その後、各トランザクションの詳細を取得するためにRPCをバッチ呼び出しします。 

    RPCリクエスト数が非常に多いため、レート制限への到達やデータの欠落を防ぐには、指数バックオフと再試行ロジックを実装する必要があります。 

    gSFAとgetTransactionの併用はgetBlockより柔軟ですが、大規模に運用すると依然として高コストかつ複雑で、エラーも発生しやすくなります。

    getTransactionForAddressのメリット

    新しいgetTransactionsForAddress RPCメソッドは、getSignaturesForAddressとgetTransactionを1回の呼び出しに統合します。強力な機能により、インデックスの構築と履歴データの照会がより簡単かつ高速になります。

    主な機能は次のとおりです。

    1. 逆方向検索

    gSFAなどの既存のアーカイブRPCメソッドでは、最新のトランザクションから始めて過去へ遡る必要がありました。

    getTransactionForAddressを使うと、昇順(時系列順、古いものが先)または降順(新しいものが先)の並べ替え順を選択できます。 

    時間ベースのフィルターと組み合わせれば、getTransactionForAddressを使用して、Solanaの履歴の任意の部分を、任意の時点から、任意の順序で照会できます。

    たとえば、Heliusの新しいSolanaブロックエクスプローラーであるOrbでは、getTransactionsForAddress RPCメソッドを使用して「古い順に表示」フィルターを実現しています。

    getSignaturesForAddressとgetTransactionを使用して同じデータを照会する場合は、次の手順が必要です。

    1. 最初のトランザクションに対応する正確なタイムスタンプを特定します
    2. 開始日に対応するトランザクション署名を特定します
    3. before: lastSignatureを使用し、その署名から過去へ向かってループ処理します 
    4. 返された署名のblockTimeが終了日に達するまでループ処理を続けます
    5. レート制限への到達やデータの欠落を防ぐため、バックオフと再試行のロジックを実装します

    このプロセスは照会に時間がかかるだけでなく、セットアップも煩雑で、エラーが発生しやすくなります。

    2. 高度なフィルタリング

    新しいgetTransactionsForAddressメソッドでは、時間範囲(Unixタイムスタンプ)、スロット、ステータス(成功または失敗など)でフィルタリングできます。これらのフィルターにより、必要なデータだけを正確に照会でき、より精密できめ細かな制御が可能になります。

    たとえば、次の時間ベースのフィルターではUnixタイムスタンプを使用し、2025年1月1日午前0時(GMT)から2025年10月1日午前0時(GMT)までに発生した、成功したすべてのトランザクションを取得します。

    コード
    // Time range with successful transactions only
    "filters": {
      "blockTime": {
        "gte": 1767225600,
        "lte": 1759363200
      },
      "status": "succeeded"
    }

    3. カーソルベースのページネーション

    gTFAのデフォルト上限(署名1,000件、またはトランザクションの全詳細を含むレコード100件)を超えるトランザクションを照会する場合は、レスポンス内のpaginationTokenを使用して次のページを取得できます。paginationTokenは「slot:position」形式の単純な文字列で、APIに処理を再開する位置を指示します。

    たとえば、次のクエリではpaginationToken(カーソル)を使用し、アドレスの履歴を100件ずつスキャンします。

    コード
    // First request
    let paginationToken = null;
    let allTransactions = [];
    
    const getNextPage = async (paginationToken = null) => {
      const params = [
        'ADDRESS',
        {
          transactionDetails: 'signatures',
          limit: 100,
          ...(paginationToken && { paginationToken })
        }
      ];
    
      const response = await fetch(rpcUrl, {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify({
          jsonrpc: '2.0',
          id: 1,
          method: 'getTransactionsForAddress',
          params
        })
      });
    
    const data = await response.json();
      return data.result;
    };
    
    // Paginate through all results
    do {
      const result = await getNextPage(paginationToken);
      allTransactions.push(...result.data);
      paginationToken = result.paginationToken;
    
      console.log(`Fetched ${result.data.length} transactions, total: ${allTransactions.length}`);
    } while (paginationToken);
    

    新しいSolanaアーカイブシステム

    新しいgetTransactionsForAddressメソッドに加えて、アーカイブのルーターとストレージパスを最適化するため、ゼロから再構築した新しいアーカイブシステムをリリースしました。

    この新システムは、すべてのSolanaアーカイブRPCメソッド(getTransaction、getBlock、getInflationRewardなど)で有効になっており、すべての無料および有料プランのユーザーが利用できます。

    つまり、すべてのプランの全アーカイブメソッドが2〜10倍高速になりました。レイテンシが低下し、パフォーマンスが向上したうえ、コードを変更する必要もありません。

    利用を開始する

    getTransactionsForAddress RPCメソッドは、本日よりすべての有料プランで一般提供され、既存のHelius RPC URLで使用できます。gTFAメソッドは1回の呼び出しにつき100クレジットを消費し、RPCレート制限グループに含まれます。

    メソッドの仕組みを理解して利用を開始するには、APIリファレンスを読み、getTransactionsForAddressクイックスタートガイドをご覧ください。

    Heliusを購読

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

    拡大画像