メインコンテンツへスキップ
getMultipleAccounts RPC メソッドは、Solana アカウントのリストに対する情報を同時に取得するための非常に効率的な方法です。各アカウントに個別のgetAccountInfoリクエストを行う代わりに、getMultipleAccountsを使用すると、これらのリクエストをバッチ処理でき、ネットワークのオーバーヘッドを削減し、アプリケーションの応答性を向上させます。

一般的な使用事例

  • バッチ処理によるアカウントデータの読み込み: アプリケーションが複数の既知のアカウント(例: ユーザーのトークンアカウント、オンチェーンのプログラム設定のリストからのデータを表示または処理する必要がある場合)。
  • ポートフォリオトラッカー: ユーザーが所有する多数のトークンアカウントの残高や状態を取得します。
  • マーケットプレイスUI: 複数のNFTまたは一覧アイテムの詳細を一度に取得して表示します。
  • dAppのパフォーマンス向上: RPCコールの数を大幅に削減し、多くのアカウントを扱う際の読み込み時間を短縮し、より良いユーザーエクスペリエンスを提供します。

リクエストパラメータ

  1. pubkeys (array of string, required):
    • クエリしたいアカウントのBase-58でエンコードされた公開鍵文字列の配列。
    • 1リクエストあたり最大100個の公開鍵。
    • 例: ["So11111111111111111111111111111111111111112", "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"]
  2. options (object, optional): 次のいずれかのフィールドを含む構成オブジェクト:
    • commitment (string): クエリに対するコミットメントレベルを指定します(例: "finalized", "confirmed", "processed")。
    • encoding (string): アカウントデータのエンコーディング。オプションには以下が含まれます:
      • "base64" (デフォルト): 標準のbase64エンコーディング。
      • "base58": 遅いが、特定のコンテキストで役立つ場合があります。
      • "base64+zstd": base64でエンコードされたzstd圧縮データ。
      • "jsonParsed": アカウントがRPCノードにパーサーを持つプログラムによって所有されている場合(例: SPLトークンプログラム、ステークプログラム)、dataフィールドはJSONオブジェクトになります。これは構造化データに非常に役立ちます。
    • dataSlice (object): アカウントデータの特定の部分のみを取得できます。これは、大規模なアカウントで特定の情報のみが必要な場合に役立ちます。
      • offset (usize): アカウントデータの先頭からのバイトオフセット。
      • length (usize): オフセットから返すバイト数。
      • 注: dataSliceは、base58, base64, またはbase64+zstdエンコーディングにのみ利用可能です。
    • minContextSlot (u64): リクエストが評価される際の最低スロット。

応答構造

JSON-RPC応答オブジェクトには、以下を含むresultフィールドがあります:
  • context (object):
    • slot (u64): 情報が取得されたスロット。
    • apiVersion (string, optional): ノードのAPIバージョン。
  • value (array):
    • 配列の各要素は、リクエストのpubkeys配列内の同じインデックスの公開鍵に対応します。
    • 各要素は以下のいずれかです:
      • null: 指定された公開鍵のアカウントが存在しない場合、またはその特定のアカウントにエラーが発生した場合。
      • アカウントオブジェクト次のフィールドを持ちます:
        • lamports (u64): アカウントが所有するlamportの数。
        • owner (string): アカウントを所有するプログラムのBase-58でエンコードされた公開鍵。
        • data (array または object): アカウントデータ。encodingjsonParsedであり、パーサーが存在する場合、これはJSON オブジェクトになります。それ以外の場合、通常は配列["encoded_string", "encoding_format"](例: ["SGVsbG8=", "base64"])。
        • executable (boolean): アカウントにプログラムが含まれているかどうか(実行可能か)。
        • rentEpoch (u64): このアカウントが次のエポックで家賃を支払う必要があるスロット。
        • space (u64): アカウントのデータ長(バイト単位)。

1. 2つのアカウントの基本情報を取得

この例は、SOL Llama(NFT)とSerum Dex Program v3のデータを取得します。

2. 解析されたトークンアカウントデータを取得

この例では、2つのSPLトークンアカウントのデータを取得し、構造化データを取得するためにjsonParsedエンコーディングを要求します。

開発者向けヒント

  • 最大100アカウント: 1回の呼び出しで最大100アカウントを要求できます。
  • 原子性: リクエストは原子性を持たず、あるアカウントの検索が失敗しても他のアカウントは成功する可能性があります。value配列の各要素でnullを確認してください。
  • jsonParsedの便利さ: SPLトークンアカウントのような一般的なアカウントタイプを扱う場合、手動のデシリアライズを避けるためにjsonParsedエンコーディングを使用することを強くお勧めします。
  • 大型アカウントのためのdataSlice: 非常に大きなアカウント(例: 一部のプログラム状態アカウント)には、必要なバイトのみを取得して過剰なデータ転送を避けるためにdataSliceを使用してください。
  • エラーハンドリング: アカウントが見つからなかったり取得できなかった場合を示すnullエントリを応答のvalue配列で処理できるように準備してください。
getMultipleAccountsを活用することで、よりパフォーマンスが高くスケーラブルなSolanaアプリケーションを構築できます。

関連メソッド

getAccountInfo

単一のアカウントの詳細情報を取得する

getProgramAccounts

特定のプログラムが所有するすべてのアカウントを取得する