新着:HeliusがLight Protocolを買収
Solana Parsed Events APIとParsed Streamsの製品発表
ブログ/更新情報

Parsed Events APIとParsed Streamsのご紹介

Helius プロダクト担当XのKiryl MiranovichLinkedInのKiryl Miranovich
読了時間:5分

Parsed StreamsとParsed Events APIは、Heliusが提供する2つの新しいパース済みデータ製品です。オンチェーンIDLを基に3,600以上のプログラムをデコードし、完全にデコードされたSolanaトランザクションを返します。

  • 名前付きアカウント
  • 名前付き命令引数
  • 平易な言葉による要約
  • すべてのSOLおよびトークン転送

Parsed Streamsは、一致するトランザクションが確定した瞬間にWebSocket経由でプッシュします。

Parsed Events APIは、任意の署名または任意のアドレスの履歴について、同じデコード済みモデルをRESTとGraphQL経由でオンデマンドに返します。

どちらも現在オープンベータ版で、すべての有料プランで利用できます。

Solanaトランザクションの読み取りが難しいのはなぜですか?

標準のRPCノードにトランザクションで何が起きたかを問い合わせると、名前のないアカウントアドレスのリストと、不透明なbase58 blobとしての命令データが返されます。

これを「このウォレットはJupiterで1,500 SOLをPUMPにスワップした」という情報に変換するには、従来は次の作業が必要でした。

  1. トランザクションを取得し、アクセスしたすべてのプログラムを特定する
  2. 各プログラムのIDL(公開インターフェース)が存在する場合は、それを見つける
  3. そのIDLを使って命令データ(通常はBorsh)をデコードする
  4. 位置に基づくアカウントを役割に対応付ける:3番目のアドレスは権限者ですか、それとも宛先ですか?それを把握しているのはプログラムのインターフェースだけです
  5. 内部命令(CPI)を再帰的に処理する。スワップ内のトークン移動など、実際のアクティビティの大半はここで発生します
  6. 対象とするすべてのプログラムでこの作業を繰り返し、プログラムの新バージョンがリリースされるたびにデコーダーを更新する

たった1つの疑問に答えるまでに数週間のエンジニアリング作業が必要です。これはSolanaを使い始める際に直面する、特に険しい学習曲線の1つです。チェーン上のデータは公開されていますが、簡単には読み取れません。

そこで、こうした作業を不要にするサーバーサイドのデコードレイヤーを構築しました。

Parsed Eventsのレスポンスには何が含まれますか?

すべてのトランザクションは、HeliusのIDLカタログを通じてデコードされた状態で返されます。 

以下は、実際のJupiterスワップから要点だけを抜粋したものです。

コード
{
  "summary": {
    "type": "swap",
    "description": "GV6UUm… swapped 1500 SOL for 64672839.26195 PUMP via Jupiter",
    "parsedData": {
      "protocol": "jupiter",
      "in_amount": "1500000000000",
      "actual_out_amount": "64672839261950",
      "input_mint": "So11111111111111111111111111111111111111112",
      "output_mint": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn"
    }
  },
  "instructions": [
    {
      "programName": "jupiter",
      "instructionName": "shared_accounts_route_v2",
      "decoded": {
        "args": { "in_amount": "1500000000000", "slippage_bps": 2200 },
        "accounts": [
          { "name": "user_transfer_authority", "pubkey": "GV6UUm…", "isSigner": true },
          { "name": "source_mint", "pubkey": "So1111…" }
        ]
      }
    }
  ]
}

アカウントリストの3番目のアドレスが何を意味するのか推測する代わりに、"name": "user_transfer_authority"を読み取れます。 

引数もデコードされた状態で届きます。生のバイト列ではなく、"slippage_bps": 2200として取得できます。

また、トランザクションレベルのsummaryは、そのままユーザーに表示できます。

各結果には、手数料と手数料支払者、ネイティブSOL転送、SPLおよびToken-2022転送に加え、メタデータが利用可能な場合はデコードされたカスタムプログラムエラーも含まれます。 

カタログにないプログラムについては、命令が生データと生のアカウントにフォールバックするため、常に処理できる情報が得られます。

Parsed Streams:デコード済みトランザクションをプッシュ配信

Parsed Streamsは、確定したすべてのトランザクションを監視してデコードし、サーバーサイドで命令レベルのフィルターに一致したものをプッシュするWebSocketサービスです。

大量の生データを直接扱う必要も、デコーダーを保守する必要もありません。

フィルターは次の5つのフィールドで構成されます。

  1. programs
  2. instructionNames
  3. accounts(包含または名前付きロールで指定)
  4. includeCpi
  5. includeFailed

たとえば、「このウォレットに関係するすべてのJupiterルート命令」は次のように指定します。

コード
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "parsedTransactionSubscribe",
  "params": [
    {
      "programs": ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
      "instructionNames": ["route", "shared_accounts_route"]
    }
  ]
}

すべての通知には、デコード済みトランザクション全体に加え、フィルターに一致した命令を示すmatchedIndexesが含まれます。

Solanaプログラムの命令名を取得するにはどうすればよいですか?

命令名を推測すると、フィルターが何にも一致しないまま気付かないことがよくあります。Solanaプログラムの命令名を取得するには、任意のプログラムアドレスを指定してdescribeProgramを呼び出します。すると、マッチャーが照合する命令、イベント、アカウントロールが返されます。

コード
{
  "id": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
  "name": "jupiter",
  "instructions": ["route", "shared_accounts_route", "exact_out_route"],
  "events": ["SwapEvent"],
  "roles": ["user_transfer_authority", "destination_token_account"]
}

プログラムを検索し、名前をフィルターに追加してからサブスクライブします。 

Jupiterスワップを追跡するためのガイドでは、このワークフローを最初から最後まで説明しています。

Parsed Events API:トランザクションをオンデマンドでデコード

ライブデータではなく検索が必要な場合、Parsed Events APIはリクエストに応じて同じIDLカタログベースのデコードを適用します。

トランザクションのパースは署名を受け取り、デコードして返します。

パース済みトランザクション履歴は、アドレスの完全なデコード済み履歴をページ単位で取得し、新しいトランザクションから順に返します。

コード
curl -X POST "https://mainnet.helius-rpc.com/v1/parsed-events/transactions?api-key=YOUR_API_KEY" \
  -H "content-type: application/json" \
  -d '{"transactions": ["5xSKzM8bvpudE521jikHqASzMr23Ms4X4ieY3K8oFPFrJWCSSgYocJmHznrR8b12voDxKDH8ykdCLXSRrx6duVLH"]}'

どちらのメソッドもGraphQLで利用できるため、アプリに必要なパース済みフィールドだけを選択できます。

Parsed EventsとEnhanced Transaction APIの比較

Parsed EventsはEnhanced Transactions APIの後継です。 

Enhanced Transactionsがトランザクションを固定されたイベントタイプのリストに分類していたのに対し、Parsed EventsはIDLカタログを介して各命令をデコードします。認識されないプログラムに対してUNKNOWNを返すのではなく、生データにフォールバックします。

現在Enhanced Transactions APIを使用している場合は、移行ガイドで、すべてのエンドポイント、パラメーター、レスポンスフィールドの対応を確認できます。また、エージェントが移行を完了するために実行できるプロンプトも含まれています。

どのパースツールが適していますか?

目的使用する製品
サーバーサイドでフィルタリングされたデコード済みトランザクションをリアルタイムで受け取るParsed Streams
特定の署名をデコードする、またはアドレスの履歴をページ単位で取得するParsed Events API
クライアントサイドで制御できる生データストリームを使用し、processedトランザクションで最小のレイテンシを実現するLaserStream
生のトランザクション履歴と大規模なバックフィルを取得するgetTransactionsForAddress
ウォレットアドレスの、人が読み取れるトークンおよびネイティブSOL転送オブジェクトを取得するgetTransfersByAddress

2つの新製品は同じデコードエンジンを共有しているため、ストリーム経由でもREST呼び出し経由でも、トランザクションの形式は同じです。特に重要なのは、Parsed Eventsで履歴を使ってプロトタイプを作成し、パースコードを変更することなくParsed Streamsのライブデータへ切り替えられる点です。

はじめる

Parsed StreamsとParsed Events APIはオープンベータ版で、すべての有料プランで利用できます。Helius DashboardからAPIキーを取得してください。

接続するには、次のエンドポイントを使用します。

Parsed Streams: 

wss://fs-beta.helius-rpc.com/?api-key=YOUR_API_KEY

Parsed Events API: 

https://mainnet.helius-rpc.com/v1/parsed-events/...?api-key=YOUR_API_KEY

ガイド

Parsed Streamsクイックスタートでは、数分で最初のデコード済み通知を受け取れます。Parsed Eventsクイックスタートでは、最初の署名を同じようにパースできます。 

ご質問がある場合は、TelegramまたはDiscordでお問い合わせください。

Heliusを購読

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